Здравствуйте.
Возникла необходимость записывать данные в EEPROM 24LC16B. Для реализации интерфейса I2C взял исходник из примеров от HI-TECH-а, предварительно убрав некоторые ф-ции и подкорректировав под PIC16F690 (исправил номера портов и добавил ф-цию настройки SSP). Чтение и запись данных из/в EEPROM осуществляется с помощью следующих ф-ций:
Код
void WriteI2CEEPROM(unsigned char data)
{
StartI2C();
SendByteI2C(0xA0 | (EEPROMBlock << 1));
I2CReadAck();
SendByteI2C(EEPROMAddr);
I2CReadAck();
SendByteI2C(data);
I2CReadAck();
StopI2C();
}
//чтение данных из EEPROM
int ReadI2CEEPROM(void)
{
int data = -1;
StartI2C();
SendByteI2C(0xA0 | (EEPROMBlock << 1));
I2CReadAck();
SendByteI2C(EEPROMAddr);
I2CReadAck();
StartI2C();
SendByteI2C(0xA0 | (EEPROMBlock << 1) | 0x01);
I2CReadAck();
data = ReadByteI2C();
StopI2C();
return data;
}
Далее в основной программе пытаюсь записать данные в EEPROM и прочить их:
Код
...
EEPROMAddr = 0x04; //адрес для записи данных
EEPROMBlock = 0;
WriteI2CEEPROM(21);
DelayMs(10); //задержка на время записи данных
EEPROMAddr = 0x04; //адрес для чтения данных
EEPROMBlock = 0;
IntNumber = ReadI2CEEPROM();
...
При выполении кода, в IntNumber все время получаю число 255. Однако если вызвать несколько раз ф-цию WriteI2CEEPROM(21) (точное число раз не скажу, т.к. ф-цию вызывал в основном цикле программы для проверки правильности передачи данных с помощью осциллографа), то данные все ж таки в EEPROM записывают и их можно прочитать.
В чем может быть проблема?