Реализация подчиненного интерфейса SSI на плате STM32 - PullRequest
0 голосов
/ 10 июля 2020

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

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

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

1 Ответ

0 голосов
/ 11 июля 2020

Сдвиг данных при каждой передаче может происходить, когда ведомое устройство SPI распознает (неожиданный) дополнительный тактовый импульс. Глядя на описание протокола SSI в Википедии, это действительно имеет смысл: SSI single transmission In order to transmit N bits of data the master emits N clock cycles, followed by another clock pulse to signal the end of the transfer (so-called "Monoflop Time" - referring to the original hardware implementation of the SSI interface). Since the SPI protocol / SPI slave does not know about this additional clock pulse, it begins to output the first bit of the next data byte, which is in turn not recognized by the SSI master. As a result this leads to a shift in the data bits recognized by the SSI master on the next SSI frame.

Unfortunately, it is not easy to handle the Monoflop time correctly with the SPI slave. In order to deal with the additional clock pulse, we could try to set the SPI frame size to 25 bits on the slave side. Since the STM32 hardware only supports SPI frame sizes between 4 bit and 16 bit, the only choice is to set it to 5 bit. This is not very convenient, since we need to convert the 3 byte (24 bit) output data into 5 blocks of 5 bit (24 bit output data + 1 bit dummy data), but it should work for a "normal" transfer.

Things get more complicated though, if we also want to handle the cases "Множественные передачи" и "Прерывание передачи" правильно. Нам нужно отслеживать тактовый сигнал, чтобы иметь возможность обнаруживать тайм-аут монофлопа. Это можно сделать с помощью аппаратного таймера STM32 с внешним триггером. Когда таймер истекает, нам нужно сбросить блок SPI (чтобы обработать прерванную передачу) и обновить выходное значение. Эта «простая» задача может быть довольно сложной, так как для нее требуется пара инструкций, требующих быстрого MCU в зависимости от тактовой частоты SSI. решение. Но для этого также требуется быстрый MCU, чтобы правильно обрабатывать быстрые часы SSI.

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

...