【AG32VF407测评】SPI Flash读写测试
[复制链接]
AG32VF407 的SPI相对特殊一些,不是一般MCU通用的SPI控制器,只能实现SPI Master的功能,不支持SPI Slave,且SPI Master似乎也只支持驱动SPI Flash,所以在AG32VF407 RM中SPI控制器实际是叫Flash-SPI控制器
也许内部逻辑实现并不完善,如果是一般的MCU的SPI这个样子,大概率就是个残血版的SPI了,好在AG32是可以通过内部的FPGA定制SPI协议控制器的,后续楼主再探索一些这方面的应用,本贴将基于这个Flash-SPI控制器实现对Flash的读写操作。
1、工程配置
建立工程的步骤不再演示,可以参考【AG32VF407测评】开箱、环境搭建与点灯Demo,本贴用同样的方法新建一些SPI的Demo项目,在src目录下新建spi.c
在board.ve上配置引脚映射,同时加上串口和LED,方便调试
SYSCLK 248
HSECLK 8
SPI0_SCK PIN_89
SPI0_SI_IO0 PIN_91
SPI0_SO_IO1 PIN_90
UART0_UARTRXD PIN_69
UART0_UARTTXD PIN_68
GPIO4_3 PIN_32 # LED1
GPIO4_4 PIN_31 # LED2
需要特别说明的是,一定要自己对着原理图映射引脚,而不是直接搬官方examples里面的,那里跟AG32VF407用的并不是同一个板子,引脚映射不完全一样
这里使用SPI0来控制,AG32VF407有两个SPI,分别为SPI0和SPI1,通过映射引脚的方式,都可以用来控制读写Flash
2、AG32VF407的Flash-SPI控制器
SPI这个协议是老熟人了,具体的协议规范啥的就不多讲了
AG32VF407的Flash-SPI控制器总共3组共17个寄存器,即1个控制寄存器CTRL,8个段控制寄存器PHASE_CTRL,8个段数据寄存器PHASE_DATA,这里的段可以理解为Flash-SPI控制器完成一轮完整的读写或配置等操作所需要的子操作,每一轮操作都支持细分为8个以下的段即PHASE,每个PHASE都可以配置为独立的子操作,例如读写数据,读取数据等
Flash-SPI控制器通过段的划分去支持兼容不同型号和时序要求的SPI Flash
寄存器的具体描述可以参考AG32 MCU Reference Manual202305.pdf中21.2.2 register description的内容,我们操作寄存器去读写Flash的一般流程参考文档如下
其中的SPCR即CTRL寄存器,文档和SDK中的描述稍微有些出入
3、AG32VF407的SPI Flash
首先是SPI Flash的原理图电路,采用的是SPI 1线的模式,顺带一提,AG32VF407的Flash-SPI控制器是支持1/2/4线模式的
SPI Flash芯片为W25Q16,这里面只需要配置SPI1_SCK/SPI1_MISO/SPI1_MOSI三个引脚即可,参照上面的ve配置代码
4、测试代码
这里使用官方examples中example_spi.c代码,作了小许修改,主要在设置读写模式的位置,由于Flash已经固定是Single模式,这里就直接设置为Single就好了
const SPI_PhaseModeTypeDef FLASH_READ_MODE = SPI_PHASE_MODE_SINGLE;
SPI_PhaseModeTypeDef FLASH_WRITE_MODE = FLASH_READ_MODE;
SPI_FLASH_Erase(spi, FLASH_ADDR, FLASH_SIZE);
SPI_FLASH_Read(spi, buf, FLASH_ADDR, FLASH_SIZE, FLASH_READ_MODE, spi_dmac_channel);
另外找到下面这一行,并注释掉,并不需要开发Qual 4线模式
SPI_FLASH_QuadEnable(spi);
完整的代码如下
spi.zip
(3.05 KB, 下载次数: 10)
不过楼主在测试的时候并没有得到准确的结果,Flash 输出的都是fffff之类的值
个人判断可能在于原理图中SPI1_MISO跟TRST接到一起,而TRST被设置成上拉模式,查了以下资料,有说SPI_MISO上拉不拉都可以的,也有设置成下拉的,由于楼上身上暂时缺少测试仪器,暂时不能进行详细的测试,后续有进展再更正结果
|