版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/agave7/article/details/43053367
最近用GD32去调试si4438,SPI读取数据总是出错,因为之前做过GD32移植STM32的SPI程序,初始化代码如下:访问访问W25Q16 FLASH芯片是没有任何问题的,但是用在si4438上就是不行。
读写函数如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //使能SPI时钟
SPI_Cmd(SPI2, DISABLE);
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; //STM32
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //STM32
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //GD
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //GD
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
最后我尝试着修改各种配置,结果却狠狠的扇了我一巴掌,原来上面就应该使用STM32的配置, 配置时钟空闲时为Low电平,第1个时钟沿捕获数据;
正确配置如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //使能SPI时钟
SPI_Cmd(SPI2, DISABLE);
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; //STM32
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //STM32
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //GD
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //GD
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
读写函数如下:
u8 SPI_SendByte(u8 byte)
{
/* Loop while DR register in not emplty */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI1, byte);
/* Wait to receive a byte */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}
u8 SPI_ReadByte(void)
{
return (SPI_SendByte(0x00));
}