专栏/平头哥CDK助力中科昊芯HX2000系列芯片之SPI通信协议

平头哥CDK助力中科昊芯HX2000系列芯片之SPI通信协议

2021年11月15日 01:25--浏览 · --点赞 · --评论
粉丝:748文章:47

全球智能环保优先,高效便捷的数据处理已成为未来必然趋势。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数据收发状态及数据正确性显示如下:

GIF
GIF


投诉或建议