Данные ведомого SPI сдвинуты на 4 бита

Я использую чип nRF52832, подключенный к модулю DW1000. Проблема в том, что при запросе данных от DW1000 отсутствует первый байт. Чип должен отправить 0xDECA0130, но вместо этого я получаю 0xCA0130FF. Когда я увеличиваю буфер приема, появляется отсутствующий 0xDE (передача начинается с младшего байта). У меня вопрос, как и почему это происходит.

Конфигурация

Конфигурация SPI была выполнена в соответствии с таблицей данных DW1000 с использованием драйвера nRF SPI. Это включает в себя

  • Частота SPI по умолчанию установлена ​​на 1 МГц
  • Контакт выбора микросхемы SPI настроен как активный НИЗКИЙ
  • с использованием SPI Mode 0
  • MSB первая передача

Перед началом обмена данными DW1000 сбрасывается путем подтягивания его вывода сброса к низкому уровню и удерживается на низком уровне в течение достаточно длительного времени, прежде чем его отпустить. После сброса мастер ждет некоторое время, чтобы модуль загрузился. После этого первым делом считывается указанное значение как 32-битное значение регистра.

Настройки nRF

Настройки nRF включают

  • SPI и SPI0 включены
  • SPI0 easyDMA отключен
  • чтение значения включает nrf_drv_spi_transfer с указанной конфигурацией и длиной буфера 4 байта

Предпринятые шаги

Я уже пробовал следующее, но без решения проблемы:

  • Изменение частоты SPI
  • Изменение режима SPI *
  • Увеличенное время ожидания после сброса
  • Увеличенное время ожидания между передачами
  • Изменение конфигурации MISO Pull-Up *
  • Ручной выбор чипа (включая конфигурацию Pull-Up *)

Шаги, обозначенные (*), я знаю, что они не должны решить проблему.

К сожалению, это встроенное устройство, поэтому я не могу получить доступ к контактам CLK и MISO для подключения к осциллографу.

Я ценю любой вклад по этому поводу.


person flashingx    schedule 18.03.2018    source источник


Ответы (1)


Таким образом, очевидно, проблема заключается в том, как ведомое устройство SPI отвечает на конкретный запрос. Поскольку SPI является синхронным протоколом, ведомое устройство должно передавать данные начиная с первого тактового цикла и далее. Поскольку он не знает, что отправить, прежде чем будет передан хотя бы первый байт (если он настроен таким образом), он должен что-то отправить, поэтому мастер должен игнорировать (по крайней мере) этот первый передаваемый символ. Если длина запроса чтения известна, передача должна быть на один байт длиннее, чем сами запрошенные данные.

person flashingx    schedule 20.03.2018