硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1525|回复: 14
收起左侧

[SPI/QSPI] QSPI的双闪问题请教

[复制链接]

3

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2022-5-6 09:33:38 | 显示全部楼层 |阅读模式
本帖最后由 Wujianling 于 2022-5-6 16:12 编辑

我做了这个实验好久,一直没搞好,请教一下是怎么回事,用的的H750VBT6,我想实验的目的是把数据送出去就行,也不是送到FLASH,而是送到相关引脚就行,一直没能成功,请问我的设置有问题吗,特别是QSPI_Send_CMDu8 QSPI_Init(void)u8 QSPI_Init(void)
{
        u32 tempreg=0;
        RCC->AHB4ENR|=0B11111;        //使能PORTABCDE时钟         

        
        RCC->AHB3ENR|=1<<14;                   //QSPI时钟使能
        
        GPIO_Set(GPIOA,1<<1,  GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PA1复用功能输出                BK1-IO3
        GPIO_Set(GPIOB,1<<2,  GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PB2复用功能输出                CLK
        GPIO_Set(GPIOB,1<<10, GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PB10复用功能输出                BK1-NCS               
        GPIO_Set(GPIOC,1<<10, GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PC10复用功能输出                BK1-IO1
        GPIO_Set(GPIOD,1<<11, GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PD11复用功能输出                BK1-IO0        
        GPIO_Set(GPIOE,1<<2,  GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PE2        复用功能输出                BK1-IO2        
        GPIO_Set(GPIOE,0XF<<7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU);                //PE7~10复用功能输出        BK2-IO0-IO3        
        
  GPIO_AF_Set(GPIOA,1,9);                //PA1,AF9
         GPIO_AF_Set(GPIOB,2,9);                //PB2,AF9
         GPIO_AF_Set(GPIOB,10,9);        //PB10,AF9
         GPIO_AF_Set(GPIOC,10,9);        //PC10,AF9
         GPIO_AF_Set(GPIOD,11,9);        //PD10,AF9
         GPIO_AF_Set(GPIOE,2,9);                //PE2,AF9
         GPIO_AF_Set(GPIOE,7,10);        //PE7,AF10
         GPIO_AF_Set(GPIOE,8,10);        //PE8,AF10
         GPIO_AF_Set(GPIOE,9,10);        //PE9,AF10
         GPIO_AF_Set(GPIOE,10,10);        //PE10,AF10
        
               
        RCC->AHB3RSTR|=1<<14;                        //复位QSPI
        RCC->AHB3RSTR&=~(1<<14);        //停止复位QSPI
        if(QSPI_Wait_Flag(1<<5,0,0XFFFF)==0)//等待BUSY空闲
        {
                //QSPI时钟默认来自rcc_hclk3(由RCC_D1CCIPR的QSPISEL[1:0]选择)
                tempreg=(2-1)<<24;                //设置QSPI时钟为AHB时钟的1/2,即200M/2=100Mhz,10ns
                tempreg|=(4-1)<<8;                //设置FIFO阈值为4个字节(最大为31,表示32个字节)
                tempreg|=0<<7;                                //选择FLASH1
                tempreg|=1<<6;                                //双闪存模式
                tempreg|=1<<4;                                //采样移位半个周期(DDR模式下,必须设置为0)
                QUADSPI->CR=tempreg;        //设置CR寄存器
                tempreg=(8-1)<<16;                //设置FLASH大小为2^8=256
                tempreg|=(5-1)<<8;                //片选高电平时间为5个时钟(10*5=50ns),即手册里面的tSHSL参数
                tempreg|=1<<0;                                //Mode3,空闲时CLK为高电平
                QUADSPI->DCR=tempreg;        //设置DCR寄存器
                QUADSPI->CR|=1<<0;                //使能QSPI
        }
        
        else return 1;
        return 0;
}

//根据QSPI相关说明,我只要送出数据,指令、地址、交替都不要
//QSPI发送命令
//cmd:要发送的指令
//addr:发送到的目的地址
//mode:模式,详细位定义如下:
//mode[1:0]:指令模式;00,无指令;01,单线传输指令;10,双线传输指令;11,四线传输指令.
//mode[3:2]:地址模式;00,无地址;01,单线传输地址;10,双线传输地址;11,四线传输地址.
//mode[5:4]:地址长度;00,8位地址;01,16位地址;10,24位地址;11,32位地址.
//mode[7:6]:数据模式;00,无数据;01,单线传输数据;10,双线传输数据;11,四线传输数据.
//dmcycle:空指令周期数
void QSPI_Send_CMD(u8 cmd,u32 addr,u8 mode,u8 dmcycle)
{
        u32 tempreg=0;        
        u8 status;
        if(QSPI_Wait_Flag(1<<5,0,0XFFFF)==0)        //等待BUSY空闲
        {
                tempreg=0<<31;                                                //禁止DDR模式
                tempreg|=0<<28;                                                //每次都发送指令
                tempreg|=0<<26;                                                //间接写模式
                tempreg|=((u32)mode>>6)<<24;                //设置数据模式
                tempreg|=(u32)dmcycle<<18;                        //设置空指令周期数
                tempreg|=((u32)(mode>>4)&0X03)<<12;        //设置地址长度
                tempreg|=((u32)(mode>>2)&0X03)<<10;        //设置地址模式
                tempreg|=((u32)(mode>>0)&0X03)<<8;        //设置指令模式
                tempreg|=cmd;                                                //设置指令
               
               
                QUADSPI->CCR=tempreg;                                //设置CCR寄存器       
               
                if(mode&0X0C)                                                //有指令+地址要发送
                {
                        QUADSPI->AR=addr;                                //设置地址寄存器
                }
                if((mode&0XC0)==0)                                        //无数据传输,等待指令发送完成
                {
                        status=QSPI_Wait_Flag(1<<1,1,0XFFFF);//等待TCF,即传输完成
                        if(status==0)
                        {
                                QUADSPI->FCR|=1<<1;                        //清除TCF标志位
                        }
                }
               
        }       

               
        }        
}

。。。。        QSPI_Send_CMD(5,NULL,0,5);//???????????

while(1)
{
                                                                                QSPI_Transmit(DisplayArea+DisplayRowNumber*256,256);
}                        








回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2022-5-6 10:01:28 | 显示全部楼层
本帖最后由 missfox 于 2022-5-6 10:02 编辑

你好歹用HAL库或者LL库配置下,大家也好帮你查查,你撸一堆寄存器配置,谁有那闲工夫帮你看,你看我说的是不是有道理,楼主

CubeMX一键就可以生成代码。
代码不规范,亲人两行泪!
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-6 10:38:35 | 显示全部楼层
missfox 发表于 2022-5-6 10:01
你好歹用HAL库或者LL库配置下,大家也好帮你查查,你撸一堆寄存器配置,谁有那闲工夫帮你看,你看我说的是 ...

主要是看习惯了,HAL接触不多,生成的代码一时看不过来,另一方面也是为了提高速度
回复

使用道具 举报

23

主题

1443

回帖

1512

积分

至尊会员

积分
1512
发表于 2022-5-6 10:45:47 | 显示全部楼层
Wujianling 发表于 2022-5-6 10:38
主要是看习惯了,HAL接触不多,生成的代码一时看不过来,另一方面也是为了提高速度

使用LL库,无论是速度还是代码可读性比你这个强的不是一点半点,LL都是内联函数,直接寄存器配置代码里面铺开使用的。
代码不规范,亲人两行泪!
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-6 16:10:13 | 显示全部楼层
麻烦版主看一下,        QSPI_Send_CMD(5,NULL,0,5);//???????????
这个设置命令方式后,后面就只送数据,为什么不行
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112255
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-8 18:14:00 | 显示全部楼层
有一个大问题,我想用DUAL QSPI驱动LED的6个信号,但QSPI是专用的,现在不知道NCS信号接哪,不接不正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115691
QQ
发表于 2022-5-9 01:07:53 | 显示全部楼层
Wujianling 发表于 2022-5-8 18:14
有一个大问题,我想用DUAL QSPI驱动LED的6个信号,但QSPI是专用的,现在不知道NCS信号接哪,不接不正常

这种的不用接NCS,你这个就是当GPIO用了。再查查是怎么回事。

其实你这种不如使用FMC,32路扩展IO,使用简单性能好。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-9 10:08:25 | 显示全部楼层
谢谢,我了解一下,不过在速度上,应该是QSPI最快的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115691
QQ
发表于 2022-5-9 10:18:35 | 显示全部楼层
Wujianling 发表于 2022-5-9 10:08
谢谢,我了解一下,不过在速度上,应该是QSPI最快的

最高速一样。FMC驱动SDRAM速度了解下。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-9 10:42:48 | 显示全部楼层
DUAL QSPI我是按照它的格式,试了一个星期,都不行,其实想用QSPI是因为它可以连续发送很多数据后再LAT,但在它的介绍FIGURE 12中,发送一个字节不是BANK1I00-BANK1IO3 BANK2-IO0-IO3一起并出的,好奇怪 1.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115691
QQ
发表于 2022-5-9 10:53:50 | 显示全部楼层
Wujianling 发表于 2022-5-9 10:42
DUAL QSPI我是按照它的格式,试了一个星期,都不行,其实想用QSPI是因为它可以连续发送很多数据后再LAT,但 ...

STM32CubeH7里面的DUAL QSPI例子直接复制粘贴测试,一定有输出的,没有输出就太神奇了。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-9 11:26:12 | 显示全部楼层
我没有FLASH可以试,只是修改了里面的相关参数,如不读FLASH状态,指令发送的instrution这个随意等等
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115691
QQ
发表于 2022-5-9 11:28:15 | 显示全部楼层
Wujianling 发表于 2022-5-9 11:26
我没有FLASH可以试,只是修改了里面的相关参数,如不读FLASH状态,指令发送的instrution这个随意等等

不需要Flash啊。。。。颓了,这就跟串口一样,你不接串口设备也能输出串口信号的。

就聊这么多吧,结贴。
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-16 14:24:37 | 显示全部楼层
结贴,DUAL QSPI不可能驱动LED点阵屏,看10楼的图
回复

使用道具 举报

3

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2022-5-16 14:26:35 | 显示全部楼层
eric2013 发表于 2022-5-9 01:07
这种的不用接NCS,你这个就是当GPIO用了。再查查是怎么回事。

其实你这种不如使用FMC,32路扩展IO,使 ...

请问一下,像FMC驱动这个,好像要很多线,是不是很麻烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-12 07:54 , Processed in 0.285634 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表