W800 HSPI实现的是SPI从设备的功能。在寄存器手册中有如下描述:
“芯片内部的HSPI是和wrapper控制器一起工作的,wrapper控制器内部集成了DMA,通过DMA实现HSPI内部FIFO和芯片内存之间的数据交换。该操作是硬件实现的,软件不需要关心数据发送接收的过程,只需要配置发送接收数据的链表,以及操作wrapper控制器相应的寄存器。”
本文只讲述如何配置发送接收数据的链表,虽然这些在驱动程序里已经实现,但是在应用中难免会遇到需要修改情况。
在wm_hspi.h文件里定义了HSPI BUFFER相关的内容,它是在W800的后面128K内存上取了一块地址作为缓冲buff,处于HEAP和Wi-Fi内存之间,起始地址定义在wm_ram_config.h里的SLAVE_HSPI_SDIO_ADDR,大小为SLAVE_HSPI_MAX_SIZE。这块内存只能定义在后128k ram中。
这块buffer的总大小定义的是0x2000,具体细分在wm_hspi.h里,按照功能分为下图所示的几大区域,我们只关心前面的发送和接收buff。
HSPI_TXBUF_SIZE、HSPI_RXBUF_SIZE定义了每个buff的大小,这个值不可以修改。HSPI_TXBUF_NUM、HSPI_RXBUF_NUM定义了发送接收buff的个数,这两个值使我们要修改的地方,按照目前的设置个数,总大小0x2000的内存空间是够用的,如果这里改大了个数,那就需要相应的将SLAVE_HSPI_SDIO_ADDR即__heap_end的值向前移动相应的大小,但不能小于0x20028000。每增加一个buff,除了增加的buff本身大小,还需要增加一个desc来描述该buff,发送接收的描述符结构体如下,大小分别为发送描述符28个字节,接收描述符12个字节。
举例说明,比如发送buff由2改成了4,接收buff由3改成6,那么增加的大小为2 x (28 + 1500) + 3 x (12 + 1500) = 7592字节。在ld/w800里的gcc_csky.ld文件里修改__ram_end的值,0x2003A000 - 0x1DA8 = 0x20038258。另外需要注意__min_heap_size的值,如果修改了__ram_end的值后编译没有报错,那就没问题,如果报内存错误了,说明分配的堆也要相应地改小,修改__min_heap_size的值 ,0x18000 - 0x1DA8 = 0x16258。