I2C не работает между LPC824 и MMA8453Q - PullRequest
0 голосов
/ 16 октября 2019

Для проекта я использую микроконтроллер LPC824 от NXP и хочу считывать данные с акселерометра через I2C. Этот акселерометр - MMA8453Q. Глядя в таблицу данных акселерометра, я вижу следующее:

I2C timing

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

Адрес, который я должен написать, следующий: adress table

регистр, который я выбрал длятеперь это регистр 0x0D, который является регистром «Кто я», его всегда следует читать как 0x3A.

Для людей, знакомых с примерами NXP, я опирался на один из них. Это код, который у меня есть atm:

*txData = 0x0D;
        SetupXferRecAndExecute(0x1C, txData, 1, rxData, 0);
        SetupXferRecAndExecute(0x1C, txData, 0, rxData, 1);

, и вот как он выглядит в области видимости scope image

Итак, как я вижу, я отправляюАдрес устройства дважды, сначала я записываю адрес регистра, а затем хочу его прочитать, но он возвращает 0x00. Может кто-нибудь, пожалуйста, помогите мне? Заранее спасибо!

1 Ответ

0 голосов
/ 16 октября 2019

Мой ответ основан на тех листах данных:

LPC82X является ведущима MMA8453Q - это ведомое устройство.

В зависимости от того, установлен ли на 7-й контакт ведомого устройства высокий (SA0 = 1) или низкий (SA0 = 0), ваш 7-битный адрес подчиненного устройства будет либо 0x1D, либо 0x1C. Вместе с битом read (1) или write (0) конечный 8-битный адрес будет таким же, как записано в таблице, которую вы разместили в своем комментарии. Для дальнейшего примера, давайте предположим, что SA0 установлен на низкий уровень, означает, что полный 8-битный адрес ведомого устройства равен 0x3B для чтения и 0x3A для записи.

Давайте предположим, что вы хотите считать однобайтовый регистр 0x17,это регистр источника свободного падения / движения.

Теперь последовательность сообщений (которую вы также указали в своем посте) выглядит следующим образом:

  1. Мастер посылает: Стартовый сигнал
  2. Мастер отправляет: адрес ведомого + бит записи (в нашем случае 0x3A)
  3. Ведомые отправляет: ACK (выполняется аппаратно)
  4. Мастер отправляет: 0x17 (как мы и предполагалиинтересует содержимое этого регистра)
  5. Ведомые отправляет: ACK (выполняется аппаратно)
  6. Мастер отправляет: повторный стартовый сигнал
  7. Мастер отправляет: Адрес ведомого + бит чтения(в нашем случае 0x3B)
  8. Slave отправляет: ACK (выполняется аппаратно)
  9. Slave отправляет: содержимое регистра 0x17
  10. Master посылает: NACK
  11. Мастер посылает: Стоп сигнал

Если вы хотите зачитать повторноГистеры, подобные MMA8453Q (такие как OUT_X_MSB / LSB), которые содержат два байта, ваша последовательность будет следующей:

  1. Основные посылки: Стартовый сигнал
  2. Основные посылки: Адрес ведомого + Запись-Бит (в нашем случае 0x3A)
  3. Slave отправляет: ACK (выполняется аппаратно)
  4. Мастер отправляет: 0x01 (как мы и предполагали, вас интересует содержимое этого регистра)
  5. Ведомые отправляют: ACK (выполняется аппаратно)
  6. Мастер отправляет: повторный сигнал запуска
  7. Мастер отправляет: Адрес ведомого + бит чтения (в нашем случае 0x3B)
  8. Slave отправляет: ACK (выполняется аппаратно)
  9. Slave отправляет: MSB регистра 0x01
  10. Master передает: ACK
  11. Slave отправляет: LSB регистра 0x01
  12. Мастер отправляет: NACK
  13. Ведомый отправляет: сигнал остановки

Мастеру важно заранее знать, сколько байтов будет получено при запросе данных из определенного регистра. раба. Только с этим знанием мастер может отправить надлежащее количество ACK перед отправкой последнего NACK, за которым следует сигнал остановки.

...