问题描述:
我打算用EPI接口读写2片NorFlash,2片NorFlash的片选信号通过EPI0S27 和EPI0S26实现。
数据手册中的2端关键描述截图如下:
图片1
图片2
根据资料描述,EPIHB16CFG2寄存器的 CSCFG 位选择 0x3(ALE+双CSn配置)。 EPI0S30 用作地址锁存 (ALE); EPI0S27 用作 CS1n; EPI0S26用作 CS0n。 CS0n 和 CS1n 是否生效均由相应映射空间中的最高地址位决定。
实验出的结果:
通过地址映射,基地址设置成0x6000_0000,映射地址范围0x000_0000~0xfff_ffff;
那么通过实际的写入地址,地址范围 0x6000_0000~0x67ff_ffff内,地址最高位为0,CS0n应该生效(CS1n应该无效);
地址范围 0x6800_0000~0x6fff_ffff内, 地址最高位为1,CS1n应该生效(CS0n应该无效);
通过该方式即可实现2个flash的片选。但实际结果是,所有地址范围内,仅仅有CS0n生效,而CS1n无效。对于这种问题,很不解。求帮助!!!
EPI 初始化代码如下:
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分别作为CS1和CS0
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.
}

