GD32调试Si4438,SPI通信终于调通

版权声明:本文为博主原创文章,未经博主允许不得转载。 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));
}


最后总结:上电后SI4438的SDN脚应该拉低,并做一定延时才能正确读取数据。

猜你喜欢

转载自blog.csdn.net/agave7/article/details/43053367