您的位置 首页 分销

LM3S9B96的EPI总线的HB16形式装备

lm3s9b96的EPI(ExternalPeripherInterface)总线是TI公司特有的,是高速并行总线,可以配置成多种工作模式。EPI工作模式:同步动态随机访…

lm3s9b96的EPI(ExternalPeripherInterface)总线是TI公司特有的,是高速并行总线,能够装备成多种作业形式。

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);
}

仅供参考!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/275163.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部