psram无法通过映射地址写入

羊羊羊羊 · 55次点击 · 1个月前

配置了psram后, 可以通过qpi的接口往里写入, 并在配置ahb总线后可以通过映射地址读出。但是无法通过映射地址写入。



/* 片选选项 */
static const int cs = 0;
static HS_SF_Type *sf = HS_SF3;
static const psram_main_config_t sf_cfg = { .freq_hz = 64000000, .width = PSRAM_WIDTH_4LINE, .delay = 2 };

int psram_init(void)
{
    for (int i = 0; i < sizeof(psram_pins) / sizeof(psram_pins[0]); i++)
        pinmux_config(psram_pins[i].pin_index, psram_pins[i].pin_function);
    // open
    psram_open(sf);
    // config
    psram_config(sf, cs, &sf_cfg);
    co_delay_ms(5); // 上电后延时一会再读写
    /* 读id */
    uint32_t id = psram_read_id(sf, cs);
    /* 进入qpi模式 */
    psram_quad_enter(sf, cs);

#if 1
    /* 测试 */
    CO_ALIGN(4) static uint8_t sf_write_buf1[100] ;
    for (int i = 0; i < sizeof(sf_write_buf1); ++i)
        sf_write_buf1[i] = i;

#define SF_TEST_ADDRESS 0

    //这个qspi写入经证实是没问题的
    psram_write_quad_qpi(sf, cs, SF_TEST_ADDRESS,
                 (uint8_t *)sf_write_buf1, sizeof(sf_write_buf1));

    //配置成映射地址模式
    psram_config_t config;
    config.cmd_p0_bit_cnt = 8;
    config.cmd_p0_width = WIDTH_4BITS;
    config.cmd_p1_width = WIDTH_4BITS;
    config.cmd_p1_bit_cnt = 24;
    config.sw_dummy_cycle_cnt = 6;
    config.sdata_width = WIDTH_4BITS;
    config.sw_cfg_en = 1;

    psram_sw_config(sf, 0, &config, 0);

#define AHB_TEST_ADDRESS (0x60000000 + SF_TEST_ADDRESS)


    //通过映射地址读出数据,单读出是成功的

    volatile char *p = (char *)AHB_TEST_ADDRESS;
    for (int i = 0; i < sizeof(sf_write_buf1); i++) {
        log_info("0x%02X ", *p++);
    }
    log_info("\n\n");


    //通过映射地址写入数据

    volatile char *p_w = (char *)AHB_TEST_ADDRESS;

    //这一句写入会让系统卡死,触发看门狗   

    *p_w++ = 0x01;
#endif
    return 0;
}


被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站