2014-01-10 11 views
1

SPI 프로토콜을 처음 사용하려고합니다. 내 개발 키트 (STM32F207VCT6 마이크로 컨트롤러가있는)와 함께 제공되는 예제 코드를 이해하려고합니다. 이 코드는 AT45DB041D 플래시 메모리와의 통신 (읽기 및 쓰기)을 구현합니다.플래시 메모리 쓰기 및 SPI를 통한 읽기

이 예제 코드는 메모리를 읽을 때마다 읽어야 할 내용에 대한 정보를 보낼뿐만 아니라 데이터를 수신하도록 요청합니다. 이 데이터는 어떤 목적으로도 사용되지 않습니다 (외관상으로는). 읽어 올 실제 데이터는 나중에 0x00 바이트를 먼저 보내서 receive 명령에 의해 다시 묻습니다.

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 바이트를 보내야하는 이유를 이해할 수 있습니까?

감사합니다.

답변

1

SPI는 전이중, 양방향 버스로 데이터가 슬레이브로 전송되고 슬레이브에서 동시에 수신됩니다. SPI 컨트롤러는, 지정된 바이트가 마스터, 슬레이브, 또는 양쪽 모두로부터 빗 나갈지 어떨지를 알지 못합니다. 따라서 바이트를 보낼 때마다 바이트 만 버려야합니다. 같은 토큰으로, 슬레이브가 버리더라도 바이트를 보내지 않고 바이트를받을 수 없다.

Wikipedia을 살펴보십시오.

그럼, 당신이 코드가하는 일은 슬레이브에 Read_ID 보내기

  1. 이다.
  2. 바이트를 동시에 읽고 슬레이브에서 읽어들입니다.
  3. 0을 슬레이브에 쓰면 슬레이브가 1 바이트의 데이터를 보낼 수 있습니다.
  4. 슬레이브에서 동시에 읽은 데이터 바이트를 읽습니다.
  5. # 3 등을 맞댄 반복하십시오.

그런데 이러한 질문은 the EE Stack Exchange에 더 적합 할 수 있습니다. 프로그래밍과는 달리 하드웨어 프로토콜에 관한 것입니다.