LM3S9B96EPI接口使用问题



你好!

      我想完成LM3S9B96的EPI接口与CPLD通信的功能,目前遇到一些问题,希望大家能够帮帮忙,谢谢!

     EPI采用EPI_MODE_GENERAL模式,8bit数据总线,无地址总线,EPI总线时钟输出给CPLD作为CPLD的主时钟,LM3S9B96只需要判断iRDY信号从CPLD读取数据就行了。

    目前发现EPI接口的RD和WR信号总是常低,与预想的不符合,RD和WR我已经在EPIConfigGPModeSet()里面配置了。另外还有一个问题使我感觉我的EPI接口配置不太正常,当CPLD给EPI接口发送数据的时候,EPI的数据脚D0-D7并不是设计的3.3V的TTL电平,而是1.5V,但是高低电平的逻辑是对的,即数据管脚高电平只有1.5V。我做了2个实验排除硬件问题,LM3S9B96和CPLD在EPI管脚配置成GPIO时都可以独立驱动这些引脚为3.3V的TTL电平。

   我测试时用CPLD给LM3S9B96发送A5或者5A都能正确的读出来并显示在串口上。但是上述问题让我很费解。

  下面是我的代码,请大家帮忙看看,谢谢!

主函数:

int main(void)
{
int i;
unsigned char * EPI_DATA;
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
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);

GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_6); //系统上电
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_PIN_6);

TevEpiInit();
KeyInit();
UartInit();

IntMasterEnable();

GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_5);

GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, GPIO_PIN_5);
Delay(500);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_5, 0);

EPI_DATA = (unsigned char *)0xC0000000;

for(i = 0;i<256;i++)
{

UARTCharPutNonBlocking(UART0_BASE,EPI_DATA[i]);

Delay(1);
}

while(1)
{
}

}

EPI配置函数:

void TevEpiInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); //使能EPI模块


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_PH7_EPI0S27);
GPIOPinConfigure(GPIO_PJ4_EPI0S28);
GPIOPinConfigure(GPIO_PJ5_EPI0S29);
// GPIOPinConfigure(GPIO_PD5_EPI0S28);
// GPIOPinConfigure(GPIO_PD6_EPI0S29);
// GPIOPinConfigure(GPIO_PJ6_EPI0S30);
GPIOPinConfigure(GPIO_PG7_EPI0S31);

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_3 ); //D0
GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_2 ); //D1
GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_4 ); //D2
GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_5 ); //D3
GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_6 ); //D4
GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_7 ); //D5
GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_0 ); //D6
GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_1 ); //D7
GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_7 ); //iRDY
GPIOPinTypeEPI(GPIO_PORTJ_BASE,GPIO_PIN_4 ); //WR
GPIOPinTypeEPI(GPIO_PORTJ_BASE,GPIO_PIN_5 ); //RD
// GPIOPinTypeEPI(GPIO_PORTD_BASE,GPIO_PIN_5 ); //WR
// GPIOPinTypeEPI(GPIO_PORTD_BASE,GPIO_PIN_6 ); //RD
// GPIOPinTypeEPI(GPIO_PORTJ_BASE,GPIO_PIN_6 ); //FRAME
GPIOPinTypeEPI(GPIO_PORTG_BASE,GPIO_PIN_7 ); //clk

EPIDividerSet(EPI0_BASE, 0); //配置EPI工作频率 EPIClock = (Divider == 0) ? SysClk : (SysClk/(((Divider/2)+1)*2)); 

EPIModeSet(EPI0_BASE,EPI_MODE_GENERAL); //配置EPI工作模式
EPIConfigGPModeSet(EPI0_BASE, EPI_GPMODE_CLKPIN|EPI_GPMODE_READWRITE|EPI_GPMODE_ASIZE_NONE|EPI_GPMODE_DSIZE_8|EPI_GPMODE_READ2CYCLE|EPI_GPMODE_RDYEN,0,0); //
EPI_FIFO_CONFIG_RX_1_2, EPI_FIFO_CONFIG_RX_3_4, EPI_FIFO_CONFIG_RX_7_8, or EPI_FIFO_CONFIG_RX_FULL

EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_BASE_C // EPI_ADDR_PER_BASE_NONE|EPI_ADDR_RAM_BASE_NONE
| EPI_ADDR_PER_SIZE_256B);

}