全球智能环保优先,高效便捷的数据处理已成为未来必然趋势。SPI协议因其传输速率高,通讯简单等优势,在电机转向转速指令收发、射频通讯与A/D、D/A传感器LCD/OLED显示等方面得到快速应用。

在平头哥半导体有限公司的剑池集成开发环境(简称“CDK”)V2.10.1版本开始支持中科昊芯HX2000系列芯片开发与调试后,本文以HXS320F28027的SPI模块向串行FLASH通讯实例对SPI协议及程序展开介绍。
HX2000系列SPI通讯原理如下,通过IO MUX设置外设引脚功能,CPU通过主控制器输出预分频与时钟使能,通过时钟引脚为通信网络提供时钟,通过SPIBRR寄存器配置波特率,数据写到SPIDAT或SPITXBUF时会启动发送最高有效位,之后数据移入SPIDAT最低有效位,以右对齐方式存储到SPIRXBUF中。


SPI模块使用前,需先进行:(1)复位初始化操作:
①通过SPICCR[SPI SW RESET]位清零复位SPI;
②根据需要进行SPI的初始化、格式与波特率及管脚功能配置;
③SPI SW RESET位置1,使SPI脱离复位。
(2)FIFO配置:
①通过SPIRST在任一阶段复位FIFO模式;
②通过SPIFFTX[SPIFFENA]置位使能FIFO模式,以激活SPI及其FIFO寄存器;
③发送SPITXINT,接收错误与溢出中断SPIRXINT配置;
④通过SPIFFCT调整传输速率延迟0~255个SPCLK周期,以匹配外设通讯速率;
⑤通过TXFFST或RXFFST判断发送与接收到的字的数量,确认收发成功。
本例程主要完成SPI与W25Q64系列FLASH数据访问功能,通过IO MUX配置GPIO19在传输期间维持低电平,复位初始化期间高电平输出,与SPI外设的选通CS引脚相连,实现FLASH数据读写。其连接原理如下图,访问过程为:


①读Flash.ID与Flash.SReg状态;②写使能,读取读与写寄存器状态;③写使能,擦除芯片;④延时等待4个周期,等待芯片数据擦除完成;⑤写使能,向FLASH写入数据;⑥读出写入FLASH芯片的数据;注:每次读写后需延时等待,以匹配外设传输速率。
详细介绍参见公众号B站视频讲解,二维码为下图:

工欲善其事必先利其器,程序开发前准备阶段如下表:
·开发环境:剑池集成开发环境V2.10.1

下载地址:https://occ.t-head.cn/community/download?id=575997419775328256
·开发板:Core_DSC28027核心板

http://haawking.cn/core28027
·仿真器:

申请地址:http://haawking.cn/DSP-EMULATOR
下载界面如下:

准备好开发工具后就可以开始程序开发。详细的“CDK”安装及创建工程方法请看第一篇推送《芯教程|平头哥CDK助力中科昊芯HX2000系列芯片系统开发》。例程选用HXS320F28027核心板与W25Q64系列FLASH进行数据访问,硬件连接如下:

接着在CDK上开发SPI访问FLASH读写数据程序,代码包括:①外设GPIO引脚、复位初始化操作与FIFO配置;②SPI发送与接收、W25Q64系列FLASH芯片访问程序;
int main(void)
{
/*系统初始化控制*/
InitSysCtrl();
/*LED灯GPIO配置,用于判断SPI访问FLASH数据读写状态*/
InitLED();
/*定义两个循环变量,用于延时操作*/
int i,j=0;
/*SPI的外设引脚GPIO配置*/
SPI_IOinit();
/*SPI FIFO配置*/
SPI_fifo_init();
/*SPI复位初始化操作*/
spi_init();
/*读取W25Q64系列Flash的ID信息*/
SPIFlash.Jedec_ID=Jedec_ID_Read();
/*读取W25Q64系列Flash的SReg寄存器状态*/
SPIFlash.SReg=Read_Status_2Reg();
/*写使能*/
WREN();
/*读取W25Q64系列Flash的写寄存器状态*/
WrSReg(0x0000);
SPIFlash.SReg=Read_Status_2Reg();
/*延时等待,等待写寄存器状态读写完成*/
Wait_Busy();
SPIFlash.SReg=Read_Status_2Reg();
WREN();
/*擦除芯片*/
Chip_Erase();
/*延时等待,等待FLASH芯片擦除成功*/
Wait_Busy();
Wait_Busy();
Wait_Busy();
Wait_Busy();
/*读出FLASH芯片数据,确认FLASH芯片数据擦除成功*/
ReadData(0,upper_128,128);
WREN();
/*向FLASH芯片写入数据*/
PageProgram(0,upper_100,128);
/*延时等待,等待数据写入完成*/
Wait_Busy();
/*读出FLASH芯片所写入的数据*/
ReadData(0,upper_128,128);
while(1)
{
for(k=0;k<129;k++)
{
/*判断写入FLASH的数据与FLASH接收数据是否一致,一致在亮灯GPIO0*/
if(upper_128[k]==upper_100[k])
{
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
/*延时,使亮灯维持较长时间,以便于观察*/
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
}
}
}
/*FLASH接收数据与SPI发送数据不一致,则GPIO0对应LED灯灭*/
else
{
GpioDataRegs.GPASET.bit.GPIO0=1;
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
}
}
}
}
}
return 0;
}
CDK上开发SPI访问FLASH读写数据程序的截图如下:

编译成功后就可进入“Debug”模式调试了,其界面如下:

下图一为HX2000系列芯片SPI发送的数据upper_100,图二为FLASH接收的数据upper_128,由图可得upper_128数组与upper_100数组相等,故SPI读写FLASH数据成功。


SPI访问FLASH数据收发状态及数据正确性显示如下:

