Сдвиг данных при каждой передаче может происходить, когда ведомое устройство SPI распознает (неожиданный) дополнительный тактовый импульс. Если посмотреть на описание протокола 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