FM33LG0xx 芯片提供了 3 个 SPI 接口模块,可配置为主设备或从设备,实现与外部的 SPI 通信。引脚定义如下。
SPI的初始化如下。
void SPIx_Init(void)
{
}
读写程序
uint32_t SPIx_WriteAndRead(SPI_Type *SPIx,uint32_t data)
{
uint8_t retry = 0;
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_LOW);
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_HIGH);
return data;
}
uint8_t SPIx_WriteData(SPI_Type *SPIx, uint8_t *data, uint32_t length)
{
uint8_t retry = 0;
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_LOW);
while(length–)
{
FL_SPI_WriteTXBuff(SPIx, *data);
data++;
while(!(FL_SPI_IsActiveFlag_RXBuffFull(SPIx)))
{
retry++;
if(retry > 200)return 0;
}
FL_SPI_ReadRXBuff(SPIx);
}
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_HIGH);
}
uint8_t SPIx_ReadData(SPI_Type *SPIx, uint8_t *data, uint32_t length)
{
uint8_t retry = 0;
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_LOW);
while(length–)
{
*data = SPIx_WriteAndRead(SPIx,0XFF);
data++;
}
// FL_SPI_SetSSNPin(SPIx, FL_SPI_SSN_HIGH);
}
需要注意的是
根据NSS信号由硬件(NSS)还是软件(SSI)管理配置CS的引脚控制方式。
SPI 判断发送完成, TXBUF 标志不等于移位寄存器发送完成, BUSY 标志置位有个同步过程,有从 0 到 1 的一个过程,写完 TXBUFF, BUSY 没有立刻置 1 还是 0, 在 SPI的工作时钟和系统时钟相差特别大时,这个问题会特别明显。 因此建议在开发过程中采用以下方式:
1) 全双工模式: SPI 原理是主从移位寄存器交换,可以判断 RXBUF 标志来判断接收完成。
2) 半双工模式:发送完成不能判断 RXBUF,使用 BUSY,先判断 BUSY 为 1,再判断 BUSY 为 0,发送完成。
FL_WriteTXBuff(SPI1,data);//写 TXBUF
while(SPI1->ISR &(1U<<8)) ==(1U<<8));//等待 BUSY 置 1,使用寄存器操作可以确保主时钟在 64MHZ 也可以保证程序逻辑没有问题
while(FL_SPI_IsActiveFlag_Busy(SPI1));//BUSY 变 0,发送完成