新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LM3S9B96的EPI總線的HB16模式配置

        LM3S9B96的EPI總線的HB16模式配置

        作者: 時間:2016-11-11 來源:網絡 收藏
        lm3s9b96的EPI(ExternalPeripherInterface)總線是TI公司特有的,是高速并行總線,可以配置成多種工作模式。

        本文引用地址:http://www.104case.com/article/201611/317015.htm

        EPI工作模式:

        1. 同步動態隨機訪問存儲器(SDRAM)模式:支持16位寬的SDRAM,最高達到50MHZ,復用地址與數據管腳。
        2. 主機總線(HB)模式:傳統的8/16位微控制器總線接口,可兼容PIC,8051,AVR等單片機。可訪問SRAM,NORFLSH其他的并行總線設備,非復用下尋址能力達到1MB,復用模式下尋址可以達到256MB
        3. 通用模式:可以通CPLD或者FPGA進行快速的數據交換,數據寬度可以達到32位,數據速率可以達到150MB/S.
        4. 并行GPIO模式:1到32位,必須經由FIFO輸入輸出,速度可控。
        其中最常用的是:主機總線模式(Host bus)和SDRAM模式。
        我項目中用到的是HB模式,并行讀取16個管腳上的高低電平,并組成一個16進制的數值。下面是配置方法:
        1. 用SysCtlClockSet設置系統時鐘
        2. 用SysCtlPeripheralEnable開GPIO口時鐘
        3. 用GPIOPinConfigure將GPIO口配置成EPIO功能
        4. 用GPIOPinTypeEPI配置GPIO口為EPI模式
        5. 用EPIDividerSet設置EPI時鐘
        6. 用位段方式HWREG(EPI_O_CFG)配置EPI為HB16模式
        7. 用位段方式HWREG(EPI_O_HB16CFG)配置讀選通信號RDn(低電平有效), 最長等待時間(可以永遠掛起), 寫等待態(無等待態), 讀等待態(1個等待態),字節選擇配置(數據按照16位寬度讀寫), 主機并行總線的子模式(ADNOMUX子模式)
        8. 用位段方式HWREG(EPI_O_HB16CFG2)配置字訪問模式(使能字訪問模式), 雙片選波特率(相同波特率), 片選配置(EPI0S30用作片選信號CSn)
        9. 用位段方式HWREG(EPI_O_ADDRMAP)配置片外外設空間大小64kB(低地址范圍0x0000~0xFFFF),片外外設基地址(0xA000 0000)
        10. 至此,初始化完畢,就可以使用讀寫數據了
        11. 指向外設基地址0xA000 0000處的指針:g_pusEPIPER = (unsigned short *)0xA0000000;
        12. 向外設地址0處寫ffff: *g_pusEPIPER = 0xfffc;設1個變量接收讀取的數據:usDI16 = *g_pusEPIPER; // 從外設基地址0xA000 0000處讀16位數據
        鑒于有很多朋友問過我HB模式具體例子,我將HB16的例子公布如下:

        //*****************************************************************************
        // 頭文件包含區
        //*****************************************************************************
        #include "inc/lm3s9b96.h"
        #include "inc/hw_ints.h"
        #include "inc/hw_memmap.h"
        #include "inc/hw_nvic.h"
        #include "inc/hw_types.h"
        #include "inc/hw_i2c.h"
        #include "driverlib/i2c.h"
        #include "driverlib/ethernet.h"
        #include "driverlib/flash.h"
        #include "driverlib/gpio.h"
        #include "driverlib/timer.h"
        #include "driverlib/interrupt.h"
        #include "driverlib/sysctl.h"
        #include "driverlib/systick.h"
        #include "driverlib/uart.h"
        #include "driverlib/watchdog.h"
        #include "driverlib/epi.h"
        #include "utils/locator.h"
        #include "utils/lwiplib.h"
        #include "utils/uartstdio.h"
        #include "utils/ustdlib.h"
        #include "grlib/grlib.h"
        #include "httpserver_raw/httpd.h"
        #include "drivers/kitronix320x240x16_ssd2119_8bit.h"
        #include "drivers/set_pinout.h"

        //*****************************************************************************
        // 數據類型定義區
        //*****************************************************************************
        typedef unsigned char BYTE;
        typedef unsigned short WORD;
        typedef unsigned long DWORD;
        typedef enum {FALSE = 0, TRUE = !FALSE} bool;


        //*****************************************************************************
        // 宏定義區
        //*****************************************************************************
        /* Defines for setting up the system clock -----------------------------------*/
        #define SYSTICKHZ 100
        #define SYSTICKMS (1000 / SYSTICKHZ)
        #define SYSTICKUS (1000000 / SYSTICKHZ)
        #define SYSTICKNS (1000000000 / SYSTICKHZ)


        /* 在lm3s9b96.h中定義 --------------------------------------------------------*/
        #define EPI_O_CFG 0x400D0000
        #define EPI_O_HB16CFG 0x400D0010
        #define EPI_O_HB16CFG2 0x400D0014
        #define EPI_O_ADDRMAP 0x400D001c
        #define EPI_O_BAUD 0x400D0004

        #define EPI_PORTC_PINS (GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4)
        #define EPI_PORTD_PINS (GPIO_PIN_3 | GPIO_PIN_2)
        #define EPI_PORTE_PINS (GPIO_PIN_1 | GPIO_PIN_0)
        #define EPI_PORTF_PINS (GPIO_PIN_5 | GPIO_PIN_4)
        #define EPI_PORTG_PINS (GPIO_PIN_7 | GPIO_PIN_1 | GPIO_PIN_0)
        #define EPI_PORTH_PINS (GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2 |
        GPIO_PIN_1 | GPIO_PIN_0)
        #define EPI_PORTJ_PINS (GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
        GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0)

        //*****************************************************************************
        // 全局變量定義區
        //*****************************************************************************
        volatile WORD usDI16 = 0x0000;
        static volatile WORD *g_pusEPIPER;

        //*****************************************************************************
        // 函數聲明區
        //*****************************************************************************
        extern void fs_init(void);
        extern void fs_tick(unsigned long ulTickMS);



        //*****************************************************************************
        //
        // The error routine that is called if the driver library encounters an error.
        //
        //*****************************************************************************
        #ifdef DEBUG
        void __error__(char *pcFilename, unsigned long ulLine)
        {
        }
        #endif


        //*****************************************************************************
        //
        // 系統時鐘初始化函數
        //
        //*****************************************************************************
        void SysClk_Init(void)
        {
        // 配置系統主時鐘, 使用外部晶振16M.
        SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
        }

        //*****************************************************************************
        //
        // This example demonstrates the use of the Ethernet Controller.
        //
        //*****************************************************************************
        int main(void)
        {
        // 系統時鐘初始化為16MHz
        SysClk_Init();

        // 使能A~J管腳
        // PinoutSet();

        // 開總中斷
        IntMasterEnable();

        // The EPI0 peripheral must be enabled for use
        SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);

        // EPI0 is used with multiple pins on Port C, E, F, G, H, J
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);

        GPIOPadConfigSet(GPIO_PORTC_BASE, EPI_PORTC_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        // GPIOPadConfigSet(GPIO_PORTD_BASE, EPI_PORTD_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(GPIO_PORTE_BASE, EPI_PORTE_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(GPIO_PORTF_BASE, EPI_PORTF_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(GPIO_PORTG_BASE, EPI_PORTG_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(GPIO_PORTH_BASE, EPI_PORTH_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
        GPIOPadConfigSet(GPIO_PORTJ_BASE, EPI_PORTJ_PINS, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);

        GPIODirModeSet(GPIO_PORTC_BASE, EPI_PORTC_PINS, GPIO_DIR_MODE_HW);
        // GPIODirModeSet(GPIO_PORTD_BASE, EPI_PORTD_PINS, GPIO_DIR_MODE_HW);

        GPIODirModeSet(GPIO_PORTE_BASE, EPI_PORTE_PINS, GPIO_DIR_MODE_HW);
        GPIODirModeSet(GPIO_PORTF_BASE, EPI_PORTF_PINS, GPIO_DIR_MODE_HW);
        GPIODirModeSet(GPIO_PORTG_BASE, EPI_PORTG_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);

        // configures the internal pin muxes to set the EPI pins for use with 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_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_PJ4_EPI0S28);
        GPIOPinConfigure(GPIO_PJ5_EPI0S29);
        GPIOPinConfigure(GPIO_PJ6_EPI0S30);
        GPIOPinConfigure(GPIO_PG7_EPI0S31);

        // Configure the GPIO pins for EPI mode
        GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_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. EPIClock = SysClk.
        EPIDividerSet(EPI0_BASE, 0);

        // Sets the usage mode of the EPI module. EPI_MODE_HB16
        HWREG(EPI_O_CFG) = (1 << 4) | 0x1;

        // 讀選通信號RDn(低電平有效), 最長等待時間(可以永遠掛起), 寫等待態(無等待態), 讀等待態(1個等待態)
        // 字節選擇配置(數據按照16位寬度讀寫), 主機并行總線的子模式(ADNOMUX子模式)
        HWREG(EPI_O_HB16CFG) = (1 << 20) | (0x00 << 8) | (0x01 << 4) | (1 << 0);

        // 字訪問模式(使能字訪問模式), 雙片選波特率(相同波特率), 片選配置(EPI0S30用作片選信號CSn)
        HWREG(EPI_O_HB16CFG2) = (1 << 31) | (0x01 << 24);

        // 片外外設空間大小64kB(低地址范圍0x0000~0xFFFF),片外外設基地址(0xA000 0000)
        HWREG(EPI_O_ADDRMAP) = (0x5 << 4);

        /* 初始化完畢,就可以使用讀取數據了 ----------------------------------------*/

        // 指向外設基地址0xA000 0000處的指針
        g_pusEPIPER = (unsigned short *)0xA0000000;

        // 從外設基地址0xA0000000處,讀取16位數據
        usDI16 = *g_pusEPIPER;
        usDI16 = ~usDI16;

        // Loop forever. All the work is done in interrupt handlers.
        while (1)
        {
        }
        }


        //*****************************************************************************
        //
        // Required by lwIP library to support any host-related timer functions.
        //
        //*****************************************************************************
        void lwIPHostTimerHandler(void)
        {
        }

        //*****************************************************************************
        //
        // The interrupt handler for the SysTick interrupt.
        //
        //*****************************************************************************
        void SysTickIntHandler(void)
        {
        // Call the lwIP timer handler.
        lwIPTimer(SYSTICKMS);

        // Run the file system tick handler.
        fs_tick(SYSTICKMS);
        }

        僅供參考!



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 水富县| 柯坪县| 富川| 扶绥县| 惠来县| 通辽市| 镇康县| 军事| 开封市| 广东省| 黔西县| 宁河县| 大连市| 灯塔市| 临漳县| 林芝县| 金阳县| 即墨市| 绥滨县| 洮南市| 桐庐县| 综艺| 江永县| 宁海县| 广西| 石首市| 二手房| 岑溪市| 呼伦贝尔市| 廊坊市| 枣阳市| 定兴县| 东山县| 中山市| 商洛市| 凉城县| 邵武市| 博爱县| 珠海市| 钟祥市| 建始县|