APP OSPI驱动
该驱动仅适用于GR5526。
宏定义
OSPI_PSRAM_DEVICE_ID
| 描述 | 值 |
|---|---|
| PSRAM ID |
0x13 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
OSPI_PSRAM_MIN_XIP_ADDRESS
| 描述 | 值 |
|---|---|
| XIP基地址 |
OSPI0_XIP_BASE(0x30080000UL) |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
OSPI_PSRAM_MAX_XIP_ADDRESS
| 描述 | 值 |
|---|---|
| 64 Mbit空间,最大XIP地址 |
(OSPI0_XIP_BASE + 0x7FFFFF) |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
OSPI_PSRAM_BYTE_SIZE
| 描述 | 值 |
|---|---|
| PSRAM空间大小 |
0x800000 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
结构体
app_graphics_ospi_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_ospi_clock_freq_e ospi_freq |
OSPI时钟频率 |
该参数的取值可以是下列值中的任意一个:
|
| app_ospi_psram_drv_strength_e drv_strength |
OSPI驱动强度, 驱动强度越大功耗越高 |
该参数的取值可以是下列值中的任意一个:
|
| app_ospi_psram_rd_latency_e rd_lc |
读访问latency |
该参数的取值可以是下列值中的任意一个:
|
| app_ospi_psram_wr_latency_e wr_lc |
写访问latency |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t phy_delay |
DQS PHY延时档位 |
该参数的取值可以是下列值中的任意一个:
|
| uint8_t is_read_prefetch |
是否开启预取功能 |
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
枚举
app_ospi_clock_freq_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_CLOCK_FREQ_48MHz = 0x00 |
OSPI时钟频率48 MHz |
| OSPI_CLOCK_FREQ_32MHz = 0x01 |
OSPI时钟频率32 MHz |
| OSPI_CLOCK_FREQ_24MHz = 0x02 |
OSPI时钟频率24 MHz |
| OSPI_CLOCK_FREQ_16MHz = 0x03 |
OSPI时钟频率16 MHz |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_phy_delay_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_PHY_DELAY_TAP_2 = 0x01 |
DQS Phy延时档位2 |
| OSPI_PHY_DELAY_TAP_3 = 0x02 |
DQS Phy延时档位3(只能在频率小于等于32 MHz下使用) |
| OSPI_PHY_DELAY_TAP_4 = 0x03 |
DQS Phy延时档位4(只能在频率小于等于32 MHz下使用) |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_psram_drv_strength_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_PSRAM_DRV_STR_FULL = 0x00 |
PSRAM采用最强驱动 |
| OSPI_PSRAM_DRV_STR_HALF = 0x01 |
PSRAM采用1/2强度驱动 |
| OSPI_PSRAM_DRV_STR_ONE_FORTH = 0x02 |
PSRAM采用1/4强度驱动 |
| OSPI_PSRAM_DRV_STR_ONE_EIGHTH = 0x03 |
PSRAM采用1/8强度驱动 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_psram_rd_latency_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_PSRAM_RD_LATENCY_3 = 0x00 |
配置读latency为3 |
| OSPI_PSRAM_RD_LATENCY_4 = 0x01 |
配置读latency为4 |
| OSPI_PSRAM_RD_LATENCY_5 = 0x02 |
配置读latency为5 |
| OSPI_PSRAM_RD_LATENCY_6 = 0x03 |
配置读latency为6 |
| OSPI_PSRAM_RD_LATENCY_7 = 0x04 |
配置读latency为7 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_psram_wr_latency_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_PSRAM_WR_LATENCY_3 = 0x00 |
配置写latency为3 |
| OSPI_PSRAM_WR_LATENCY_4 = 0x04 |
配置写latency为4 |
| OSPI_PSRAM_WR_LATENCY_5 = 0x02 |
配置写latency为5 |
| OSPI_PSRAM_WR_LATENCY_6 = 0x06 |
配置写latency为6 |
| OSPI_PSRAM_WR_LATENCY_7 = 0x01 |
配置写latency为7 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_access_mode_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_ACCESS_MEMORY = 0 |
访问PSRAM的内存 |
| OSPI_ACCESS_REGISTER |
访问PSRAM的控制寄存器 |
| OSPI_ACCESS_UNSET |
未使用 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_work_state_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_STATE_DEEP_SLEEP = 0 |
深度睡眠,除寄存器数据,所有内存数据擦除 |
| OSPI_STATE_HALF_SLEEP = 1 |
浅度睡眠,所有数据保留 |
| OSPI_STATE_ACTIVE = 2 |
激活状态,不进入睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
app_ospi_pasr_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| OSPI_PASR_FULL = 0x00 |
全部刷新 |
| OSPI_PASR_BOTTOM_4MB = 0x01 |
刷新范围为低4 MB空间 |
| OSPI_PASR_BOTTOM_2MB = 0x02 |
刷新范围为低2 MB空间 |
| OSPI_PASR_BOTTOM_1MB = 0x03 |
刷新范围为低1 MB空间 |
| OSPI_PASR_NONE = 0x04 |
关闭刷新 |
| OSPI_PASR_TOP_4MB = 0x05 |
刷新范围为高4 MB空间 |
| OSPI_PASR_TOP_2MB = 0x06 |
刷新范围为高2 MB空间 |
| OSPI_PASR_TOP_1MB = 0x07 |
刷新范围为高1 MB空间 |
| OSPI_PASR_MAX |
刷新模式个数,仅用于参数检查 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_graphics_ospi.h。
接口函数
| API | 芯片 | |
|---|---|---|
| GR551x/GR5x25/GR533x/GR5405 | GR5526 | |
| app_graphics_ospi_init |
N |
Y |
| app_graphics_ospi_deinit |
N |
Y |
| app_graphics_ospi_reset |
N |
Y |
| app_graphics_ospi_register_psram_reload_func |
N |
Y |
| app_graphics_ospi_set_sleep_state |
N |
Y |
| app_graphics_ospi_get_sleep_state |
N |
Y |
| app_graphics_ospi_get_base_address |
N |
Y |
| app_graphics_ospi_set_pasr |
N |
Y |
| app_graphics_is_ospi_address |
N |
Y |
| app_graphics_ospi_set_read_prefetch |
N |
Y |
| app_graphics_ospi_get_read_prefetch |
N |
Y |
| app_graphics_ospi_get_byte_size |
N |
Y |
| app_graphics_ospi_pasr_update |
N |
Y |
| app_graphics_ospi_set_power_state |
N |
Y |
app_graphics_ospi_init
| 函数原型 | uint16_t app_graphics_ospi_init(app_graphics_ospi_params_t * p_params) |
|---|---|
| 功能说明 | 初始化OSPI |
| 输入参数 | p_params:初始化参数的结构体指针 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_graphics_ospi_deinit
| 函数原型 | void app_graphics_ospi_deinit(void) |
|---|---|
| 功能说明 | 反初始化OSPI |
| 输入参数 | |
| 返回值 | |
| 备注 |
app_graphics_ospi_reset
| 函数原型 | void app_graphics_ospi_reset(void) |
|---|---|
| 功能说明 | 软件复位PSRAM |
| 输入参数 | |
| 返回值 | |
| 备注 | 复位后,PSRAM控制参数恢复成出厂状态,但数据不变化 |
app_graphics_ospi_register_psram_reload_func
| 函数原型 | void app_graphics_ospi_register_psram_reload_func(psram_reload_func_t psram_reload_func) |
|---|---|
| 功能说明 | 设置重载函数的指针 |
| 输入参数 | psram_reload_func:进行资源重载的函数指针 |
| 返回值 | |
| 备注 | PSRAM深度睡眠被唤醒后,会执行指针指向的重载函数(包括PSRAM内存资源重载等操作) |
app_graphics_ospi_set_sleep_state
| 函数原型 | void app_graphics_ospi_set_sleep_state(app_ospi_work_state_e state) |
|---|---|
| 功能说明 | 设置系统休眠时OSPI PSRAM的工作状态 |
| 输入参数 | state:系统休眠时OSPI PSRAM的工作状态 |
| 返回值 | |
| 备注 |
app_graphics_ospi_get_sleep_state
| 函数原型 | app_ospi_work_state_e app_graphics_ospi_get_sleep_state(void) |
|---|---|
| 功能说明 | 获取系统休眠时OSPI PSRAM的工作状态 |
| 输入参数 | |
| 返回值 | 系统休眠时OSPI PSRAM的工作状态 |
| 备注 |
app_graphics_ospi_get_base_address
| 函数原型 | uint32_t app_graphics_ospi_get_base_address(void) |
|---|---|
| 功能说明 | 获取OSPI PSRAM基地址 |
| 输入参数 | |
| 返回值 | PSRAM基地址 |
| 备注 |
app_graphics_ospi_set_pasr
| 函数原型 | void app_graphics_ospi_set_pasr(app_ospi_pasr_e area) |
|---|---|
| 功能说明 | 开始自刷新PSRAM指定区域 |
| 输入参数 | |
| 返回值 | |
| 备注 | 进行刷新的空间会进行数据保持,不刷新区域不会进行数据保持,按需刷新以节省功耗 |
app_graphics_ospi_pasr_update
| 函数原型 | void app_graphics_ospi_pasr_update(uint32_t psram_addr) |
|---|---|
| 功能说明 | 通过使用地址配置PSRAM的自刷新区域 |
| 输入参数 | PSRAM的最高使用地址(绝对地址) |
| 返回值 | |
| 备注 | 该函数最终调用app_graphics_ospi_set_pasr(app_ospi_pasr_e area)实现自刷新 |
app_graphics_ospi_set_power_state
| 函数原型 | void app_graphics_ospi_set_power_state(app_ospi_work_state_e state) |
|---|---|
| 功能说明 | 设置OSPI工作状态 |
| 输入参数 | |
| 返回值 | |
| 备注 |
|
app_graphics_ospi_get_byte_size
| 函数原型 | uint32_t app_graphics_ospi_get_byte_size(void) |
|---|---|
| 功能说明 | 获取OSPI PSRAM空间大小 |
| 输入参数 | |
| 返回值 | PSRAM空间大小,以byte为单位 |
| 备注 |
app_graphics_is_ospi_address
| 函数原型 | __STATIC_INLINE bool app_graphics_is_ospi_address(uint32_t address) |
|---|---|
| 功能说明 | 检查地址是否在OSPI的PSRAM上 |
| 输入参数 | address:需检查的地址 |
| 返回值 |
|
| 备注 |
app_graphics_ospi_set_read_prefetch
| 函数原型 | __STATIC_INLINE void app_graphics_ospi_set_read_prefetch(bool enable) |
|---|---|
| 功能说明 | 使能/不使能预读取PSRAM |
| 输入参数 |
|
| 返回值 | |
| 备注 |
app_graphics_ospi_get_read_prefetch
| 函数原型 | __STATIC_INLINE bool app_graphics_ospi_get_read_prefetch(void) |
|---|---|
| 功能说明 | 判断OSPI是否激活预读取配置 |
| 输入参数 | |
| 返回值 |
|
| 备注 |
示例工程
读写PSRAM
该示例工程仅适用于GR5526。
示例工程主要实现对PSRAM内存的读写,工程路径:SDK_Folder\projects\peripheral\ospi\app_ospi_random_access。
流程图
初始化参数
init.ospi_freq = O_PSRAM_TEST_CLOCK_FREQ ;
init.drv_strength = O_PSRAM_TEST_DRV_STRNGTH ;
init.rd_lc = O_PSRAM_TEST_RD_LATENCY ;
init.wr_lc = O_PSRAM_TEST_WR_LATENCY ;
init.phy_delay = O_PSRAM_TEST_PHY_DELAY ;
init.is_read_prefetch = O_PSRAM_TEST_PREFETCH ;
app_graphics_ospi_init(&init);
-
init.ospi_freq:时钟频率O_PSRAM_TEST_CLOCK_FREQ,定义为OSPI_CLOCK_FREQ_48MHz,代表OSPI时钟频率48 MHz
-
init.drv_strength:OSPI驱动强度O_PSRAM_TEST_DRV_STRNGTH,定义为OSPI_PSRAM_DRV_STR_ONE_FORTH,代表OSPI驱动强度为100 ohm
-
init.rd_lc:读访问latency选择O_PSRAM_TEST_RD_LATENCY,定义为OSPI_PSRAM_RD_LATENCY_3,代表读访问latency3
-
init.wr_lc:写访问latency选择O_PSRAM_TEST_WR_LATENCY,定义为OSPI_PSRAM_WR_LATENCY_3,代表写访问latency3
-
init.phy_delay:DQS Phy延时选择O_PSRAM_TEST_PHY_DELAY,定义为OSPI_PHY_DELAY_TAP_2,代表DQS Phy延时档位2
-
init.is_read_prefetch:是否开启预取功能,选择O_PSRAM_TEST_PREFETCH,定义为0,代表不开启预取功能
重要函数
-
获取PSRAM基地址
app_graphics_ospi_get_base_address() -
初始化OSPI
ospi_init() -
写PSRAM
cpu_write(base_addr, (char*)s_pattern_data, beat_length) -
读PSRAM
cpu_read(base_addr, (char*)x_data, beat_length) -
设置OSPI模块工作状态为激活态
app_graphics_ospi_set_power_state(OSPI_STATE_ACTIVE)
测试验证
示例工程实现不同数据传输模式和不同工作状态下,PSRAM的读写,具体测试可以根据需要进行选择。默认选择CPU+DEEP_SLEEP,连接开发板到PC端,打开串口调试助手,打印读PSRAM的错误率。
+++ Prepare Write-Data OK !
+++ HalfSleep CPU Access Test, Failed/Total: 0/100
X
eee
+++ HalfSleep CPU Access Test, Failed/Total: 0/200
X
eee
+++ HalfSleep CPU Access Test, Failed/Total: 0/300
X
eee
+++ HalfSleep CPU Access Test, Failed/Total: 0/400
X
eee
+++ HalfSleep CPU Access Test, Failed/Total: 0/500
app_graphics_ospi_init(&init);