【简介】
S32K3 的QSPI 的使用的核心配置就是LUT,LUT负责将用户配置的指令转换成QSPI 的控制信号,从而完成QSPI 接口和外设芯片的数据交互。以下是QSPI 的框图中LUT 的说明。

每个LUT的大小为2字节,对应编码结构如下:

LUT 的配置需要根据芯片手册的定义的数据获取的方式来通过LUT进行信息交互。我们以QSPI中的状态获取的配置为例来了解下S32DS中的LUT相关配置。本地使用的芯片为S25FL512S,以下是芯片手册中状态寄存器的定义说明。

以下是S32D中的对应的配置,状态寄存器读取的状态配置。

上述配置中描述了对对应状态寄存器的大小为1B,busy位为bit0,1为busy状态。以下是对应ReadSR的LUT 配置即为读取0x05 的状态寄存器。

添加如下测试代码读取寄存器状态。
static Qspi_Ip_StatusType Qspi_Ip_S25fl512s_Flash_WaitReady(void) {
Qspi_Ip_StatusType st;
uint32_t timeout = S25FL512S_BUSY_POLL_TIMEOUT;
do {
st = Qspi_Ip_GetMemoryStatus(0);
timeout--;
} while ((STATUS_QSPI_IP_BUSY == st) && (timeout > 0U));
return (0U == timeout) ? STATUS_QSPI_IP_TIMEOUT : st;
}运行时抓取对应的波发现QSPI发送05 命令来读取状态信息。


添加如下代码在擦除后读取对应的状态信息,会读取到当前为busy状态。
/**
* @brief Erase one 256 KB sector and wait until the device is ready
* @param addr Byte address of the 256 KB sector to erase
* @return QSPI status
*/
Qspi_Ip_StatusType Qspi_Ip_S25fl512s_Flash_EraseSector(uint32_t addr)
{
Qspi_Ip_StatusType st;
st = Qspi_Ip_EraseBlock(S25FL512S_QSPI_MEM_INST, addr, S25FL512S_SECTOR_SIZE);
if (STATUS_QSPI_IP_SUCCESS != st) {
return st;
}
return Qspi_Ip_S25fl512s_Flash_WaitReady();
}
测试发现擦测256KB 的sector 需要耗时400ms.
其他的命令的配置过程也是类似,本地的LUT 的都配置如下,跟flash 手册中定义的命令也是一致的。


逻辑分析仪抓取的数据跟上述保持一致。

其他 LUT 的配置基本也都是类似的,再此就不再赘述了。
我要赚赏金
