【雅特力AT-START-F437评测】2.QSPI Flash读写测试
[复制链接]
本帖最后由 caizhiwei 于 2023-5-21 20:41 编辑
QSPI 控制器包含一个 Command(命令) 端口, 理论最大支持 4GB 地址空间范围的器件; 一个 XIP(直接地址映像读取)端口, 理论最大支持 256MB 地址空间范围的器件。
我们先熟悉一下外设Flash的特性:
EN25QH128将16MB的容量分为256个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。EN25QH128的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。这样我们需要给EN25QH128开辟一个至少4K的缓存区,这样对SRAM要求比较高,要求芯片必须有4K以上SRAM才能很好的操作。EN25QH128的擦写周期多达10W次,具有20年的数据保存期限,支持电压为2.7~3.6V,EN25QH128支持标准的SPI,还支持双输出/四输出的QSPI,最大SPI时钟可以到80Mhz(双输出时相当于160Mhz,四输出时相当于320M)。
QSPI指令协议说明:
我们根据官方提供的历程的基础上,进行下一步验证:
1. 初始化QSPI接口:
/* qspi config */
qspi_config();
/* switch to cmd port */
qspi_xip_enable(QSPI1, FALSE);
/* set sclk */
qspi_clk_division_set(QSPI1, QSPI_CLK_DIV_4);
/* set sck idle mode 0 */
qspi_sck_mode_set(QSPI1, QSPI_SCK_MODE_0);
/* set wip in bit 0 */
qspi_busy_config(QSPI1, QSPI_BUSY_OFFSET_0);
/* erase */
qspi_erase(0);
2. 读出0扇区的所有内容:
/* read */
qspi_data_read(0, TEST_SIZE, rbuf);
for(i = 0; i < TEST_SIZE; i++)
{
if(rbuf[i] != 0xFF)
{
err = 1;
break;
}
}
3. 写入预设的内容再读出:
/* program */
qspi_data_write(0, TEST_SIZE, wbuf);
/* read */
qspi_data_read(0, TEST_SIZE, rbuf);
4. 比较预设的内容和读出的内容是否一致:
if(memcmp(rbuf, wbuf, TEST_SIZE))
{
err = 1;
}
while(1)
{
if(err == 0)
{
at32_led_toggle(LED3);
delay_ms(300);
}
else
{
at32_led_toggle(LED2);
delay_ms(300);
}
}
从打印结果和led的内容可以看出,内容是一致的,测试成功。
工程源码:
|