I2C прочитал - нужен повторный запуск?

Сомневаюсь относительно операции чтения в I2C, бит-бэнгинг. Протокол, которому я следую, читается следующим образом: Начальный адрес ведомого с записью-подтверждением-регистром loc-ack-stop. ...... Начальный адрес ведомого с подтверждением чтения-остановкой чтения данных. Я читаю данные как FFh, что неверно. Я сомневаюсь, что перед отправкой другого запуска мне нужно отправить остановку или можно продолжить другой запуск для чтения данных без остановки, что на самом деле является повторным запуском. Имеет ли значение отправка стопового бита или нет. Также может кто-нибудь сказать, в чем может быть возможная причина, если прочитанные данные FFh. Но я могу гарантировать, что операция записи прошла успешно, после того, как я увидел снимок прицела. Пожалуйста, направь меня.

Спасибо


i2c
person user123456    schedule 27.06.2015    source источник
comment
Пожалуйста, ответьте на любой вопрос.   -  person user123456    schedule 28.06.2015
comment
Это зависит от ведомого устройства, с которым вы разговариваете. Многие устройства требуют повторного ПУСКА (без СТОПа) для чтения регистров: запись номера регистра, повторный ПУСК, чтение данных. Мой опыт показывает, что с некоторыми устройствами он будет работать нормально с промежуточным STOP, в то время как другие требуют повторного запуска для правильной работы внутреннего конечного автомата. Вам необходимо прочитать технический паспорт.   -  person DoxyLover    schedule 29.06.2015
comment
хорошо, спасибо .. В моем техническом описании сказано, что перед запуском следует указать СТОП, но это не работает. Попробую с повторным запуском.   -  person user123456    schedule 29.06.2015
comment
Какое у вас рабское устройство? Пожалуйста, дайте ссылку на таблицу.   -  person DoxyLover    schedule 29.06.2015


Ответы (2)


Протокол i2c работает так

WRITE:
  1. отправить СТАРТ
  2. записать адрес ведомого с последним битом как WRITE ACCESS (0)
  3. напишите подадрес: обычно это адрес регистра, куда писать; если не применимо, перейдите к 4.
  4. записывать данные
  5. отправить СТОП

На каждый байт, который вы записываете на ведомое устройство, следует отвечать ACK, если операция прошла успешно.

READ:
  1. отправить СТАРТ
  2. записать адрес ведомого с последним битом как WRITE ACCESS (0)
  3. написать подадрес: обычно это адрес регистра, из которого вы читаете
  4. отправить СТАРТ (это второе условие запуска - перезапуск)
  5. записать адрес ведомого с последним битом как READ ACCESS (1)
  6. читать данные
  7. отправить СТОП

На все операции записи и чтения (кроме последнего чтения) в случае успеха отправляется ACK.

Таким образом, в случае перезапуска вы не отправляете второй Stop.

Что касается результата чтения 0xFF, вам необходимо проверить таблицу данных устройства, но некоторые вернут это значение, если данные, которые вы пытаетесь прочитать, еще недоступны!

Надеюсь это поможет.

person Pandrei    schedule 08.07.2015

У меня была эта проблема, и я нашел причину: если вы все время получаете FFh при чтении, вам не хватает повторного запуска.

person MILAD MO    schedule 18.04.2018