Pregunta

Es la primera vez que trato de usar el protocolo SPI.Estoy tratando de entender un código de ejemplo que vino con mi kit de desarrollo (que tiene un microcontrolador STM32F207VCT6).Este código implementa la comunicación (lectura y escritura) con una memoria flash AT45DB041D.

Cada vez que este código de ejemplo logra leer la memoria, no solo envía información sobre qué se le puede leer, sino que también solicita recibir información de datos.Estos datos recibidos no se utilizan para ningún propósito (aparentemente).Los datos reales a leer se volverán a leer nuevamente por el comando de recepción más adelante enviando un byte 0x00 primero.El siguiente código muestra que:

void AT45DBXX_Read_ID(u8 *IData){
u8 i;
AT45DBXX_BUSY();
AT45DBXX_Enable;  //Chip Select drive to low
SPIx_Send_byte(Read_ID);        
for(i=0;i<4;i++)
{
    IData[i] = SPIx_Receive_byte();
}
AT45DBXX_Disable; //Chip Select drive to high
}

Definiciones:

void SPIx_Send_byte(u16 data){
while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(Open207V_SPIx,data);

while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
SPI_I2S_ReceiveData(Open207V_SPIx);
}


u16 SPIx_Receive_byte(void){
while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(Open207V_SPIx,0x00);

while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(Open207V_SPIx);
}

Como puede ver el código SPIX_SEND_BYTE no solo está enviando qué leo, sino que también recibe información que no se utilizará.

¿Puede alguien ayudarme a entender por qué se necesita hacer y por qué es necesario enviar el byte de 0x00 para recibir los datos?

¡Gracias!

¿Fue útil?

Solución

SPI es un autobús bidireccional dúplex completo donde los datos se envían a los esclavos y se reciben del esclavo al mismo tiempo. Su controlador SPI no sabe si un byte dado es glong del maestro, o del esclavo, o ambos. Por lo tanto, cada vez que envíe un byte, también debe leer un byte, aunque solo sea para tirarlo. De la misma manera, no puede recibir un byte sin enviar un byte, incluso si el esclavo lo tirará.

Eche un vistazo a wikipedia .

Entonces, lo que usted está haciendo es

  1. enviando read_id al esclavo.
  2. leyendo y desechando el byte leyó simultáneamente fuera del esclavo.
  3. Escribe 0 al esclavo para que el esclavo envíe un byte de datos.
  4. Lea el byte de datos que se leyó simultáneamente fuera del esclavo.
  5. bucle de regreso a # 3.
  6. Por cierto, tales preguntas serían más adecuadas para el intercambio de pilas EE , ya que es más sobre el protocolo de hardware en lugar de programación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top