Ви не увійшли.
Сторінки 1
Ситуация такая. Имеются чипы 24С08 (благополучно выпаяные с плат старых компьютерных мониторов). Подключил к Uno по I2C. Если использовать библиотеку Eeprom24C04_08_16-master.zip, то вообще никаких проблем с ними нет. Все пишется и без проблем читается.
Проблема следующая. При попытке обращаться к внешней памяти средствами стандартной библиотеки Wire.h, то никакого взаимодействия не выходит. Прописывал разные адреса и значения. Не записывает и не читает. Код приводу:
#include <Wire.h>
#define disk1 0x50 //Address of 24С08 eeprom chip
void setup(void)
{
Serial.begin(9600);
Wire.begin();
unsigned int address = 0;
writeEEPROM(disk1, address, 123);
Serial.print(readEEPROM(disk1, address), DEC);
}
void loop(){}
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data )
{
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();
delay(5);
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
Вскрывал библиотеку. Там код такого же плана)) Куда копать?
Неактивний
Ну и чем библиотека не устроила? Или захотелось секаса?
Ну и чем библиотека не устроила? Или захотелось секаса?
В какой-то степени да))) Познаю сию науку. Хотелось "напрямую" достучатся по I2C. И теперь не ясно где именно ошибка или хотя бы как ее выявить. Других девайсов с I2C в наличии нет, что бы попробовать к чему-то другому подключиться.
Неактивний
Попробуйте найти строку в которой зависает программа, например последовательно перемещая:
Serial.println("checkpoint");
Хотелось "напрямую" достучатся по I2C. И теперь не ясно где именно ошибка или хотя бы как ее выявить.
В таком случае я бы начал с простого
#include <Wire.h>
#define disk1 0x50 //Address of 24С08 eeprom chip
void setup(void)
{
Serial.begin(9600);
Wire.begin();
unsigned int address = 0;
writeEEPROM(disk1, address, 123);
delay(10);
Serial.print(readEEPROM(disk1, address), DEC);
}
void loop(){}
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data )
{
Wire.beginTransmission((byte)deviceaddress);
Wire.write((byte)(eeaddress));
Wire.write(data);
Wire.endTransmission();
delay(5);
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress )
{
byte rdata = 0xFF;
Wire.beginTransmission((byte)deviceaddress);
Wire.write((byte)(eeaddress));
Wire.endTransmission();
Wire.requestFrom((byte)deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
А потом бы уже разбирался с этими строками
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
что и где не работает
Неактивний
Благодарю всем за помощь. Технически проблема решилась, осталось только осознать более глубоко передачу адреса ячейки памяти. Как оказалось этот скетч таки пишет, но не то и не туда)) Я так понял он заточен под памяти с бОльшим объемом. Надеюсь поскорее доразбираться, чтобы внятно описать суть.
Неактивний
Если не напутал, то вот так:
1 Кбит - 2 Кбит
Wire.beginTransmission(deviceAddress);
Wire.write(addressCell);
Wire.write(data);
Wire.endTransmission();
4 Кбит - 16 Кбит
Wire.beginTransmission((byte)(deviceAddress | ((addressCell >> 8) & 0x07)));
Wire.write(addressCell & 0xFF);
Wire.write(data);
Wire.endTransmission();
32 Кбит - 256 Кбит
Wire.beginTransmission(deviceAddress);
Wire.write(addressCell >> 8);
Wire.write(addressCell & 0xFF);
Wire.write(data);
Wire.endTransmission();
Неактивний
А что стОит посмотреть даташит! Например 24с08 = 8К бит = 1К байт. Значит нужно 10 бит для адресации. Но адресный байт (word address) у всех (от 24с01 до 24с16) 8-ми битный, а тогда старшие 2 бита находятся в device address. Что открытым текстом расписано и разрисовано в даташите. Ужас.(
Сторінки 1