В настоящее время я работаю над проектом I2C EEPROM, использующим битовые удары для управления линиями SDA и SCL.
Моя функция чтения работает нормально, но всякий раз, когда я пишу какой-либо байт с ведущей «1», я всегда читаю FF назад; даже если байт был запрограммирован с чем-то еще раньше. Ведущий «0» идеален. Это не моя рутина чтения; как я вижу по области, он возвращает FF.
Я ищу предложения о том, почему это может быть. Есть ли очевидное, что я мог пропустить, что может вызвать проблемы? [Я не могу опубликовать код - компания конфиденциальна ... :(]
Каждая форма волны, на которую я смотрю, точно соответствует спецификации. Я отделяю EEPROM. Мои подтягивания 2,2 к, так что в пределах спецификации. Я работаю на частоте около 500 Гц в этом прототипе. Чип отправляет ACK на каждый из моих байтов, чтобы он их распознал. Но это просто не работает ...
Я использую микрочип 24LC256 .
Упрощенный алгоритм записи для одного байта:
wait
SDA low
SCL low
wait
for each bit
if bit is set: SDA high
if bit is unset: SDA low
wait
SCL high
wait
wait
SCL low
wait
wait
SDA high
SCL high
wait
wait
check ACK status
SDA low
SCL low
wait
return ACK status
Упрощенный алгоритм чтения для одного байта:
wait
SCL low
SDA high
for each bit (8 bits)
SCL high
wait
wait
SCL low
wait
check and store received bit
wait
do a NACK or ACK depending on if it is the last byte