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.