关于LM3S的EPI 通用模式数据读取!



接触EPI时间不多,遇到一些问题。采用通用8位数据模式与CPLD进行高速数据传输,只需要读取CPLD的数据。以下是初始化代码:

//系统时钟100MHZ

SysCtlClockSet(SYSCTL_SYSDIV_2| SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                       SYSCTL_OSC_MAIN);

//使能各IO
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);

 //设置IO口功能
 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_PJ4_EPI0S28);
 GPIOPinConfigure(GPIO_PJ5_EPI0S29);
 GPIOPinConfigure(GPIO_PJ6_EPI0S30);
 GPIOPinConfigure(GPIO_PG7_EPI0S31);
 GPIOPinConfigure(GPIO_PF2_LED1);
  GPIOPinConfigure(GPIO_PF3_LED0);

 
 //使能EPI模块
  SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);

 GPIOPadConfigSet(GPIO_PORTC_BASE,EPI_PORTC_PINS,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPD);
 GPIOPadConfigSet(GPIO_PORTH_BASE,EPI_PORTH_PINS,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPD);
 GPIOPadConfigSet(GPIO_PORTJ_BASE,EPI_PORTJ_PINS,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPD);
 GPIOPadConfigSet(GPIO_PORTG_BASE,GPIO_PIN_7,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPD);
 
 GPIODirModeSet(GPIO_PORTC_BASE,EPI_PORTC_PINS,GPIO_DIR_MODE_HW);
 GPIODirModeSet(GPIO_PORTH_BASE,EPI_PORTH_PINS,GPIO_DIR_MODE_HW);
 GPIODirModeSet(GPIO_PORTJ_BASE,EPI_PORTJ_PINS,GPIO_DIR_MODE_HW);
 GPIODirModeSet(GPIO_PORTG_BASE,GPIO_PIN_7,GPIO_DIR_MODE_HW);
 
 EPIDividerSet(EPI0_BASE,1);        //EPI时钟为系统时钟的1/2
 EPIModeSet(EPI0_BASE,EPI_MODE_GENERAL);        //通用模式

 EPIConfigGPModeSet(EPI0_BASE,      EPI_GPMODE_CLKPIN|EPI_GPMODE_READ2CYCLE|EPI_GPMODE_READWRITE|EPI_GPMODE_ASIZE_NONE|EPI_GPMODE_DSIZE_8,0,0 );//无地址,8位数据,CLK,RDWR,读取2周期
EPIAddressMapSet(EPI0_BASE,EPI_ADDR_PER_SIZE_64KB|EPI_ADDR_PER_BASE_NONE);

while(HWREG(EPI0_BASE + EPI_O_STAT) & EPI_STAT_INITSEQ)
  {
  }

 EPIFIFOConfig(EPI0_BASE,EPI_FIFO_CONFIG_RX_FULL);   //设置FIFO满中断
 EPIIntRegister(EPI0_BASE,EpiIntHander);                                   //注册中断函数
 EPINonBlockingReadConfigure(EPI0_BASE,0,EPI_NBCONFIG_SIZE_8,0);   //非阻塞读取设置,8位数据
 EPIIntEnable(EPI0_BASE,EPI_INT_RXREQ);  //开启EPI  RX FIFO 中断

IntMasterEnable();    //使能总中断

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

关于之后的数据读取是如何进行的?

EPINonBlockingReadGet8(EPI0_BASE,ulCount,pucBuf);如何使用? 看手册ulCount <4096 ,可是8字节的NBRFIFO ,如何读取大于NBRFIFO的数据?

  • 1,首先系统时钟只能为80MHz, SysCtlClockSet(SYSCTL_SYSDIV_2_5| SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                           SYSCTL_OSC_MAIN);

    2,example:


    #include <string.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_ints.h"
    #include "inc/hw_sysctl.h"
    #include "driverlib/epi.h"
    #include "driverlib/flash.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/systick.h"

    #include "inc/hw_gpio.h"
     
    #define SRAM_MEM_SIZE 0x00100000        //Size in bytes (1MByte)

    #define AUTO_CS        1

    #define EXT_SRAM_BASE           0x68000000

    //*****************************************************************************
    //
    // Use the following to specify the GPIO pins used by the EPI bus (EPI0S00
    // through EPI0S19 and EPI0S28 through EPI0S31).  These basic definitions
    // set up the pins required for the SRAM daughter board.
    //
    //*****************************************************************************

     

    #define EPI_PORTA_PINS          0x00
    #define EPI_PORTB_PINS          0x00
    #define EPI_PORTC_PINS          0xf0
    #define EPI_PORTD_PINS          0xf0
    #define EPI_PORTE_PINS          0x03
    #define EPI_PORTF_PINS          0x80
    #define EPI_PORTG_PINS          0x13
    #define EPI_PORTH_PINS          0xBF
    #define EPI_PORTJ_PINS          0x07
     
     
    void GpioPinSet(void)
    {
        //
        // The EPI0 peripheral must be enabled for use.
        // ʹÄÜEPI½Ó¿Ú
        SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
        //
        // ʹÄܸ÷¸öʹÓõÄIO¿Ú
        //
        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);
        GPIOPinConfigure(GPIO_PB6_C0O  );
        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_PF7_EPI0S12);
        GPIOPinConfigure(GPIO_PG0_EPI0S13);
        GPIOPinConfigure(GPIO_PG1_EPI0S14);
        GPIOPinConfigure(GPIO_PG4_EPI0S15);
        GPIOPinConfigure(GPIO_PJ0_EPI0S16);
        GPIOPinConfigure(GPIO_PJ1_EPI0S17);
        GPIOPinConfigure(GPIO_PJ2_EPI0S18);
        GPIOPinConfigure(GPIO_PD4_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_PH7_EPI0S27);
        GPIOPinConfigure(GPIO_PD5_EPI0S28);
        GPIOPinConfigure(GPIO_PD6_EPI0S29);
        GPIOPinConfigure(GPIO_PD7_EPI0S30);
    //    GPIOPinConfigure(GPIO_PG7_EPI0S31);
        //
        // Configure the GPIO pins for EPI mode.  All the EPI pins require 8mA
        // drive strength in push-pull operation.  This step also gives control of
        // pins to the EPI module.
        //
        GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS);
        GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
        GPIOPinTypeEPI(GPIO_PORTD_BASE, EPI_PORTD_PINS);
        GPIOPinTypeEPI(GPIO_PORTE_BASE, EPI_PORTE_PINS);
        GPIOPinTypeEPI(GPIO_PORTF_BASE, EPI_PORTF_PINS);
        GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
        GPIOPinTypeEPI(GPIO_PORTH_BASE, EPI_PORTH_PINS);
        GPIOPinTypeEPI(GPIO_PORTJ_BASE, EPI_PORTJ_PINS);
        //
        // Sets the clock divider for the EPI module.  In this case set the
        // divider to 0, making the EPIClock = SysClk.
        EPIDividerSet(EPI0_BASE, 10);
        //
        // Sets the usage mode of the EPI module. EPI_MODE_HB8
        //
        EPIModeSet(EPI0_BASE, EPI_MODE_HB8);
        // set
        // ʹÓÃÏàͬ²¨ÌØÂʵØÖ·Êý¾Ý²»¸´Óà csÐźŠ×Ö½Ú¶ÁÈ¡
    //    EPIConfigHB8Set(EPI0_BASE, EPI_HB8_MODE_ADDEMUX | EPI_HB8_WRWAIT_1
    //                               | EPI_HB8_RDWAIT_1 | EPI_HB8_CSCFG_CS, 0);
      
        EPIConfigHB8Set(EPI0_BASE, EPI_HB8_MODE_ADDEMUX | EPI_HB8_WRWAIT_1
                                   | EPI_HB8_RDWAIT_1 | EPI_HB8_WRHIGH
                                   | EPI_HB8_RDHIGH | EPI_HB8_CSCFG_DUAL_CS, 5);
     
    //Õâ¸öµØ·½½øÐиÄRD/WRÐźŵļ«ÐÔ
       
        //VPC3Ó³É䵽ƬÍâÍâÉ裬µØÖ·Îª0ååxA000 0000£¬´óСΪ64K
        //Ë«¿ÚRAMÓ³É䵽ƬÍâRAM,EPƬÍâÍâÉè,´óСΪ64k£¬µØÖ·0x6000 0000
       
        EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_SIZE_256B | EPI_ADDR_PER_BASE_A | EPI_ADDR_RAM_SIZE_64KB | EPI_ADDR_RAM_BASE_6);
    //    EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_SIZE_256B | EPI_ADDR_PER_BASE_A);
    }
     


    int main(void)
    {
     int *dpointer;
    //
        // Set the system clock to run at 80MHz from the PLL
        //
        SysCtlClockSet(SYSCTL_SYSDIV_2_5| SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                           SYSCTL_XTAL_16MHZ);

        //
        // Set the device pinout appropriately for this board.  This also enables
        // all the GPIO ports required.
        //
        //PinoutSet();
     GpioPinSet();
     while(1){
        HWREGB(EXT_SRAM_BASE  + 0xAAA) = 0x55;

     *dpointer= HWREGB(EXT_SRAM_BASE  + 0xAAA);

         }
    while(1);

    }