硬汉嵌入式论坛

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

[SPI/QSPI] 贡献一个H723外扩串行RAM的例子

  [复制链接]

5

主题

11

回帖

31

积分

新手上路

积分
31
发表于 2023-8-22 11:20:56 | 显示全部楼层 |阅读模式
本帖最后由 regsofweb 于 2023-8-23 09:49 编辑

APS6404L-3SQR,64M bits(8M bytes, 2^23) and connected to OSPI2 byQSPI mode
CubeMX settings:

psram1.png
Ensure all gpios' speed are set as "very high"

psram2.png
Parameters follow datasheet. The OSPI clk source is 125M.

psram3.png
Enable interrupt

psram4.png
Set as "Device" in MPU

#define PS_OSPI hospi2
#define OCTOSPIx_BASE OCTOSPI2_BASE
#define TOTAL_PS_SIZE (8*1024*1024)
// PSRAM commands
#define FAST_READ_QUAD 0xEB
#define QUAD_WRITE 0x38
#define ENTER_QUAD_MODE 0x35
#define EXIT_QUAD_MODE 0xF5
// settings refer to datasheet
#define FAST_READ_QUAD_DUMMY_CYCLES 6
#define WRITE_QUAD_DUMMY_CYCLES 0
#define ENTER_QUAD_DUMMY_CYCLES 0

void EnableMemMappedQuadMode(void) {
    OSPI_RegularCmdTypeDef sCommand;
    OSPI_MemoryMappedTypeDef sMemMappedCfg;
    sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
    sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_4_LINES;
    sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
    sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
    sCommand.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
    sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
    sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
    sCommand.DataMode = HAL_OSPI_DATA_4_LINES;
    sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
    sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
    sCommand.Address = 0;
    sCommand.NbData = 1;
    /* Memory-mapped mode configuration for Quad Read mode 4-4-4*/
    sCommand.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
    sCommand.Instruction = FAST_READ_QUAD;
    sCommand.DummyCycles = FAST_READ_QUAD_DUMMY_CYCLES;
    if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
            != HAL_OK) {
        Error_Handler();
    }
    /* Memory-mapped mode configuration for Quad Write mode 4-4-4*/
    sCommand.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
    sCommand.Instruction = QUAD_WRITE;
    sCommand.DummyCycles = WRITE_QUAD_DUMMY_CYCLES;
    sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
    if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
            != HAL_OK) {
        Error_Handler();
    }
    /*Disable timeout counter for memory mapped mode*/
    sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
    /*Enable memory mapped mode*/
    if (HAL_OSPI_MemoryMapped(&PS_OSPI, &sMemMappedCfg) != HAL_OK) {
        Error_Handler();
    }
}

void EnterQuadMode(void) {
    OSPI_RegularCmdTypeDef sCommand;
    sCommand.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
    sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
    sCommand.Instruction = ENTER_QUAD_MODE;
    sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
    sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
    sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
    sCommand.AddressMode = HAL_OSPI_ADDRESS_NONE;
    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
    sCommand.DataMode = HAL_OSPI_DATA_NONE;
    sCommand.DummyCycles = ENTER_QUAD_DUMMY_CYCLES;
    sCommand.DQSMode = HAL_OSPI_DQS_DISABLE;
    sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
    /*Enter QUAD mode*/
    if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
            != HAL_OK) {
        Error_Handler();
    }
}

int PsRamTest() {
    __IO uint32_t *mem_addr;
    uint32_t wr = 0x55000000;
    mem_addr = (__IO uint32_t*)OCTOSPIx_BASE;
    for (int i = 0; i < TOTAL_PS_SIZE/4; i++) {
        *mem_addr++ = wr++;
    }
    wr = 0x55000000;
    int errcnt = 0;
    mem_addr = (__IO uint32_t*)OCTOSPIx_BASE;
    for (int i = 0; i < TOTAL_PS_SIZE/4; i++) {
        if (*mem_addr++ != wr++) {
            errcnt++;
        }
    }
    return errcnt;
}


评分

参与人数 2金币 +120 收起 理由
江南月 + 20 赞一个!
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

4

主题

21

回帖

33

积分

新手上路

积分
33
发表于 2023-8-22 11:28:04 | 显示全部楼层
速度能上到多少
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-22 11:35:27 | 显示全部楼层
谢谢楼主分享,非常好的分享贴。之前还有网友咨询外接QSPI RAM

https://www.apmemory.com/wp-content/uploads/APS6404L-3SQR.pdf

QQ截图20230822113532.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-22 11:57:08 | 显示全部楼层

从他的截图来看,是配置的62.5M
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-8-22 14:02:10 | 显示全部楼层
eric2013 发表于 2023-8-22 11:35
谢谢楼主分享,非常好的分享贴。之前还有网友咨询外接QSPI RAM

https://www.apmemory.com/wp-content/up ...

测试部分在freertos中会有写错误,硬汉如果有空能不能帮忙分析一下可能是哪里的问题?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-23 08:22:45 | 显示全部楼层
regsofweb 发表于 2023-8-22 14:02
测试部分在freertos中会有写错误,硬汉如果有空能不能帮忙分析一下可能是哪里的问题?

加大下.DummyCycless是不是好点。
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-8-23 09:50:17 | 显示全部楼层
eric2013 发表于 2023-8-23 08:22
加大下.DummyCycless是不是好点。

搞定了,cache的问题,lz位已更新
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2023-8-23 13:43:35 | 显示全部楼层
这种串行RAM,一般用来做什么用途呢?
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-8-23 14:12:02 | 显示全部楼层
能直接DMA操作吗? 比如把ADC的数据用DMA送到串行RAM?
回复

使用道具 举报

0

主题

78

回帖

78

积分

初级会员

积分
78
发表于 2023-8-23 16:12:05 | 显示全部楼层
能直接读写吗?还是可以直接读,不能直接写?
回复

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2023-8-23 18:12:58 | 显示全部楼层
eric2013 发表于 2023-8-22 11:57
从他的截图来看,是配置的62.5M

请教下,他这个可以写吗?QSPI 内存映射模式是不是只能读啊?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-24 00:42:59 | 显示全部楼层
yunqi 发表于 2023-8-23 18:12
请教下,他这个可以写吗?QSPI 内存映射模式是不是只能读啊?

QSPI Flash不能写。

他这个是QSPI RAM,可以写。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-24 00:43:33 | 显示全部楼层
caicaptain2 发表于 2023-8-23 14:12
能直接DMA操作吗? 比如把ADC的数据用DMA送到串行RAM?

可以的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-24 00:43:48 | 显示全部楼层
quanqq2008 发表于 2023-8-23 16:12
能直接读写吗?还是可以直接读,不能直接写?

QSPI Flash不能写。

他这个是QSPI RAM,可以写。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-24 00:46:13 | 显示全部楼层
morning_enr6U 发表于 2023-8-23 13:43
这种串行RAM,一般用来做什么用途呢?

他这个是QSPI RAM,速度不慢,驱动60MHz,差不多速度得有20-30MB
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-24 00:46:27 | 显示全部楼层
regsofweb 发表于 2023-8-23 09:50
搞定了,cache的问题,lz位已更新


谢谢告知最终原因。
回复

使用道具 举报

5

主题

164

回帖

179

积分

初级会员

积分
179
发表于 2023-8-24 10:58:44 | 显示全部楼层
刚开始还挺惊讶,想着qspi的内存映射模式居然能写了,然后仔细查了手册才发现是因为楼主用的是OCTOSPI才能实现,这个外设确实支持内存映射写
下载 (1).png
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-8-26 17:49:36 | 显示全部楼层
这个对比SDRAM速度怎么样
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2023-8-26 21:21:00 | 显示全部楼层
这个串行RAM只有OCTOSPI才能实现吗,H743的QSPI不能写吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-27 09:21:53 | 显示全部楼层
244141084 发表于 2023-8-26 17:49
这个对比SDRAM速度怎么样

比不了SDRAM,SDRAM是16bit,32bit的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-27 09:25:18 | 显示全部楼层
dream9520 发表于 2023-8-26 21:21
这个串行RAM只有OCTOSPI才能实现吗,H743的QSPI不能写吗?

手册里面的说明是仅可以读

QQ截图20230827092507.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 02:06 , Processed in 0.255321 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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