-
GD32F450 SQPI-PSRAM无法访问 sos
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(); }
1261浏览量 0回复量 关注量 -
AT32F435的XMC在同步复用模式下时钟引脚为什么没有信号?
AT32F435ZMT7芯片中的XMC在使用同步复用模式连接PSRAM时,PD3CLK引脚为什么没有时钟啊? 这是我的初始化函数代码 gpio_init_struct.gpio_pins = GPIO_PINS_3; //CLK gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(GPIOD, &gpio_init_struct); /*-- xmc configuration ------------------------------------------------------*/ xmc_norsram_default_para_init(&xmc_norsram_init_struct); xmc_norsram_init_struct.subbank = XMC_BANK1_NOR_SRAM3; //XMC_BANK1_NOR_SRAM3 xmc_norsram_init_struct.data_addr_multiplex = XMC_DATA_ADDR_MUX_ENABLE; //复用 xmc_norsram_init_struct.device = XMC_DEVICE_PSRAM; //PSRAM设备 xmc_norsram_init_struct.bus_type = XMC_BUSTYPE_16_BITS; //16bit xmc_norsram_init_struct.burst_mode_enable = XMC_BURST_MODE_ENABLE; //突发模式配置 xmc_norsram_init_struct.asynwait_enable = XMC_ASYN_WAIT_DISABLE; //异步传输期间等待信号使能控制 xmc_norsram_init_struct.wait_signal_lv = XMC_WAIT_SIGNAL_LEVEL_LOW; //等待信号极性,在同步模式下,此位设置NWAIT 信号极性 xmc_norsram_init_struct.wrapped_mode_enable = XMC_WRAPPED_MODE_DISABLE; //支持非对齐的成组模式,XMC 于同步模式时是否支持将非对齐的AHB 成组操作拆成2 次操作 xmc_norsram_init_struct.wait_signal_config = XMC_WAIT_SIGNAL_SYN_BEFORE; //等待时序配置,仅在同步模式有效 xmc_norsram_init_struct.write_enable = XMC_WRITE_OPERATION_ENABLE; //写使能位 xmc_norsram_init_struct.wait_signal_enable = XMC_WAIT_SIGNAL_ENABLE; //同步传输期间等待信号使能位 xmc_norsram_init_struct.write_timing_enable = XMC_WRITE_TIMING_DISABLE; //读写时序不同控制位,读存储器与写存储器使用不同的时序进行操作,即SRAM/NOR 闪存写时序寄存器(XMC_BKxTMGWR)被开放 xmc_norsram_init_struct.write_burst_syn = XMC_WRITE_BURST_SYN_ENABLE; //对存储器写操作位 xmc_nor_sram_init(&xmc_norsram_init_struct); /* timing configuration */ xmc_norsram_timing_default_para_init(&rw_timing_struct, &w_timing_struct); rw_timing_struct.subbank = XMC_BANK1_NOR_SRAM3; //指定需要复位的subbank rw_timing_struct.write_timing_enable = XMC_WRITE_TIMING_DISABLE; //读写时序不同控制位,读存储器与写存储器使用不同的时序进行操作,即SRAM/NOR 闪存写时序寄存器(XMC_BKxTMGWR)被开放 rw_timing_struct.addr_hold_time = 0x00; //地址保持时间 rw_timing_struct.addr_setup_time = 0x00; //地址建立时间 rw_timing_struct.data_setup_time = 0x00; //数据建立时间 rw_timing_struct.data_latency_time = 0x0A; //数据延迟,仅在同步模式有效 rw_timing_struct.bus_latency_time = 0x0; //总线延迟时间,为了防止数据总线发生冲突,在复用模式或同步模式时,一次读操作之后XMC在数据总线上插入延迟 rw_timing_struct.clk_psc = 0x0; //时钟分频系数,仅在同步模式有效,定义XMC_CLK 时钟的频率 rw_timing_struct.mode = XMC_ACCESS_MODE_A; //异步访问模式选择位,只在RWTD 位使能时有效 w_timing_struct.subbank = XMC_BANK1_NOR_SRAM3; w_timing_struct.write_timing_enable = XMC_WRITE_TIMING_DISABLE; w_timing_struct.addr_hold_time = 0x00; w_timing_struct.addr_setup_time = 0x00; w_timing_struct.data_setup_time = 0x00; w_timing_struct.data_latency_time = 0x0A; w_timing_struct.bus_latency_time = 0x0; w_timing_struct.clk_psc = 0x0; w_timing_struct.mode = XMC_ACCESS_MODE_A; xmc_nor_sram_timing_config(&rw_timing_struct, &w_timing_struct);
1322浏览量 1回复量 关注量 -
GD MCU 是否支持 Xccela 协议的 PSRAM? sos
GD MCU 是否支持 Xccela 协议的 PSRAM?比如:APmemory 的 x8 bit Xccela PSRAM,型号:APS12808L-OBM
5495浏览量 0回复量 关注量