¿Algún ejemplo de un protocolo basado en SPI con una suma de verificación?

Tengo en mente una aplicación en la que necesito comunicarme vía SPI con una FPGA. Tanto el FPGA como el microcontrolador están bajo nuestro control, por lo que tengo la flexibilidad de definir el protocolo como mejor me parezca. Sin embargo, me preguntaba si hay algún buen ejemplo de uso que funcione bien.

Esto es lo que estaba pensando. (orientado a bytes)

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)

¿Es esto viable? ¿Hay mejores ejemplos por ahí?

EDIT1: algunas aclaraciones sobre los requisitos:

  • El microcontrolador es para leer y escribir pequeños bloques de datos hacia/desde la FPGA.
  • La FPGA admitirá operaciones de lectura/escritura en registros.
  • Los registros pueden tener muchos bytes de profundidad (como un fifo) o incrementarse automáticamente (el siguiente byte de lectura o escritura proviene del siguiente registro).
  • Me gustaría que la operación incluyendo el checksum/ack se produzca en una sola transmisión.
  • Me gustaría que esto tenga una sobrecarga baja, algunas operaciones obtendrán o publicarán de 5 a 10 bytes. El más grande podría ser 127 o 64.

Respuestas (2)

Echaría un vistazo a Modbus y HDLC Asynchronous framing para ver ejemplos de cómo transferir paquetes a través de un bus serie. También echaría un vistazo a esta pregunta Protocolo de comunicación punto a punto en serie simple en Stack Overflow .

Editar:

Dado que necesita gastos generales bajos, simplemente haría lo que está haciendo. Utilice la selección de chip para activar el paquete e incluir la longitud y la suma de comprobación. Probablemente me mantendría alejado de CRC8 ya que sus datos se basan en bytes, no en bits. Revisé varios dispositivos de memoria SPI y ninguno de los que miré incluía una suma de verificación.

Un ejemplo de una suma de verificación es la suma de verificación UDP . Para su ejemplo, eso se traduciría en el complemento de la suma mod 256.

Para el reconocimiento o la devolución del estado del esclavo, puede aprovechar el hecho de que SPI es dúplex completo y, en lugar de simplemente enviar nada, el esclavo puede enviar un byte de estado y en ese byte puede usar un bit para marcar errores de suma de comprobación. El estado también puede incluir un bit de ocupado para que pueda usar esto para sondear al esclavo para ver cuándo está listo para otro comando.

Estoy familiarizado con esos protocolos. SPI no comparte las mismas características que RS485/RS232, etc. SPI es síncrono y está restringido a ser maestro/esclavo.... el esclavo no tiene control sobre cuántos bytes envía o intenta recibir el maestro. Además, este protocolo debe ser ligero, chip a chip. Modbus y HDLC son de dispositivo a dispositivo.
Gracias, actualmente estoy usando la misma técnica sin len y chgecksum. Es básicamente muy similar a la mayoría de los otros usos que he visto de SPI.

Creo que el modo SPI de la tarjeta SD tiene una suma de verificación.

Las tarjetas SD tienen sumas de verificación para algunas partes del protocolo, pero generalmente se ignoran en el modo SPI. Solo el primer comando (que pone la tarjeta en modo SPI) debe tener una suma de verificación válida.
@reemrevnivek, tienes razón. Estoy buscando un protocolo que me permita realizar transacciones grandes y pequeñas con la FPGA y estar seguro de que están libres de errores. (lo que me hace pensar que necesitaría una forma para que el maestro supiera que el esclavo falló en su verificación. La sobrecarga se acumulará si necesito un reconocimiento final del esclavo ... Hmmm ...)
Construí una interfaz I2C personalizada similar con una suma de verificación hace años. Ahora, comenzando un nuevo proyecto SPI, también me pregunto qué ejemplos podría extraer. WRT al maestro sabiendo sobre la falla, podría incluir bits útiles en los primeros 2 bytes esclavos que indican si una transacción pasada falló CRC