关于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