硬汉嵌入式论坛

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

[SPI/QSPI] 请教,STM32H750+W25Q16擦除块的时候一直等不到BUSY状态变为0

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2023-10-7 11:43:24 | 显示全部楼层 |阅读模式
本帖最后由 yerdong 于 2023-10-7 11:48 编辑

驱动代码是移植ARMFLY例程:V7-050_串行SPI Flash W25QXX读写例程(DMA方式)
工程相关配置:

        MPU_Config();//ARMFLY例程直接搬过来的
        /*下面三句是原子的工程配置*/
        SCB_EnableICache(); /* 使能I-Cache,函数在core_cm7.h里面定义 */
        SCB_EnableDCache(); /* 使能D-Cache,函数在core_cm7.h里面定义 */
        SCB->CACR |= 1 << 2;/* 强制D-Cache透写,如不开启透写,实际使用中可能遇到各种问题 */

SPI配置:


问题:1、目前读芯片ID,稳定能读取上来0xEF4015,偶发性会把上次读取到存储在接收缓存区的数据当做chip id,多读几次正常。
调用sf_ReadBuffer后,偶发下次读取chipID时候返回的数据就是没有的,取用了之前buff里的数据。
(这里不太理解ARMFLY例程的发送接收回调,怀疑是数据发送完成后把传输完成标志置为完成,但是没有数据接收,所以取用了buf里之前旧的数据?)
发送接收等待的接口:

中断里把传输完成标志设置为完成:


问题:2、(感觉和问题1是同个原因)当前调用sf_AutoWriteSector写一块数据,很小的概率能正常写入并busy=0退出。
调用擦除块的时候,sf_WaitForWriteEnd();也是一直等待退不出来,busy位一直是1。这时候断电重启设备,去读取块的数据,发现擦除和写入操作都是执行成功了。

测试代码:

查询busy状态函数(接收buf的数据就是在这里打印的):






回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 11:49:00 | 显示全部楼层
粘贴的截图发不出来的嘛。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2023-10-7 11:49:23 | 显示全部楼层
1、主RAM空间不可以是DTCM地址,这个空间不支持DMA
2、主RAM空间可以使用AXI SRAM,即0x2400 0000, 参考此贴配置关闭AXI SRAM的Cache读写。这句话 SCB->CACR |= 1 << 2;删掉,

仅采用此贴的配置即可,配置为最低性能
https://www.armbbs.cn/forum.php?mod=viewthread&tid=99322

3、然后就是片选和SPI相关引脚务必正确配置到你的板子。特别是片选。另外就是降低SPI时钟试试和SPI所涉及到GPIO速度等级试试。

移植那个工程,主要就是这些,别的没有特别要注意的了。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 13:53:26 | 显示全部楼层
eric2013 发表于 2023-10-7 11:49
1、主RAM空间不可以是DTCM地址,这个空间不支持DMA
2、主RAM空间可以使用AXI SRAM,即0x2400 0000, 参考此 ...

主RAM使用AXI的设置方法是在魔术棒那里这么设置吗?
不勾选:0x20000000 0x20000
勾选:   0x24000000 0x80000
我的工程原本是两个都勾选的,改成上面这样,没什么效果。


我看ARMFLY V7开发板用户手册上73.9章节,RAM空间勾选的是DTCM噢?
(实际上,例程虽然使用DTCM作为主RAM,为了避免DTCM不支持DMA,是把DMA接收和发送的BUF定义到了SRAM4对吧,并在函数MPU_Config(); 设置了SRAM4关闭Cache)不知道我这么理解是否正确?

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 13:56:06 | 显示全部楼层
eric2013 发表于 2023-10-7 11:49
1、主RAM空间不可以是DTCM地址,这个空间不支持DMA
2、主RAM空间可以使用AXI SRAM,即0x2400 0000, 参考此 ...

因为现在是能正确读取chip ID,我认为片选和SPI引脚配置是没问题的。尝试把MOSI、MISO、CLK的IO速度设置为中等,SPI时钟分频用64,没什么效果
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 14:03:29 | 显示全部楼层
eric2013 发表于 2023-10-7 11:49
1、主RAM空间不可以是DTCM地址,这个空间不支持DMA
2、主RAM空间可以使用AXI SRAM,即0x2400 0000, 参考此 ...

另外:我的工程跑的是FreeRTOS
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2023-10-7 15:23:17 | 显示全部楼层
yerdong 发表于 2023-10-7 13:53
主RAM使用AXI的设置方法是在魔术棒那里这么设置吗?
不勾选:0x20000000 0x20000
勾选:   0x24000000  ...

理解的对。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2023-10-7 15:27:03 | 显示全部楼层
yerdong 发表于 2023-10-7 13:56
因为现在是能正确读取chip ID,我认为片选和SPI引脚配置是没问题的。尝试把MOSI、MISO、CLK的IO速度设置 ...

你的UID读取是用的DMA方式读的不。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 15:59:01 | 显示全部楼层
eric2013 发表于 2023-10-7 15:27
你的UID读取是用的DMA方式读的不。

是的,bsp_spiTransfer();用的同一个,打开了DMA的宏

您说的把SCB->CACR |= 1 << 2;这句话关闭,倒是检测busy=0成功率高了很多,但是读取块数据会错误,每次读出来数据不一样。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 16:02:23 | 显示全部楼层

这么来说的话,我按照例程的那么用也没问题。感觉问题还是出在了DMA的接收这里。
1、查询状态寄存器时候,数据发送误码导致应答结果错误?
2、或者是压根没收到数据应答,这个情况下,状态也能置为传输完成的么?


打算把接收和发送独立开来试试
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-10-7 20:08:59 | 显示全部楼层
验证用中断方式非常好用,先跳过赶项目进度了。
DMA的问题后续再回来查了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 01:27 , Processed in 0.427056 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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