硬汉嵌入式论坛

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

[SPI/QSPI] STMH743使用QSPI映射模式,读取0x90000000开始地址第一个字节错误

  [复制链接]

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2020-6-18 09:27:57 | 显示全部楼层 |阅读模式
STMH743使用QSPI映射模式,开始读取第一个字节错误,本来写进去第一个字节是0,读取出来第一个字节是1,第二个字节是2.....后面都正常.

正常应该是:
(0x90000000 + 0): 0
(0x90000000 + 1): 1
(0x90000000 + 2): 2
(0x90000000 + 3): 3
(0x90000000 + 4): 4
(0x90000000 + 5): 5
(0x90000000 + 6): 6
(0x90000000 + 7): 7
(0x90000000 + 8): 8
(0x90000000 + 9): 9
(0x90000000 + 10): 10


不正常的排序是:
(0x90000000 + 0): 1
(0x90000000 + 1): 2
(0x90000000 + 2): 3
(0x90000000 + 3): 4
(0x90000000 + 4): 5
(0x90000000 + 5): 6
(0x90000000 + 6): 7
(0x90000000 + 7): 8
(0x90000000 + 8): 9
(0x90000000 + 9): 10
(0x90000000 + 10): 11



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-6-18 10:50:34 | 显示全部楼层
还没有测试过内存模式,一直用的QSPI MDMA。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2020-6-18 11:35:04 | 显示全部楼层
如果在进入内存映射后,发现存在数据错位,例如:0x90000000 00 01 02 03... 变成了 0x90000000 01 02 03 04... 可以尝试修改进入内存映射时的 DummyCycles 。



  1.     QSPI_CommandTypeDef cmd;
  2.     QSPI_MemoryMappedTypeDef mem;

  3.     cmd.InstructionMode = QSPI_INSTRUCTION_4_LINES;
  4.     cmd.Instruction = W25X_FastRead;

  5.     cmd.AddressMode = QSPI_ADDRESS_4_LINES;
  6.     cmd.AddressSize = QSPI_ADDRESS_24_BITS;

  7.     cmd.DataMode = QSPI_DATA_4_LINES;

  8.     cmd.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;

  9. <span style="background-color: red;">    cmd.DummyCycles = 8;</span>
  10.     cmd.DdrMode = QSPI_DDR_MODE_DISABLE;
  11.     cmd.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  12.     cmd.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;

  13.     mem.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  14.     mem.TimeOutPeriod = 0;
复制代码


回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2020-6-18 16:24:48 | 显示全部楼层
用官方的程序,不要用论坛的,论坛的那个程序有问题,这个坑我也浪费好几天时间;
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
 楼主| 发表于 2020-6-18 16:52:42 | 显示全部楼层
zhaoqi 发表于 2020-6-18 11:35
如果在进入内存映射后,发现存在数据错位,例如:0x90000000 00 01 02 03... 变成了 0x90000000 01 02 03 0 ...

把sCommand.DummyCycles       = 6 改为 sCommand.DummyCycles       = 4
偏移问题可以解决.顺序对齐了.

uint8_t QSPI_EnableMemoryMappedMode(QSPI_HandleTypeDef *hqspi)
{
  QSPI_CommandTypeDef      sCommand = {0};
  QSPI_MemoryMappedTypeDef s_mem_mapped_cfg = {0};
  
  /*
  sCommand.Instruction           指令数据          @0x0 - 0xFF
  sCommand.Address               地址数据          @0x0 - 0xFFFFFFFF
  sCommand.AlternateBytes        交替字节数据      @0x0 - 0xFFFFFFFF
  sCommand.AddressSize           地址位数          @8/16/24/32
  sCommand.AlternateBytesSize    交替字节位数      @8/16/24/32
  sCommand.DummyCycles           空周期位数        @0 - 31
  sCommand.InstructionMode       指令发送模式      @无/1/2/4线
  sCommand.AddressMode           地址发送模式      @无/1/2/4线
  sCommand.AlternateByteMode     交替字节发送模式  @无/1/2/4线
  sCommand.DataMode              数据发送模式      @无/1/2/4线
  sCommand.NbData                数据发送长度      @0x0 - 0xFFFFFFFF
  sCommand.DdrMode               DDR模式           @使能/失能
  sCommand.DdrHoldHalfCycle      延迟输出数据      @使能/失能
  sCommand.SIOOMode              指令仅发送一次    @使能/失能
  */
  
  /* 基本配置 */
  sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;   /* 指令发送模式    :4线方式发送指令 */
  sCommand.AddressMode       = QSPI_ADDRESS_4_LINES;       /* 地址发送模式    :4线方式 */
  sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 交替字节发送模式:无需交替字节 */
  sCommand.DummyCycles       = 4;                          /* 空周期位数      :6  */
  sCommand.DataMode          = QSPI_DATA_4_LINES;          /* 数据发送模式    :4线方式 */
  sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /* DDR模式         :W25Q32JV不支持DDR */
  sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* 延迟输出数据    DR模式,数据输出延迟 */
  sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;   /* 指令仅发送一次  :每次传输都发指令 */
  
  /* 数据配置 */
  sCommand.Instruction       = CMD_Fast_Read_Quad_IO;  /* 快速读取四输入输出指令 */
  sCommand.Address           = 0x00000000;
  sCommand.AddressSize       = QSPI_ADDRESS_32_BITS;
  sCommand.AlternateBytes    = 0x00000000;
  sCommand.AlternateBytesSize= QSPI_ALTERNATE_BYTES_8_BITS;
  sCommand.NbData            = 0x00000000;
  
  /* Configure the memory mapped mode */
  s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  s_mem_mapped_cfg.TimeOutPeriod     = 0;
  
  if (HAL_QSPI_MemoryMapped(hqspi, &sCommand, &s_mem_mapped_cfg) != HAL_OK)
  {
    return 1;
  }
  
  return 0;
}
回复

使用道具 举报

0

主题

17

回帖

17

积分

新手上路

积分
17
发表于 2020-6-18 17:25:15 | 显示全部楼层
空周期再多配两个就好了
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-6-19 11:27:12 | 显示全部楼层
这种映射模式只能映射qspi接口的NOR flash(比如w25xx)是吧?Qspi接口的Nand flash是不是不可以?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-6-19 11:34:16 | 显示全部楼层
艾那的小强 发表于 2020-6-19 11:27
这种映射模式只能映射qspi接口的NOR flash(比如w25xx)是吧?Qspi接口的Nand flash是不是不可以?

回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2020-6-19 12:42:52 | 显示全部楼层
feelingcode 发表于 2020-6-18 16:52
把sCommand.DummyCycles       = 6 改为 sCommand.DummyCycles       = 4
偏移问题可以解决.顺序对齐了 ...

没用的,你即使改成4了看似读出数组数据对齐了,用分散加载定义到外部的图片数据,读出来全部错误,程序进hardfault错误;
回复

使用道具 举报

36

主题

1450

回帖

1558

积分

至尊会员

积分
1558
发表于 2020-6-20 23:54:37 | 显示全部楼层
这个要根据存储器型号进行填写。我这边填写6是没问题啊
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
 楼主| 发表于 2020-7-3 10:59:10 | 显示全部楼层
shuangbang 发表于 2020-6-19 12:42
没用的,你即使改成4了看似读出数组数据对齐了,用分散加载定义到外部的图片数据,读出来全部错误,程序 ...

测试了一下读取全部数据确实不对
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2020-7-7 09:51:55 | 显示全部楼层
feelingcode 发表于 2020-7-3 10:59
测试了一下读取全部数据确实不对

  • 不同的器件具有不同的特性,例如 W25Q128 和 W25Q256 的驱动有些区别,或许你可查看一下器件型号与驱动是否匹配
  • 生成一个全为 0x5A 的文件,写入到器件中,进入内存映射模式后,逐地址比较,看出现不同地方时候具有一致性、规律性
  • 附上计算 FLASH MD5 的代码
    1. unsigned char decrypt[16];
    2.     memset(decrypt, 0, sizeof(decrypt));
    3.     mbedtls_md5_context md5_ctx;
    4.     mbedtls_md5_init(&md5_ctx);
    5.     mbedtls_md5_starts(&md5_ctx);
    6.     mbedtls_md5_update(&md5_ctx, (unsigned char *)APPLICATION_ADDRESS, 32 * 1024 *1024);
    7.     mbedtls_md5_finish(&md5_ctx, decrypt);
    复制代码

回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
 楼主| 发表于 2020-7-14 19:07:29 | 显示全部楼层
使用安富来的qspi模块
*
*  模块名称 : W25Q256 QSPI驱动模块
*  文件名称 : bsp_qspi_w25q256.c
*  版    本 : V1.0
*  说    明 : 使用CPU的QSPI总线驱动串行FLASH,提供基本的读写函数,采用4线方式,MDMA传输

*
调用函数:
       /*初始化qspi*/
        bsp_InitQSPI_W25Q32();
        /* 进入存储映射模式 */
        QSPI_EnableMemoryMappedMode(&QSPIHandle);

出现问题:
       读取前一部分还正常,一旦出现一个数据不对后面的数据都跟着不对,但是数据还有规律性,不知道这个是驱动问题还是硬件设计问题。


(0x90000000 + 1000): 232
(0x90000000 + 1001): 233
(0x90000000 + 1002): 234
(0x90000000 + 1003): 235
(0x90000000 + 1004): 236
(0x90000000 + 1005): 237
(0x90000000 + 1006): 238
(0x90000000 + 1007): 239
(0x90000000 + 1008): 240
(0x90000000 + 1009): 241
(0x90000000 + 1010): 242
(0x90000000 + 1011): 243
(0x90000000 + 1012): 244
(0x90000000 + 1013): 245
(0x90000000 + 1014): 246
(0x90000000 + 1015): 247
(0x90000000 + 1016): 248
(0x90000000 + 1017): 249
(0x90000000 + 1018): 250
(0x90000000 + 1019): 251
(0x90000000 + 1020): 252
(0x90000000 + 1021): 253
(0x90000000 + 1022): 254
(0x90000000 + 1023): 255
(0x90000000 + 1024): 0
(0x90000000 + 1025): 1 != 5
(0x90000000 + 1025): 5
(0x90000000 + 1026): 2 != 6
(0x90000000 + 1026): 6
(0x90000000 + 1027): 3 != 7
(0x90000000 + 1027): 7
(0x90000000 + 1028): 4 != 8
(0x90000000 + 1028): 8
(0x90000000 + 1029): 5 != 9
(0x90000000 + 1029): 9
(0x90000000 + 1030): 6 != 10
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-7-14 19:12:19 | 显示全部楼层
feelingcode 发表于 2020-7-14 19:07
使用安富来的qspi模块
*
*  模块名称 : W25Q256 QSPI驱动模块

你搞错了,我们没有出内存映射模式的代码,近期就会安排,下一个BSP驱动章节更新QSPI Flash的所有相关案例,查询,中断,DMA,内存映射,MDK下载算法这四块,很快,近期就会发布
因为GUIX和第3版emWin教程急需。


当前我们是QSPI MDMA方式,其它的代码都不是我们写的。

STM32H7驱动QSPI Flash的4线DMA模式,读速度48MB/S左右,还不错
http://www.armbbs.cn/forum.php?mod=viewthread&tid=91616


基于STM32H7驱动QSPI Flash的FatFS文件系统 + QSPI Flash虚拟U盘实现,读速度24.6MB/S(2019-03-28)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=91634




回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
 楼主| 发表于 2020-7-15 09:34:35 | 显示全部楼层
eric2013 发表于 2020-7-14 19:12
你搞错了,我们没有出内存映射模式的代码,近期就会安排,下一个BSP驱动章节更新QSPI Flash的所有相关案 ...

好的,坐等3A大作发布。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-10-28 15:07:52 | 显示全部楼层
数据错位的问题还有后续吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-10-28 15:11:53 | 显示全部楼层
jerryshao 发表于 2020-10-28 15:07
数据错位的问题还有后续吗?

参考我的吧,这都解决了。

近期发布教程:

花式玩转QSPI Flash教程开始更新,下载算法制作,MDMA方式,内存映射方式,程序执行等一条龙
http://www.armbbs.cn/forum.php?m ... 0693&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-10-28 15:15:40 | 显示全部楼层
eric2013 发表于 2020-10-28 15:11
参考我的吧,这都解决了。

近期发布教程:

数据错位的原因是什么,两块板子,一个会错位,另一个没问题,不了解这个外设
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-10-28 15:19:55 | 显示全部楼层
jerryshao 发表于 2020-10-28 15:15
数据错位的原因是什么,两块板子,一个会错位,另一个没问题,不了解这个外设

首先保证同一个程序。

然后将你能用的板子芯片焊接下来焊接到不能用的板子上,如果有问题,板子没有焊接好。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-10-28 15:24:20 | 显示全部楼层
eric2013 发表于 2020-10-28 15:19
首先保证同一个程序。

然后将你能用的板子芯片焊接下来焊接到不能用的板子上,如果有问题,板子没有焊 ...

我这边板子PCB不一样(芯片一样),代码一样,是不是硬件的布线对这个有影响,才会出现数据错位。普通模式读取数据挺正常,内存映射模式就会出现错位
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107922
QQ
发表于 2020-10-28 15:29:03 | 显示全部楼层
jerryshao 发表于 2020-10-28 15:24
我这边板子PCB不一样(芯片一样),代码一样,是不是硬件的布线对这个有影响,才会出现数据错位。普通模 ...

对,我觉得是的,你可以降低QSPI时钟速度试试,降低GPIO速度等级试试,另外就是加大配置内存映射模式时的空指令周期长度。

可以降低干扰。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-10-28 16:03:32 | 显示全部楼层
前几个参数都测试过,刚才重点测试了空指令周期加长之后的情况,发现空指令可以影响数据错位的偏移个数,空指令数值越大,偏移个数越多,然后降到4个空指令周期一下没有作用,怀疑是片选的引脚速度够,修改了GPIO引脚的速度之后可以了。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2022-11-25 10:43:51 | 显示全部楼层
想问一下,用QSPI进行内存映射时,通过memory已经看到了内存里的数据是有的,但是一进行读取就会出现MemManage_Handler,不管是用for循环单个读还是用memcpy都会进入错误?想问一下可能是什么原因造成的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 17:14 , Processed in 0.228304 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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