Cómo leer datos usando Arduino SPI

en la hoja de datos, se dice que debo aplicar 32 relojes seriales para obtener los 32 bits de datos. ¿Cómo puedo ¿Programa esto es Arduino?

Comentarios

  • Te sugiero que abras los ejemplos de la biblioteca SPI y los revises. De todos modos, el código debería ser byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); y encontrarás en result los 32 bits que necesitas
  • Ya lo hice, pero el chip de energía Estoy usando es STPM10 y sugiere que debería usar SPI síncrono simplex donde el MOSI no está conectado. Solo hay un diagrama de tiempo para cambiar de bytes de lectura y bytes de escritura. Cuando usé SPI.transfer (), los datos no son estable y no creo que sea confiable
  • ¿Cómo se dice que no es confiable? El periférico es dúplex completo y, según la forma en que funciona, la única forma de recibir datos es enviando datos ficticios. Si MOSI es no conectado, bueno, no ‘ no importa ; Sin embargo, tenga en cuenta que no puede ‘ t usar el pin MOSI para otras tareas. Por cierto, ¿se acordó de configurar correctamente el pin de selección esclavo del otro periférico? ¿Usaste el pin SS en la placa arduino u otro?

Responder

Llamas a SPI.transfer() cuatro veces, cada vez guardando el valor devuelto en una variable después del cambio de bits adecuado.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Supongo que es el menos significativo primero se recibe el byte. Asegúrese de que el modo SPI sea el correcto, como se indica en su hoja de datos.

Si el esclavo «no puede manejar ser anulado entre bytes (que es lo que SPI.transfer() hará al final de la transacción), entonces puede probar el enfoque SPI de hardware de st2000 o usar SPI bitbanged con shiftIn().

Comentarios

  • No estoy seguro de que esto funcione. Realmente necesitamos saber cómo funciona el esclavo SPI antes de poder asumir cómo reaccionará. Además, si la línea Chip Select se afirma y se anula con cada transacción SPI de 8 bits, ¿qué tan bien está diseñado el esclavo SPI? Es decir, un esclavo SPI de este tipo podría desincronizarse fácilmente con el maestro SPI. Específicamente, ¿cómo puede estar seguro de qué byte de 8 bits está leyendo realmente?
  • @ st2000 El OP consideró adecuado no dar suficientes detalles; nada más que suposiciones se pueden hacer hasta que eso cambie.
  • Todos los ejemplos que ‘ he visto usan SPI, transfer (0) para leer datos en lugar de SPI.transfer (0xff). También utilizan SPI.transfer para escribir datos. Todavía no he ‘ t descifrado qué hace SPI con 0 o 0xff cuando en realidad estás leyendo datos. ¿Esto se envía al esclavo?
  • @ S.Imp Ellos ‘ son bytes ficticios. Puede enviar lo que quiera enviar, el dispositivo en el otro extremo aún los descartará, incluso si paga los datos. SPI.transfer() siempre se usa en parte debido a la naturaleza intrínseca de dúplex completo de SPI y (como resultado del primer factor) luego en parte debido a la forma en que la mayoría de las MCU implementan sus periféricos SPI. Una vez que el reloj comienza a funcionar, siempre hay » datos » en las líneas MOSI y MISO, ‘ solo depende de cada participante en el autobús que lo lea o no, decidiendo según el protocolo de capa superior predefinido si los » datos » sea significativo o no.
  • No sería ‘ t ser totalmente incorrecto decir que puedes ‘ Leer realmente sin escribir en un bus SPI y viceversa también. Por lo tanto, tiene sentido diseñar simplemente un periférico que tome un byte en un registro y, 8 ciclos después, devuelva un byte en otro (o incluso el mismo) registro, solo para generalizar los casos de uso. Luego, ‘ depende de la aplicación ‘ del usuario decidir si ‘ solo interesado en el byte que se escribió en primer lugar (TX) o el que se volvió a leer (RX) o ambos (TX y RX). Además, de ahí el nombre ambiguo transfer() ya que sirve tanto para leer como para escribir.

Respuesta

Sparkfun tiene una buena explicación de lo que es SPI:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

El IDE de Arduino tiene una biblioteca SPI que viene con el IDE.
http://www.arduino.cc/en/Reference/SPI

La biblioteca incluye dos ejemplos:
Uso de SPI para leer un sensor de presión barométrica
Control de un potenciómetro digital usando SPI

Respuesta

El objetivo es leer 32 bits usando el puerto SPI del dispositivo (desconocido).

Si el dispositivo tolera la actividad de la línea SPI Chip Select (pasando de inactivo a activo a inactivo por cada byte de 8 bits leído) debería poder obtener los 32 bits de datos deseados realizando 4 bit SPI lee.

Sin embargo, si el dispositivo no tolera la actividad de la línea SPI Chip Select anterior (es decir, si el dispositivo requiere que SPI Chip Select esté activo para toda la transacción SPI de 32 bits), no puede separar la transacción de 32 bits en 4 transacciones SPI individuales de 8 bits sin controlar la línea de selección de chip SPI. El siguiente ejemplo de código ilustra cómo se hace esto:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

El ejemplo anterior proviene de la biblioteca SPI de Arduino página web y es una transferencia de 16 bits (no de 32 bits). Para codificar una transferencia de 32 bits, continúe llamando al método SPI.transfer usando el parámetro SPI_CONTINUE.

agregado más tarde …

Parece que la gente está desalentando el uso de los métodos DueExtendedSPI . ¿Y se utilizarán SPISettings y SPI.beginTransaction ()? Si es así, esta página muestra un código de ejemplo donde el código controla explícitamente la línea de selección de chip SPI (busque slaveAPin & slaveBPin). Observe cómo el código lee 24 bits del esclavo A y escribe 8 bits en el esclavo B. Para leer 32 en lugar de 24 bits, necesitamos alterar un segmento del código (junto con algunos otros cambios de soporte) de esta manera:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Comentarios

  • Realmente necesitamos ver las especificaciones del dispositivo SPI esclavo para componer un respuesta específica.
  • Utilizo la placa de evaluación STPM10. La conexión es un SPI síncrono simplex, y el MOSI del Arduino no está conectado a nada. Hay un diagrama de tiempos para cambiar de solo lectura y solo escritura. Mi problema es cómo leer los datos de los registros del chip. Usé SPI.transfer pero no ‘ creo que los datos sean confiables.
  • El diagrama de tiempo STPM10 que se encuentra en la página 11 no parece una transacción SPI estándar. Me inclino a decir que no puede usar la biblioteca Arduino SPI. En su lugar, es posible que deba modificar esto totalmente en el software. Por ejemplo, no creo que haya una línea » SYN » en el bus SPI estándar. Y no ‘ no creo que la línea Chip Select deba subir antes del final de la transacción SPI.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *