Привет!
Есть у меня один проект на pic24, который использует EEPROM 24LC256.
И все бы хорошо, но иногда данные записываются некорректно.
Чаще всего такое происходит при записи 4х байтовых чисел, хотя они в основном и пишутся, так что не удивительно. И чаще всего повреждается последний байт числа. Повреждается примерно один из нескольких десятков байт.
Память висит на довольно короткой шине ~1.5 см от контроллера, подтяжки на линиях 4.7кОм. С памятью работаю на частоте 400 кГц, снижение частоты не дало никакого эффекта. Повторяется бага на нескольких одинаковых платах. Закономерности выявить не удалось. Выяснил только что мой код пытается записать правильные данные, то есть повреждаются они именно в процессе записи.
Привожу фрагмент кода для роботы с eeprom:
unsigned char ee_adress(int adr)
{
unsigned char cmd;
cmd = 0xA0; // | ((adr >> 7)&0xE);
while (1)
{
StartI2C(); IdleI2C();
// send command and address msb(3)
MasterWriteI2C(cmd + WRITE_CMD); IdleI2C();
if (I2CSTATbits.ACKSTAT == 0)
break;
StopI2C(); IdleI2C();
} // while waiting for ACK
// 3. send address lsb
MasterWriteI2C(adr >> 8); IdleI2C();
MasterWriteI2C(adr & 0xFF); IdleI2C();
// 4. exit returning the cmd byte
return cmd;
}
void ee_wrDword(int adr, unsigned long data)
{
// 1. select address
ee_adress(adr);
// 2. stream data out
MasterWriteI2C((data >> 24) & 0xFF); IdleI2C();
MasterWriteI2C((data >> 16) & 0xFF); IdleI2C();
MasterWriteI2C((data >> 8 ) & 0xFF); IdleI2C();
MasterWriteI2C((data >> 0 ) & 0xFF); IdleI2C();
// 3. terminate the command sequence
StopI2C(); IdleI2C();
}
Может кто то сталкивался с подобным? В какую сторону копать? Я уже все на что фантазии хватило перепробовал.
Раздел: Периферия и внешние устройства