
SPI接口使平时工作中常用到的一个接口,它的用处非常多。首先支持全双工操作,发送的时候可以接收。还有就是操作比较简单,没有太多上层协议,底层主要是发送缓冲区和一些标志。关键是速度比较快,在LPC5500上面高速SPI接口可以达到50Mbps,这在150Mhz主频的MCU上面算是不慢的了。
对于高速传输的模块一般适用SPI接口而不是串口。很多Norflash也主要支持SPI接口。但是有些场合单个数据线的SPI还是有写吃力的。比如想快速加载Norflash里面的代码到RAM中。再比如想快速读取外部flash中的图片数据加载到LCD显示上面,或者想快速对比外部flash中的模型数据。这些应用都需要更高速的SPI。除了提高SPI的总线速度,就是增加SPI的数据信号线的个数。比如四位数据线的QuadSPI,八位数据线的Octal SPI。
小编结合工作中客户的应用需求在LPC5500上面实现了QuadSPI接口。这个QuadSPI接口是通过LPC5500里面的协处理器EZH实现的。因为EZH可以单周期访问IO,并且EZH还能实现简单的逻辑运算,还可以将数据存储到RAM中。将这些性能放在一起就可以实现QuadSPI,并且自带DMA功能,您只需告诉它发哪些数据,发多少字节的数据即可。它就可以自动完成,不需要ARM核干预。
小编也基于LPC55S69的开发板做了一个方案,Norflash模块采用W25M512JV模块,系统连接如下图:
信号线的连接如下图:
读Norflash的时序如下图:
写Norflash的时序如下图:
留给客户操作的函数也比较简练,如下:
Routine | Description |
QSPI_pin_Init(); | QSPI pin initialization |
QSPI_Init(void *pPara); | QSPI initialization |
QSPI_Start(); | QSPI flash start |
QSPI_software_trigger(); | Start the transaction by software |
QSPI_reset(); | QSPI flash reset |
QSPI_read_JEDEC_ID(); | Read ID of flash |
QSPI_Erase(); | Erase flash |
QSPI_Page_Program(); | Program flash |
QSPI_read(); | Read data from flash in QSPI mode |
QSPI_read_1wire(); | Read data from flash in normal SPI mode |
QSPI_Fast_Read_Quad_IO(); | Read data from flash in quad IO mode |
QSPI_write_status(); | Write status registers of flash |
QSPI_read_status(); | Read status registers of flash |
经过测试它的性能可以达到:读写时总线速度位25Mhz,数据传输速度高达100Mbps.这个速度比50Mhz的SPI数据传输速度快了1倍。虽然没有达到更高的总线速度,但小编已经尽力了。
总结一下:小编今天带给大家的基于LPC5500的QuadSPI接口的方案,可以明显提高SPI的传输速度。并且它完全不占用ARM核的负载资源,自主实现收发。还赠送一个DMA的功能,想传多少传多少。
来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。