Вопрос

Это первый раз, когда я пытаюсь использовать протокол SPI.Я пытаюсь понять пример код, который пришел с моим набором разработки (который имеет микроконтроллер STM32F207VCT6).Этот код реализует связь (чтение и запись) с помощью флэш-памяти AT45DB041D.

Каждый раз, когда этот пример кода удается прочитать память, которую он не только отправляет информацию о том, что нужно прочитать, но также просит пройти наступление данных.Эти данные получены не предназначены для каких-либо целей (видимо).Реальные данные, которые нужно прочитать, будут запрошены снова с помощью команды получения позже, отправив байт 0x00 первым.Следующий код показывает, что:

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
}
.

Определения:

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

Как вы можете видеть код SPIX_SEND_BYTE, не только отправляет, что нужно прочитать, но и получать информацию, которая не будет использоваться.

Может кто-нибудь помочь мне понять, почему это необходимо сделать, и почему ее необходимо для отправки байта 0x00 на самом деле получать данные?

Спасибо!

Это было полезно?

Решение

SPI - это полнодуплексное, двунаправленное шина, где данные отправляются в раб и получают от раба одновременно. Ваш контроллер SPI не знает, является ли данный байт Glong от мастера или от раба или обоих. Поэтому, когда вы отправляете байт, вы также должны прочитать байт, если только бросить его. К тому же токену вы не можете получить байт, не отправляя байт, даже если раб выбросит его.

Посмотрите на Wikipedia .

Так, то, что вы делаете код, это

  1. Отправка read_id на раб.
  2. чтение и выбрасывание байта одновременно читать из раба.
  3. Напишите 0 на раб, чтобы включить ведомое значение для отправки байта данных.
  4. Прочитайте байт данных, который был одновременно прочитан из раб.
  5. цикл обратно в # 3.
  6. Кстати, такие вопросы будут лучше подходят для Обмен стеками EE как оно больше о аппаратном протоколе, в отличие от программирование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top