求救!!!LM3S(Cortex-M3) 系列单片机 EPI 接口读写NorFlash出问题。



大家好,请教一个问题。

问题描述:我用LM3S(Cortex-M3) 系列单片机的EPI 接口读写2片NorFlash。采用 主机总线模式(x16), ALE + 双CSn配置。写入地址范围6000000-6FFFFFF。整个地址范围内,只有其中一片Flash被写入数据。
初始化配置代码如下:

void EPIPinConfig(void) {     SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);                                 //使能 EPI0 外设

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);                                //使能 GPIO B 外设     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);                                  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);                                   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);                                    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);                                        GPIOPinConfigure(GPIO_PH3_EPI0S0);                                              GPIOPinConfigure(GPIO_PH2_EPI0S1);         GPIOPinConfigure(GPIO_PC4_EPI0S2);      GPIOPinConfigure(GPIO_PC5_EPI0S3);      GPIOPinConfigure(GPIO_PC6_EPI0S4);      GPIOPinConfigure(GPIO_PC7_EPI0S5);     GPIOPinConfigure(GPIO_PH0_EPI0S6);         GPIOPinConfigure(GPIO_PH1_EPI0S7);      GPIOPinConfigure(GPIO_PE0_EPI0S8);      GPIOPinConfigure(GPIO_PE1_EPI0S9);        GPIOPinConfigure(GPIO_PH4_EPI0S10);     GPIOPinConfigure(GPIO_PH5_EPI0S11);         GPIOPinConfigure(GPIO_PF4_EPI0S12);      GPIOPinConfigure(GPIO_PG0_EPI0S13);      GPIOPinConfigure(GPIO_PG1_EPI0S14);      GPIOPinConfigure(GPIO_PF5_EPI0S15);     GPIOPinConfigure(GPIO_PJ0_EPI0S16);         GPIOPinConfigure(GPIO_PJ1_EPI0S17);      GPIOPinConfigure(GPIO_PJ2_EPI0S18);      GPIOPinConfigure(GPIO_PJ3_EPI0S19);        GPIOPinConfigure(GPIO_PD2_EPI0S20);     GPIOPinConfigure(GPIO_PD3_EPI0S21);         GPIOPinConfigure(GPIO_PB5_EPI0S22);      GPIOPinConfigure(GPIO_PB4_EPI0S23);      GPIOPinConfigure(GPIO_PE2_EPI0S24);       GPIOPinConfigure(GPIO_PE3_EPI0S25);     GPIOPinConfigure(GPIO_PH6_EPI0S26);         GPIOPinConfigure(GPIO_PH7_EPI0S27);     GPIOPinConfigure(GPIO_PJ4_EPI0S28);      GPIOPinConfigure(GPIO_PJ5_EPI0S29);         GPIOPinConfigure(GPIO_PJ6_EPI0S30);            //设置 EPI 引脚     GPIOPinTypeEPI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);     GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);     GPIOPinTypeEPI(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_3);     GPIOPinTypeEPI(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);     GPIOPinTypeEPI(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_5 );     GPIOPinTypeEPI(GPIO_PORTG_BASE, GPIO_PIN_0 | GPIO_PIN_1);      GPIOPinTypeEPI(GPIO_PORTH_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);     GPIOPinTypeEPI(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); }

void  EPIH16Init(void) {       EPIDividerSet(EPI0_BASE, 1);                                                // EPI时钟配置,2分频         EPIModeSet(EPI0_BASE, EPI_MODE_HB16);                                       // 16位host-bus模式配置          EPIConfigHB16Set(EPI0_BASE,                                                 // EPI基址                      EPI_HB16_MODE_ADMUX |                                      // 地址线和数据线混合:AD[0-15]                      EPI_HB16_CSCFG_ALE_DUAL_CS |                               // EPI30作为ALE,EPI27和EPI26分别作为CS0和CS1                      EPI_HB16_WRWAIT_0 |                                        // 无写延时                      EPI_HB16_RDWAIT_0,                                         // 无读延时                      0 );         EPIAddressMapSet(EPI0_BASE,                                                 // EPI基址                      EPI_ADDR_RAM_BASE_6 |                                      // 内存地址映射从0x6000_0000开始                      EPI_ADDR_RAM_SIZE_256MB);                                  // 内存地址空间大小256MB         while(HWREG(EPI0_BASE + EPI_O_STAT) & EPI_STAT_INITSEQ);                    // Wait for the EPI initialization to complete. }

 

 

  • 不好意思,从新贴一下程序初始化代码:

    void EPIPinConfig(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); //使能 EPI0 外设

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //使能 GPIO B 外设
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);

    GPIOPinConfigure(GPIO_PH3_EPI0S0);
    GPIOPinConfigure(GPIO_PH2_EPI0S1);
    GPIOPinConfigure(GPIO_PC4_EPI0S2);
    GPIOPinConfigure(GPIO_PC5_EPI0S3);
    GPIOPinConfigure(GPIO_PC6_EPI0S4);
    GPIOPinConfigure(GPIO_PC7_EPI0S5);
    GPIOPinConfigure(GPIO_PH0_EPI0S6);
    GPIOPinConfigure(GPIO_PH1_EPI0S7);
    GPIOPinConfigure(GPIO_PE0_EPI0S8);
    GPIOPinConfigure(GPIO_PE1_EPI0S9);

    GPIOPinConfigure(GPIO_PH4_EPI0S10);
    GPIOPinConfigure(GPIO_PH5_EPI0S11);
    GPIOPinConfigure(GPIO_PF4_EPI0S12);
    GPIOPinConfigure(GPIO_PG0_EPI0S13);
    GPIOPinConfigure(GPIO_PG1_EPI0S14);
    GPIOPinConfigure(GPIO_PF5_EPI0S15);
    GPIOPinConfigure(GPIO_PJ0_EPI0S16);
    GPIOPinConfigure(GPIO_PJ1_EPI0S17);
    GPIOPinConfigure(GPIO_PJ2_EPI0S18);
    GPIOPinConfigure(GPIO_PJ3_EPI0S19);

    GPIOPinConfigure(GPIO_PD2_EPI0S20);
    GPIOPinConfigure(GPIO_PD3_EPI0S21);
    GPIOPinConfigure(GPIO_PB5_EPI0S22);
    GPIOPinConfigure(GPIO_PB4_EPI0S23);
    GPIOPinConfigure(GPIO_PE2_EPI0S24);
    GPIOPinConfigure(GPIO_PE3_EPI0S25);
    GPIOPinConfigure(GPIO_PH6_EPI0S26);
    GPIOPinConfigure(GPIO_PH7_EPI0S27);
    GPIOPinConfigure(GPIO_PJ4_EPI0S28);
    GPIOPinConfigure(GPIO_PJ5_EPI0S29);

    GPIOPinConfigure(GPIO_PJ6_EPI0S30);

    //设置 EPI 引脚
    GPIOPinTypeEPI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    GPIOPinTypeEPI(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinTypeEPI(GPIO_PORTE_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinTypeEPI(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_5 );
    GPIOPinTypeEPI(GPIO_PORTG_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    GPIOPinTypeEPI(GPIO_PORTH_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    GPIOPinTypeEPI(GPIO_PORTJ_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);
    }


    void EPIH16Init(void)
    {
    EPIDividerSet(EPI0_BASE, 1); // EPI时钟配置,2分频

    EPIModeSet(EPI0_BASE, EPI_MODE_HB16); // 16位host-bus模式配置

    EPIConfigHB16Set(EPI0_BASE, // EPI基址
    EPI_HB16_MODE_ADMUX | // 地址线和数据线混合:AD[0-15]
    EPI_HB16_CSCFG_ALE_DUAL_CS | // EPI30作为ALE,EPI27和EPI26分别作为CS0和CS1
    EPI_HB16_WRWAIT_0 | // 无写延时
    EPI_HB16_RDWAIT_0, // 无读延时
    0 );

    EPIAddressMapSet(EPI0_BASE, // EPI基址
    EPI_ADDR_RAM_BASE_6 | // 内存地址映射从0x6000_0000开始
    EPI_ADDR_RAM_SIZE_256MB); // 内存地址空间大小256MB

    while(HWREG(EPI0_BASE + EPI_O_STAT) & EPI_STAT_INITSEQ); // Wait for the EPI initialization to complete.
    }

  • 只有一片被写入,是切换的时候出了问题么?你抓两片flash的时序看看,是不是第二片没执行写操作,还是写进去错误呢