문제

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