Любые примеры протокола на основе SPI с контрольной суммой?

У меня есть приложение, в котором мне нужно общаться через SPI с FPGA. И FPGA, и микроконтроллер находятся под нашим контролем, поэтому у меня есть возможность определить протокол по своему усмотрению. Тем не менее, мне было интересно, есть ли какие-нибудь хорошие примеры использования, которые хорошо работают.

Вот о чем я думал. (байт-ориентированный)

Master: <REG><WR+LEN><MSTR_DATA><CHK>
Slave : < 0 ><  0   ><SLAV_DATA><CHK>

REG : register within FPGA to read or write
WR  : read / write bit
LEN : 7 bit payload length (not including REG,WR+LEN or CHK)
MSTR: master data if write mode.
SLAV: slave data if read mode.
MCHK: 8 bit checksum of MSTR_DATA (by master), (CRC8, XOR, mod 256 etc)
SCHK: 8 bit checksum of SLAV_DATA (by slave ), (CRC8, XOR, mod 256 etc)

Это работоспособно? Есть ли лучшие примеры?

EDIT1: некоторые пояснения по требованиям:

  • Микроконтроллер должен считывать и записывать небольшие блоки данных в/из ПЛИС.
  • FPGA будет поддерживать операции чтения/записи в регистры.
  • Регистры могут быть многобайтовыми (например, fifo) или автоинкрементными (следующий байт чтения или записи происходит из следующего регистра).
  • Я хотел бы, чтобы операция, включая контрольную сумму/подтверждение, происходила в одной передаче.
  • Я бы хотел, чтобы это имело низкие накладные расходы, некоторые операции будут извлекать или отправлять 5-10 байтов. Самый большой может быть 127 или 64.

Ответы (2)

Я бы посмотрел Modbus и асинхронное кадрирование HDLC для примеров того, как передавать пакеты по последовательной шине. Я бы также посмотрел на этот вопрос . Простой последовательный протокол связи «точка-точка » над Stack Overflow .

Редактировать:

Поскольку вам нужны низкие накладные расходы, я бы просто делал то, что вы делаете. Используйте Chip select для блокировки пакета и включения длины и контрольной суммы. Я бы, вероятно, держался подальше от CRC8, поскольку ваши данные основаны на байтах, а не на битах. Я проверил несколько устройств памяти SPI, и ни одно из них не содержало контрольной суммы.

Одним из примеров контрольной суммы является контрольная сумма UDP . Для вашего примера это будет означать дополнение к модулю суммы 256.

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

Я знаком с этими протоколами. SPI не обладает теми же характеристиками, что и RS485/RS232 и т. д. SPI является синхронным и может быть главным/ведомым... подчиненное устройство не контролирует, сколько байтов отправляет или пытается получить мастер. Кроме того, этот протокол должен быть легковесным, чип к чипу. Modbus и HDLC являются устройством для устройства.
Спасибо, сейчас я использую ту же технику без len и chgecksum. В основном это очень похоже на большинство других применений SPI, которые я видел.

Я считаю, что режим SPI SD-карты имеет контрольную сумму.

SD-карты имеют контрольные суммы для некоторых частей протокола, но обычно они игнорируются в режиме SPI. Только первая команда (которая переводит карту в режим SPI) должна иметь действительную контрольную сумму.
@reemrevnivek, ты прав. Я ищу протокол, который позволит мне выполнять большие и малые транзакции с FPGA и быть уверенным, что они безошибочны. (что заставляет меня думать, что мне нужен способ, чтобы мастер знал, что подчиненный не прошел проверку. Накладные расходы будут складываться, если мне нужно окончательное подтверждение подчиненного... Хммм....)
Я построил аналогичный пользовательский интерфейс I2C с контрольной суммой несколько лет назад. Теперь, начиная новый проект SPI, мне также интересно, какие примеры я мог бы извлечь из. WRT мастеру, зная об ошибке, вы можете вставить полезные биты в первые 2 подчиненных байта, указывающие, не прошла ли прошлая транзакция CRC.