comunicación SPI

6

Estoy usando el DSP 28335 de TI para leer los sensores de datos que usan I2C, y SPI para enviar estos datos al FPGA. El dispositivo está configurado para usar SPI en el modo esclavo con palabras de datos de 8 bits, y yo uso las interrupciones.

He leído página wiki SPI , y varios otros documentos (incluido página de referencia de TI para SPI ), pero no he entendido la comunicación de SPI.

Entonces, las preguntas son:

  1. ¿Está el dispositivo esclavo recibiendo todo el tiempo mientras el SS (selección de esclavo) está bajo?
  2. ¿el búfer TX FIFO siempre debe estar no vacío cuando el SS es bajo? Me he dado cuenta de que cuando el búfer TX FIFO se vacía, se envía algo de basura * .
  3. Si la respuesta a 2. es , ¿cómo evitarlo? ¿Es suficiente establecer MOSI en alta impedancia (al establecer el indicador TALK en 0)?

* Bajo basura, me refiero a lo que sea en LSB. Como establecí que el tamaño de la palabra de datos era de 8 bits, esperaba que el DSP enviara solo palabras de datos de 8 bits desde el registro SPIDAT.

    
pregunta BЈовић

2 respuestas

5

Sí, el esclavo seguirá cambiando un bit de datos hacia adentro y hacia afuera en cada pulso de reloj mientras el SS esté bajo. Cuando SS sube, los datos que se encuentran en el registro de desplazamiento en ese momento se bloquearán.

Un FIFO nunca necesita estar lleno. Aceptará un nuevo byte de datos en el que el maestro SPI se desplace mientras no esté lleno. Mientras haya datos en el FIFO, leerá. Cuando la FIFO está vacía, una lectura de ella debería devolver todos los ceros.

Le sugiero que intente usar el SPI en modo no FIFO. El modo FIFO se desactiva al establecer el bit SPIFFEN en 0 en el registro SPIFFTX.

editar re tu comentario
No hay un estándar para lo que debería suceder si el maestro registra datos nuevos cuando no hay ninguno disponible; SPI no se ocupa de usted con el contenido de sus datos, es básicamente un registro de desplazamiento. Lo más sensato es enviar ceros, pero también podría estar enviando los últimos datos de FIFO nuevamente. Su protocolo debe evitar este tipo de situación. ¿El maestro realmente espera leer datos, o solo está enviando, ignorando los datos que llegan? Si espera datos, ¿por qué no está allí?

Sobre la sección de formato de 8 bits 1.4.2 en la página 17 dice:

  • Los datos deben estar justificados a la izquierda cuando se escriben en SPIDAT y SPITXBUF.
  • Los datos leídos de SPIRXBUF están justificados a la derecha.
  • SPIRXBUF contiene el carácter recibido más recientemente, justificado a la derecha, más cualquier bit que quede de la (s) transmisión (es) anterior (s) que se han desplazado a la izquierda.

Esto indica que se utilizan los registros de desplazamiento de 16 bits completos, pero que solo se generan 8 pulsos de reloj.

    
respondido por el stevenvh
5

Cada vez que el maestro registra el valor de los datos de una palabra (la longitud normal de la palabra es de 8 bits, pero algunos maestros son programables), se enviará una palabra de datos y se recibirá una palabra de datos. Si el esclavo está "listo" para el intercambio de datos, genial. Si no, el maestro todavía enviará una palabra y recibirá una palabra; lo que sucederá como resultado depende del diseño del esclavo.

Un dispositivo esclavo de hardware típico se diseñará de tal manera que incluso cuando el dispositivo en sí esté "ocupado", su hardware SPI siempre estará listo para intercambiar datos, o siempre estará listo para tener el estado de solicitud maestra al proporcionarle un flanco descendente en / CS y sincronización en algún comando de solicitud de estado. Si el dispositivo está ocupado, es posible que el hardware no pueda hacer nada más que enviar una respuesta "Estoy ocupado", pero si el dispositivo envía una respuesta que dice "No estoy ocupado", es probable que esté listo para intercambiar cierta cantidad de datos sin más demora (la cantidad exacta de datos dependerá del dispositivo, y posiblemente de su estado informado). Por ejemplo, un chip de memoria SPI podría diseñarse de modo que una vez que informe que no está ocupado, siempre estará listo para enviar o recibir una página de datos.

Tenga en cuenta que las implementaciones esclavas SPI de muchos microcontroladores se quedan cortas en este sentido. SPI tiene una asociación muy rígida de bytes de datos entrantes y salientes; algunos controladores requieren que la CPU lea cada byte entrante y determine la respuesta entre el último reloj de un byte y el primer reloj del siguiente, y envíe datos no especificados si la CPU no reacciona a tiempo. Algunos otros son mejores de varias maneras, pero muchos requieren efectivamente que el maestro adivine cuándo el esclavo estará listo para cada byte, o bien use otro cable para ese propósito. Incluso las implementaciones que usan otro cable pueden ser problemáticas, ya que si el protocolo de intercambio de informes informa "listo", el maestro envía un byte, y el cable continúa informando "listo", puede no estar claro si el esclavo todavía está listo o si el esclavo está listo. esclavo no está listo, pero no ha llegado a configurar su cable para indicar "no listo". Los UART a menudo incluyen una lógica de control de flujo de hardware que dejará de afirmar una línea "lista" en cuanto no esté preparada, incluso sin la intervención de la CPU, pero nunca he visto un esclavo SPI que lo haya hecho.

    
respondido por el supercat

Lea otras preguntas en las etiquetas