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(¶m);
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(¶m);
exmc_sqpipsram_write_command_set(EXMC_SQPIPSRAM_WRITE_MODE_SPI,
0,
0x02);
read_id();
config_as_normal_read();
simple_test();
}
|