用SPI2和从设备模拟的SPI 调试,单独收 、发正常,
但我发现在发一串数据给对方后,再开始收第一个字节数据是正确,但从第二个数据开始就移位,第二次收的是第一次的,第三次收的是第二次的数据 ,实际示波器看到的数据是正确的,感觉是在SPI的接收Buffer会有问题,请教版主为什么 ?
设置如下,应该是全双工的。
/* SPI2 Config -----------------------------------------------------------*/ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//70Kbit/s SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); /* Enable SPI2 */ SPI_Cmd(SPI2, ENABLE);
发数据:
void MasterMcu_SendChar(u8 sbyte) { vu16 count = 0x8FF; /* Wait for SPI2 Tx buffer empty */ while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); /* Send SPI2 data */ SPI_I2S_SendData(SPI2, sbyte); /* Delay 100us */ while(count--) ; }
读数据:
ErrorFlag MasterMcu_RecChar( u8 *rbyte ) { u32 timecount = TimeOutValue;
/* Slaver MCU is soft SPI interface */ SPI_I2S_SendData(SPI2,0X00); //产生读时的CLK /* Wait for SPI2 data reception */ while ( (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET ) )
/* Read SPI2 received data */ *rbyte = SPI_I2S_ReceiveData(SPI2); Delay_us(60); return OK; } }
main里的调试程序:
复位开始:
for(i = 0; i<5; i++) { MasterMcu_RecChar(len_buf+i); } //这样正常
for(i = 0; i<5; i++) { MasterMcu_SendChar(i); } for(i = 0; i<5; i++) { MasterMcu_RecChar(len_buf+i); } //这样出错 ??
|