关于STM32的SPI使用,用库函数来实现功能很方便,但也有一些问题需要注意一下.
就是库函数中SPI_I2S_ReceiveData().当处于主机模式的时候.只是简单的去缓存搬数据而已并没有发出SCK去获取数据.当然这个从机的模式下不成问题
而用发送函数SPI_I2S_SendData,也需要先读一下缓冲后再发送数据.这个不会出现溢出OVR.
故每次不管读写SPI都要做到以下四个步骤才能正确读写
u8 SPI_FLASH_SendByte(u8 byte)
{
 /* 检测缓冲是否为空 */
 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 /* 通过SPI发送数据*/
 SPI_I2S_SendData(SPI1, byte);
 /* 等待接收数据 */
 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
 /* 返回读到的数据*/
 return SPI_I2S_ReceiveData(SPI1);
}
以下是读写的代码
void SPI_Send_Byte(u8 byte)
{
 SPI_FLASH_SendByte(byte);
}
u8 SPI_Get_Byte(void)
{
 return SPI_FLASH_SendByte(0xff);
}
还有一个问题要注意一下.就是笔者在读华邦的FLASH的时候.发现读的时候.数据的最高位一直为零.后来才发现原来在配置SPI的时候有个地方需要注意一下
 SPI_InitTypeDef SPI_InitStructure;
 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;
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPI1, &SPI_InitStructure);
 SPI_Cmd(SPI1, ENABLE);
当然了.最后也不要忘记把所用到GPIO,配成GPIO_Mode_AF_PP模式.把CS位配成GPIO_Mode_Out_PP