Question

C'est la première fois que j'essaie d'utiliser le protocole SPI.J'essaie de comprendre un exemple de code fourni avec mon kit de développement (qui possède un microcontrôleur STM32F207VCT6).Ce code implémente la communication (lecture et écriture) avec une mémoire flash AT45DB041D.

Chaque fois que cet exemple de code parvient à lire la mémoire, il envoie non seulement des informations sur ce à lire, mais vous demande également de recevoir une rigueur de données.Ces données reçues n'est pas utilisée à aucun usage (apparemment).Les données réelles à lire seront à nouveau posées par la commande de réception plus tard en envoyant d'abord un octet de 0x00.Le code suivant montre 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
}

Définitions:

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);
}

Comme vous pouvez le voir, le code SPIX_SEND_BYTE n'envoie pas seulement ce qu'il faut lire, mais également recevoir des informations qui ne seront pas utilisées.

Quelqu'un peut-il m'aider à comprendre pourquoi cela doit être fait et pourquoi il est nécessaire d'envoyer l'octet de 0x00 pour recevoir les données?

merci!

Était-ce utile?

La solution

SPI est un bus complet duplex et bidirectionnel où les données sont envoyées à l'esclave et reçues de l'esclave en même temps. Votre contrôleur SPI ne sait pas si un octet donné est Glong du maître, ou de l'esclave, ou les deux. Par conséquent, chaque fois que vous envoyez un octet, vous devez également lire un octet, si seulement pour le jeter. De même, vous ne pouvez pas recevoir d'octet sans envoyer d'octets, même si l'esclave le jettera.

Jetez un coup d'œil à Wikipedia .

Alors, ce que vous codez le code est

  1. Envoyer read_id à l'esclave.
  2. lire et jeter l'octet simultanément lu de l'esclave.
  3. Écrivez 0 à l'esclave pour activer l'esclave d'envoyer un octet de données.
  4. Lire l'octet de données qui a été lu simultanément de l'esclave.
  5. Boucle de retour à # 3.
  6. Au fait, de telles questions seraient mieux adaptées à L'EE Stack Exchange car il s'agit davantage du protocole matériel plutôt que de Programmation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top