打印

GD32F470 EXMC的冲突问题

[复制链接]
1468|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
关于同时使用EXMC上的 SRAM 区域(0X6000 0000至0X6FFF FFFF)与SDRAM区域(0XC000 0000 至 0XCFFF FFFF)会产生冲突的问题。

黄色代表对SDRAM的片选信号,蓝色代表对EXMC上外接网卡片选信号,同时访问时,不应该两者同时被选中,否则会造成地址线和数据线的冲突。
现在,两者有同时被选中的情况。

当对EXMC上外接的网卡进行读写时,读写结束,SDRAM恢复自刷新,之前有持续拉低SDRAM的信号,信号约2000ns。
以上是遇到的问题,希望有大神解答。

使用特权

评论回复
沙发
lly123456|  楼主 | 2023-4-10 16:42 | 只看该作者

使用特权

评论回复
板凳
lly123456|  楼主 | 2023-4-13 11:06 | 只看该作者
在GD32F470上的EXMC同时外接了,DM9000A和一块SDRAM。DM9000A使用的是NOR/PSRAM的BANK0 Regions1区域,使用的命令地址是0x64000100区域,数据地址是0x64000108区域。SDRAM使用的是SDRAM device0区域,是0XC000 0000这一地址起始。单独使用都是可以的,同时使用会出现冲突问题。

后来查了手册,DM9000A所使用的区域16位数据传输下,内部的地址线是这样对应的,HADDR[25:1]--->EXMC_A[24:0],根据HADDR[27:26]作为片选线。SDRAM所使用的区域在16位数据传输下,内部的地址线是这样对应的,HADDR[26:25]作为bank选中线,HADDR[24:12]作为行地址线,HADDR[11:1]作为列地址线。

会是这样的内部址线的冲突,让他们没办法同时使用吗?

使用特权

评论回复
地板
lly123456|  楼主 | 2023-4-27 09:07 | 只看该作者
问题已经解决了,是勘误手册上所说的,SDRAM和其他外设同时使用EXMC会有冲突的问题。建议分时复用,在操作SDRAM时,不操作其他的EXMC外设

使用特权

评论回复
5
chifu134| | 2023-5-9 10:50 | 只看该作者
楼主,请问下您用过gd32e503系列吗?m33内核。我现在把它配置成NOR和FPGA通信,始终不能成功。
这是我的初始化代码,还有时序参数
void Exmc_Norsram_Init()
{
        exmc_norsram_parameter_struct norsram_init_struct;
        exmc_norsram_timing_parameter_struct norsram_timing_init_struct;
        
        /* enable EXMC clock*/
        rcu_periph_clock_enable(RCU_EXMC);        //时钟使能
        rcu_periph_clock_enable(RCU_GPIOD);
        rcu_periph_clock_enable(RCU_GPIOE);
        rcu_periph_clock_enable(RCU_GPIOB);
        
        /* configure GPIO */
        /*************************************************************************
        * AD[0~1]:PD14/15        AD[2~3]:PD0/1        AD[4~12]:PE7~15                AD[13~15]:PD8~10
        * NADV:PB7        NE0:PD7         NWAIT:PD6        NWE:PD5         NOE:PD4        
        **************************************************************************/
    gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_4 |
                                                                                                                 GPIO_PIN_5  | GPIO_PIN_7  | GPIO_PIN_8 |
                                                                                                                 GPIO_PIN_9  | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15 );
    gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7  | GPIO_PIN_8  | GPIO_PIN_9  | GPIO_PIN_10 |
                                                                                                                 GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
        gpio_init(GPIOD, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
        
        
        norsram_timing_init_struct.asyn_address_setuptime = 6;//9
        norsram_timing_init_struct.asyn_address_holdtime = 3;//2
        norsram_timing_init_struct.asyn_data_setuptime = 11;//8
        norsram_timing_init_struct.bus_latency = 3;//1
        norsram_timing_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_2_CLK;//EXMC_SYN_CLOCK_RATIO_DISABLE;
        norsram_timing_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK;
        norsram_timing_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A;

        norsram_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0;
        norsram_init_struct.address_data_mux = ENABLE;
        norsram_init_struct.memory_type = EXMC_MEMORY_TYPE_NOR;
        norsram_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B;
        norsram_init_struct.burst_mode = DISABLE;
        norsram_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
        norsram_init_struct.wrap_burst_mode = DISABLE;
        norsram_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
        norsram_init_struct.memory_write = ENABLE;
        norsram_init_struct.nwait_signal = DISABLE;
        norsram_init_struct.extended_mode = DISABLE;
        norsram_init_struct.asyn_wait = DISABLE;
        norsram_init_struct.write_mode = EXMC_ASYN_WRITE;

        norsram_init_struct.read_write_timing = &norsram_timing_init_struct;            
        norsram_init_struct.write_timing = &norsram_timing_init_struct;        

        exmc_norsram_init(&norsram_init_struct);
        
        /* enable EXMC norsram bank0 */
        exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0);

屏幕截图 2023-05-09 103946.png (237.99 KB )

屏幕截图 2023-05-09 103946.png

使用特权

评论回复
6
caigang13| | 2023-5-9 19:41 | 只看该作者
不同的bank区域应该不会出现同时片选的问题啊

使用特权

评论回复
7
zchong| | 2024-8-8 06:40 | 只看该作者
lly123456 发表于 2023-4-27 09:07
问题已经解决了,是勘误手册上所说的,SDRAM和其他外设同时使用EXMC会有冲突的问题。建议分时复用,在操作S ...

根据勘误手册,Auto refresh function of SDRAM controller is influenced by other EXMC controller. When
SDRAM controller execute auto refresh command, if the SDRAM bank is active, the
precharge command shall be generated, which need EXMC_A10 port be 1. At that time,
EXMC_A10 port is used in other EXMC controller, then the SDRAM auto refresh command
execute abnormally which lead SDRAM data error.似乎和楼主的不完全是一回事,而且这个bug根据手册似乎无解,它是auto refresh命名执行过程出现的问题,而且只提到会造成sdram数据出错。分时复用解决不了这个问题,sdram控制器会自动发送auto refresh command,软件也不知道什么时候可以访问EXMC其它外设。

使用特权

评论回复
8
qn7a12| | 2024-8-31 11:11 | 只看该作者
理论上,这两个地址范围是不重叠的,但在配置时如果设置不当,可能会导致访问错误。

使用特权

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

本版积分规则

2

主题

14

帖子

0

粉丝