Реализация подчиненного интерфейса SSI на плате STM32

Я пытаюсь реализовать протокол SSI Slave на плате STM32. Поскольку платы STM32 не имеют интерфейса SSI, я использовал его интерфейс SPI в режиме Slave (режим только передачи). Главный SSI отправляет 24 тактовых сигнала, а подчиненный реагирует, отправляя свои данные (3 байта) через выводы MISO. Проблема, с которой я столкнулся, заключается в том, что данные всегда сдвигаются влево при каждом тактовом сигнале, исходящем от мастера. Например, предположим, что я постоянно отправляю 0x010101 с ведомого устройства.

  • При первой передаче мастер получает 0x010101
  • При второй передаче мастер получает 0x020202
  • При третьей передаче мастер получает 0x040404

Может кто-нибудь дать мне несколько советов о том, как решить эту проблему?


person Steve Mclaren    schedule 10.07.2020    source источник


Ответы (1)


Сдвиг данных при каждой передаче может происходить, когда ведомое устройство SPI распознает (неожиданный) дополнительный тактовый импульс. Если посмотреть на описание протокола SSI в Википедии, это действительно имеет смысл:  Однократная передача SSI  Для передачи N битов данных мастер излучает N тактовых циклов, за которыми следует еще один тактовый импульс, сигнализирующий об окончании передачи (так называемое время монофлопа - относится к исходному аппаратному обеспечению < / em> реализация интерфейса SSI). Поскольку протокол SPI / ведомое устройство SPI не знает об этом дополнительном тактовом импульсе, оно начинает выводить первый бит следующего байта данных, который, в свою очередь, не распознается мастером SSI. В результате это приводит к сдвигу битов данных, распознаваемых мастером SSI в следующем кадре SSI.

К сожалению, нелегко правильно обработать время монофлопа с ведомым устройством SPI. Чтобы справиться с дополнительным тактовым импульсом, мы могли бы попытаться установить размер кадра SPI на 25 бит на ведомой стороне. Поскольку оборудование STM32 поддерживает только размеры кадра SPI от 4 до 16 бит, единственный выбор - установить его на 5 бит. Это не очень удобно, поскольку нам нужно преобразовать 3-байтовые (24-битные) выходные данные в 5 блоков по 5 бит (24-битные выходные данные + 1 бит фиктивных данных), но это должно работать для нормальной передачи.

Однако все становится сложнее, если мы также хотим обрабатывать случаи множественные передачи и Правильное прерывание передачи. Нам нужно отслеживать тактовый сигнал, чтобы иметь возможность обнаруживать тайм-аут монофлопа. Это можно сделать с помощью аппаратного таймера STM32 с внешним триггером. Когда таймер истекает, нам нужно сбросить блок SPI (чтобы обработать прерванную передачу) и обновить выходное значение. Эта простая задача может быть довольно сложной, поскольку для нее требуется пара инструкций - требуется быстрый MCU в зависимости от тактовой частоты SSI.

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

ИМХО, лучшее решение - использовать небольшую (недорогую) FPGA для реализации подчиненного устройства SSI и позволить MCU передавать ему данные через традиционный интерфейс SPI.

person Blue    schedule 11.07.2020