comunicación SPI

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

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

Entonces, las preguntas son:

  1. ¿El dispositivo esclavo recibe 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 SS es bajo? He notado 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 prevenirlo? ¿Configurar MOSI en alta impedancia es suficiente (configurando el indicador TALK en 0)?

* Bajo basura, me refiero a lo que sea que esté en LSB. Dado que configuré el tamaño de la palabra de datos en 8 bits, esperaba que el DSP enviara solo palabras de datos de 8 bits desde el registro SPIDAT.

Respuestas (2)

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

Un FIFO nunca necesita estar lleno. Aceptará un nuevo byte de datos que el maestro SPI cambie mientras no esté lleno. Siempre que haya datos en el FIFO, leerá. Cuando el FIFO está vacío, una lectura debe devolver todos ceros.

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

edite su comentario
No hay un estándar para lo que debería suceder si el maestro registra nuevos datos cuando no hay ninguno disponible; SPI no se ocupa de su contenido de datos, es básicamente solo un registro de desplazamiento. Lo más sensato es enviar ceros, pero también podrías estar enviando de nuevo los últimos datos del FIFO. Tu protocolo debe evitar este tipo de situaciones. ¿El maestro realmente espera leer datos, o solo está enviando, ignorando los datos que ingresan? Si espera datos, ¿por qué no está allí?

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

  • Los datos deben justificarse 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 transmisiones anteriores que se hayan desplazado a la izquierda.

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

Mala redacción. Debajo de "FIFO completo" realmente quise decir "FIFO no vacío". ¿Y qué sucede después de que envía todas las palabras de datos de TX FIFO? Además, si configuro las palabras de datos para que sean de 8 bits, ¿está enviando 8 bits desde SPIDAT?
@BЈовић - Actualicé mi respuesta.
Los datos no están allí para enviarse durante el proceso de copia en el búfer de datos. Por lo tanto, supongo que debería activar la interrupción TX FIFO no cuando el TX FIFO está vacío, sino cuando está bajo (quedan 2-4 palabras por enviar).
@BЈовић - Sí, puede establecer el nivel de interrupción con los bits TXFFST, pero ¿eso ayudaría? Si tuviera datos, ya los habría escrito en FIFO, ¿no es así?
En realidad, con TXFFIL :) TX FIFO puede contener solo 16 palabras de datos, lo que significa que debe completar cuando el nivel de TX FIFO es bajo. Lleva algún tiempo llenar este búfer, durante el cual veo una basura en la línea MISO
¿Por qué sigue marcando si no tiene datos listos para enviar?
@Chris: ¡está en modo esclavo, no puede evitarlo! :-)

Cada vez que el maestro registre una palabra de datos (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 aún 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 modo que incluso cuando el dispositivo en sí esté "ocupado", su hardware SPI siempre estará listo para intercambiar datos o, de lo contrario, estará siempre listo para tener el estado de solicitud del maestro al alimentarlo con un flanco descendente. /CS y marcando 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", se garantiza que estará 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 muchas implementaciones de esclavos SPI de 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 cable de protocolo de enlace 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 no es 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" tan pronto como no estén listos, incluso sin la intervención de la CPU, pero nunca he visto un esclavo SPI que lo haya hecho.

Comentarios muy útiles. ¿Eso significa que incluso si el maestro solo quiere leer algunos datos de un esclavo, aún necesita enviar alguna palabra ficticia, o la selección del chip no se reducirá?
@PengheGeng: un dispositivo esclavo no puede enviar ningún dato sin pulsos de reloj del maestro, y la mayoría de los dispositivos maestros no enviarán ningún pulso de reloj a menos que se les pida que transmitan datos (las únicas excepciones que conozco son dispositivos que puede configurarse para un modo de solo recepción compatible con DMA que enviará pulsos de reloj cada vez que el búfer de recepción esté vacío).