打印

GD32F450 SQPI-PSRAM无法访问

[复制链接]
122|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gkcclm002|  楼主 | 2024-12-25 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

Hi
  我使用GD32F450,使用SQPI-PSRAM接口连接APM_PSRAM_QSPI_APS6404L,发现可以读到ID,但是读内存的时候就会发生HardFault。 代码如下。
  1. 读ID是 const volatile uint16_t id = EXMC_SIDL 这一行,结果是正确的。
  2. HardFault是int val = *ptr;

  感觉是MCU这边什么地方没有配置。感觉有几个奇怪的地方:
  1. 使用SQPI-PSRAM的时候,使用Bank0地址。但是Bank0也是给NorFlash使用的。那么如何选择呢?目前没有找到哪个寄存器配置的。
  2. 使用SQPI接口的时候,SPI CLK时钟频率是如何配置的?也没有找到。

  谢谢。

#define START_ADDR 0x60000000
#define MAX_SIZE SIZE_M(8)

static void gpio_config(void)
{
    typedef struct
    {
        uint32_t port;
        uint32_t pin;
    }gpio_t;

    gpio_t gpios[] =
    {
        {GPIOD, BIT(0)  },  //D2
        {GPIOD, BIT(1)  },  //D3
        {GPIOD, BIT(3)  },  //CLK
        {GPIOD, BIT(7)  },  //CS
        {GPIOD, BIT(14) },  //D0
        {GPIOD, BIT(15) },  //D1
    };

    rcu_periph_clock_enable(RCU_GPIOD);

    for(int i = 0; i < ARRAY_ELEMENTS(gpios); i++)
    {
        gpio_t* gpio = &gpios[i];

        gpio_mode_set(gpio->port, GPIO_MODE_AF, GPIO_PUPD_NONE, gpio->pin);
        gpio_af_set(gpio->port, GPIO_AF_12, gpio->pin);
        gpio_output_options_set(gpio->port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, gpio->pin);
    }
}

static void read_id(void)
{
    exmc_sqpipsram_read_command_set(EXMC_SQPIPSRAM_READ_MODE_SPI,
        0,
        0x9F);

    //wait EXMC_SRCMD_RDID to be zero
    while(IS_BIT_SET(EXMC_SRCMD, EXMC_SRCMD_RDID))
    {
    }

    SET_BIT(EXMC_SRCMD, EXMC_SRCMD_RDID);

    //wait EXMC_SRCMD_RDID to be zero
    while(IS_BIT_SET(EXMC_SRCMD, EXMC_SRCMD_RDID))
    {
    }

    const volatile uint16_t id = EXMC_SIDL;        //ID为0x0D5D,是正确的。

    printf("sdram id=%04x\n", id);
}

static void config_as_normal_read(void)
{
    exmc_sqpipsram_read_command_set(EXMC_SQPIPSRAM_READ_MODE_SPI,  0,  0x03);
}

static void simple_test(void)
{
    volatile char* ptr = (volatile char*)START_ADDR;
    *ptr = 1;
    int val = *ptr; // !!!!这里会发生HardFault
    *ptr = 2;
    val = *ptr;
}

void spiram_init(void)
{
    gpio_config();

    rcu_periph_clock_enable(RCU_EXMC);

    exmc_sqpipsram_parameter_struct param;
    exmc_sqpipsram_parameter_init(&param);

    param.id_length = EXMC_SQPIPSRAM_ID_LENGTH_16B;
    param.address_bits = EXMC_SQPIPSRAM_ADDR_LENGTH_24B;
    param.command_bits = EXMC_SQPIPSRAM_COMMAND_LENGTH_8B;
    exmc_sqpipsram_init(&param);

    exmc_sqpipsram_write_command_set(EXMC_SQPIPSRAM_WRITE_MODE_SPI,
        0,
        0x02);

    read_id();

    config_as_normal_read();   

    simple_test();
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝