一、背景
最近项目需要,一个DUT芯片需要使用2线的SPI接收协议。使用STM32F103C8芯片调好了代码,将代码移植到GD32上不能运行。
SPI配置:配置成16bit,2线仅接收模式
二、STM32
STM32配置成2线接收模式,使用SPI_Cmd开关函数,实现SPI_CLK的发送,从而实现数据传输。
void SPI_RD2Byte(uint16_t *RxDat)
{
DUT_CS_L;
DUT_RD_L;
SPI_Cmd(SPI1,ENABLE);
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET);
while((SPI1->SR & SPI_I2S_FLAG_BSY) == RESET); //ST MCU not need,GD32 must have
*RxDat = SPI1->DR;
SPI_Cmd(SPI1,DISABLE);
DUT_RD_H;
DUT_CS_H;
}
同样的代码,移植到GD32不能正常运行,经过一番折腾之后,顺利解决这个问题。
三、GD32
GD32配置成2线全双工模式,正常发送数据,没有对应的管脚,实现SPI_CLK的产生,从而实现数据传输。
void SPI_RD2Byte(uint16_t *RxDat)
{
DUT_CS_L;
DUT_RD_L;
*RxDat = SPI1->DR; //clear Receive Buffer
SPI1->DR = 0xFFFF; //send data without PIN,just send SCLK
while((SPI1->SR & SPI_I2S_FLAG_TXE) == RESET);
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET);
while((SPI1->SR & SPI_I2S_FLAG_BSY) == RESET);
*RxDat = SPI1->DR;
DUT_RD_H;
DUT_CS_H;
}
四、小结
对于SPI总线,2线仅接收模式的关键在于怎样正确产生SPI_CLK。不同的MCU实现方式可能因为IP不一样,从而实现方式不一样。但是完全可以配置成全双工正常模式,构造一个虚拟的发送,从而产生时钟,实现DUT芯片把数据吐出来的目的。