前言
使用的是RTThread 标准版,主控是STM32H743,SRAM是LY68L6400,使用QSPI
QSPI和SPI的区别
个人理解最大的区别就是SPI是串行,数据输出,而QSPI跟像并行输出,比如从单数据线的SPI到4数据线的QSPI。
LY68L6400
SRAM的QSPI的波形图,注意这个读取等待周期,十分重要。也是区别于SPI的地方
在KCONFIG中添加开启QSPI
menuconfig BSP_USING_QSPI
bool "Enable QSPI BUS"
default n
select RT_USING_QSPI
select RT_USING_SPI
RTT中的QSPI的读取时 需要配置的一些参数
RTT中的QSPI的写入时 需要配置的一些参数,和读取不同的就是命令码,空闲等待周期是为0
void qspi_ly68_write(rt_uint32_t waddr,rt_uint8_t *wdata,rt_uint32_t size)
{
struct rt_qspi_device *qspi_dev_ly68 = RT_NULL;
struct rt_qspi_message message;
rt_err_t result = RT_EOK;
qspi_dev_ly68 = (struct rt_qspi_device *)rt_device_find(QSPI_DEVICE_NAME);
if(qspi_dev_ly68 == RT_NULL){
rt_kprintf("qspi sample run failed! can't find %s device!\n", QSPI_DEVICE_NAME);
}
else
{
message.parent.send_buf = wdata;
message.parent.recv_buf = RT_NULL;
message.parent.length = size;
message.parent.next = RT_NULL;
message.parent.cs_take = 1;
message.parent.cs_release = 1;
message.instruction.content = 0X38;
message.instruction.qspi_lines = 1;
message.address.content = waddr;
message.address.size = 24;
message.address.qspi_lines = 4;
message.dummy_cycles = 0;
message.qspi_data_lines = 4;
result = rt_qspi_transfer_message(qspi_dev_ly68, &message);
}
}
void qspi_ly68_read(rt_uint32_t raddr,rt_uint32_t size)
{
struct rt_qspi_device *qspi_dev_ly68 = RT_NULL;
struct rt_qspi_message message;
rt_err_t result = RT_EOK;
rt_uint32_t i;
qspi_dev_ly68 = (struct rt_qspi_device *)rt_device_find(QSPI_DEVICE_NAME);
if(qspi_dev_ly68 == RT_NULL){
rt_kprintf("qspi sample run failed! can't find %s device!\n", QSPI_DEVICE_NAME);
}
else
{
message.parent.send_buf = RT_NULL;
message.parent.recv_buf = qrData;
message.parent.length = size;
message.parent.next = RT_NULL;
message.parent.cs_take = 1;
message.parent.cs_release = 1;
message.instruction.content = 0XEB;
message.instruction.qspi_lines = 1;
message.address.content = raddr;
message.address.size = 24;
message.address.qspi_lines = 4;
message.dummy_cycles = 6;
message.qspi_data_lines = 4;
rt_qspi_transfer_message(qspi_dev_ly68, &message);
}
}
一些问题
使用QSPId DMA 的话会遇到一个问题,就是drv_qspi.c中的DMA写的不对
具体如下图,在使用STM32H7的时,drv_qspi.c中的参数还是hdma,但是实际上H7的文件中定义的是hmdma,在其他系列还能用,在H7上要用DMA是需要修改的。