为什么使用MUC的gpio是什么口时优先用高位?

工控主板EM9360的GPIO的各种使用方法--技术天地
工控主板EM9360的GPIO的各种使用方法
发布时间:&&&&被阅览数:次
&&&&&&& 英创公司的ARM9工控主板产品 EM9360是一款预装WinCE操作系统,以多种通讯接口、支持各种扩展为其技术特色。EM9360的板载的3路以太网接口、6路串口以及1路CAN接口,均带有标准的WinCE驱动程序,支持应用程序通过WinCE相应的API函数来操作各路网络接口。此外EM9360还与英创公司其他ARM9主板一样,带有精简ISA扩展总线以及12位通用GPIO,可参考英创网站的相关信息,而本文则主要介绍EM9360主板中12位GPIO的各种使用方法。&&&&&&& EM9360的12位通用数字IO的各种使用方法列表如下:数字IO高位地址时间同步外部中断RS485矩阵键盘GPIO0&PPS_IN#&&&GPIO1&PPS_OUT#&&&GPIO2&&IRQ2&&GPIO3&&IRQ3&&GPIO4ISA_SA5&&&4X4矩阵键盘GPIO5ISA_SA6&&&GPIO6ISA_SA7&&COM2_RST#GPIO7ISA_SA8&&COM3_RST#GPIO8ISA_SA9&&COM4_RST#GPIO9ISA_SA10&&COM5_RST#GPIO10ISA_SA11&&COM6_RST#GPIO11ISA_SA12&&COM7_RST#&通用GPIO& &&&&& EM9360上电后的各位IO均处于数字输入状态,通过相应的API函数(定义在em9360_isa_dio.h文件中)这12位GPIO可独立设置为输入或输出,输出电平也可独立设置。精简ISA总线的高位地址线& &&&&& 基本的精简ISA总线只包含低5为地址总线SA0 – SA4,对大多数IO类型的扩展,5位地址线已足够使用。为了支持存储器类型的扩展,EM9360提供对高位地址总线的支持,其中的SA5 – SA12与GPIO4 – GPIO11复用管脚。为了激活高位地址总线,应用程序需在程序初始化阶段,通用调用API函数& &&&&& int ISA_ReadUchar( int nSeg, UINT nOffset, UCHAR* pRdValue );&&&&&&& 进行一次“哑读”即可。具体需要激活的高位地址还可通过偏移量nOffset的输入值来选择,但至少需要激活SA5和SA6这2位地址总线。举例说明如下:&&&&&&& 1、激活SA5和SA6,而其他的还是保持为GPIO,则nOffset = 0x007F;&&&&&&& 2、激活SA5–SA7,而其他的还是保持为GPIO,则nOffset = 0x00FF;&&&&&&& 3、激活SA5–SA12,最大访问8KB空间,则nOffset = 0x1FFF;& &&&&& 在使用高位地址扩展时,需要注意以下事宜:&&&&&&& ·精简ISA总线有2个片选输出,其中CS1#只支持最大1KB的访问空间,而CS0#则可支持最大8KB的访问空间,所以通常用CS0#作为存储器单元的片选控制。&&& &&& ·若客户应用还需要访问更大空间,EM9360还可引出SA13 – SA15信号,使CS0#的访问空间达到64KB。精简ISA总线扩展的存储器单元一般只能用作数据存储,不能作为程序运行空间。&&&&& & ·激活的地址线应当是由小至大,连续地址空间。&时间同步功能&& &&&& EM9360支持时间同步功能,基本的使用方法是应用程序打开“PPS1:”设备驱动程序,此时GPIO0将自动转为同步脉冲输入PPS_IN#(低电平有效)。PPS驱动程序被PPS_IN#脉冲触发后,将立即发送时间同步事件,供上层应用线程做必要处理。根据用户设置,PPS驱动程序还可在GPIO1上输出同步脉冲PPS_OUT#(同样是低电平有效),以及自动对当前时间进行整秒调整。&更多的外部中断& &&&&& 基本的精简ISA总线只提供1条外部硬件中断输入IRQ1,上升沿有效。若客户应用需要扩展更多的通讯接口,如增加第二路CAN接口、增加8路串口等等,这时仅仅一条外部中断就不够了,需要更多的外部中断支持,GPIO2和GPIO3则可用于外部中断输入。事实上EM9360的驱动已可支持类似这样的扩展,感兴趣的客户可与英创公司联系了解进一步的使用方法。&作为RS485接口的RST#&&&&& GPIO6–GPIO11还可分别作为COM2 – COM7的RTS#控制信号,低电平有效。对RS485接口,若需要使用RTS方向控制方案,则在设置串口参数时,需要特别地把RTS控制段设置为RTS_CONTROL_TOGGLE,相关的代码如下所示:&&&&& DCB&&&&&&&&&&&& // 定义参数控制块&&&&& GetCommState( m_hSer, &dcb );&&&&&// 读取当前参数块&&&&& dcb.fRtsControl = RTS_CONTROL_TOGGLE;&&// 设置RTS方向控制&&&&& SetCommState(m_hSer, &dcb);&&&&&// 重设串口参数&&&&&&& 上述代码中m_hSer为打开串口文件“COMx:”的文件句柄。& &&&&& 在使用RS485通讯时,一般把RTS#有效(低电平)作为发送状态,RTS#无效(高电平)为接收状态。从发送状态切换回接收状态,作为方向控制信号的RTS#,可能会有最长1ms的延时,因此为了防止系统出现收发状态冲突的情况,RS485的波特率最好不超过9600bps。&矩阵键盘& &&&&& EM9360支持由GPIO驱动的4×4矩阵键盘,具体配置如下:虚拟键码GPIO5 - KIN0GPIO7 - KIN1GPIO8 - KIN2GPIO10 - KIN3GPIO4 - KOUT0VK_ESCAPEVK_0VK_DECIMALVK_BACKGPIO6 - KOUT1VK_CAPITALVK_1VK_2VK_3GPIO8 - KOUT2VK_SPACEVK_4VK_5VK_6GPIO10 - KOUT3VK_RETURNVK_7VK_8VK_9&& &&&&& EM9360已内置了基于GPIO的矩阵键盘驱动程序,加载方法是在应用程序中调用:&&&&&&& HANDLE& hDevice = NULL;&&&&&&& hDevice = ActivateDevice( TEXT('Drivers\\gpio_keypad'), 0);&&&& &&& 注意在应用程序退出时,应卸载该驱动程序,以避免矩阵键盘驱动程序被反复加载。&&&&&& & 我们会根据客户的应用需求,对EM9360的GPIO赋予更多的功能,但无论GPIO有多少功能,在面向具体应用时,每位GPIO只能选择一种应用。对此,客户在进行GPIO功能配置时需特别小心,避免在一个管脚选择多种功能,造成运行结果异常,长期处于这种异常状态还可能导致主板硬件损坏。&&&&&&& 已购买EM9360的客户,若需要使用本文所介绍的新增功能,如RS485 RTS#方向控制等,一般需要更新内核和SDK。可以把主板寄回由我们免费更新内核,并从英创公司网站上下载新的SDK,就可使用本文所介绍的全部功能了。
产品及服务
英创手机网站
英创官方微信
英创淘宝店
英创新浪微博 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
GPIO功能描述
下载积分:1500
内容提示:GPIO功能描述
文档格式:DOC|
浏览次数:231|
上传日期: 01:00:06|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
GPIO功能描述
官方公共微信I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段、数据传输阶段和终止阶段。
1. 起始阶段
在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平。如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志。当SCL为高电平时,SDA电平从高变低,这一变化表示完成了通信的起始条件。
在起始条件和数据通信之间,通常会有延时要求,具体的指标会在设备厂商的规格说明书中给出。
2. 数据传输阶段
I2C总线的数据通信是以字节(8位)作为基本单位在SDA上进行串行传输的。一个字节的传输需要9个时钟周期。其中,字节中每一位的传输都需要一个时钟周期,当新的SCL到来时,SCL为低电平,此时数据发送方根据当前传输的数据位控制SDA的电平信号。如果传输的数据位为"1",就将SDA电平拉高;如果传输的数据位为"0",就将SDA的电平拉低。当SDA上的数据准备好之后,SCL由低变高,此时数据接收方将会在下一次SCL信号变低之前完成数据的接收。当8位数据发送完成后,数据接收方需要一个时钟周期以使用SDA发送ACK信号,表明数据是否接收成功。当ACK信号为"0"时,说明接收成功;为"1"时,说明接收失败。每个字节的传输都是由高位(MSB)到低位(LSB)依次进行传输。
I2C总线协议中规定,数据通信的第一个字节必须由主机发出,内容为此次通信的目标设备地址和数据通信的方向(读/写)。在这个字节中,第1~7位为目标设备地址,第0位为通信方向,当第0位为"1"时表示读,即后续的数据由目标设备发出主机进行接收;当第0位为"0"时表示写,即后续的数据由主机发出目标设备进行接收。在数据通信过程中,总是由数据接收方发出ACK信号。
3. 终止阶段
当主机完成数据通信,并终止本次传输时会发出终止信号。当SCL 是高电平时,SDA电平由低变高,这个变化意味着传输终止。
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO实现I2C通信:
#define SDA 254
//定义SDA所对应的GPIO接口编号
#define SCL 255
//定义SCL所对应的GPIO接口编号
#define OUTP 1
//表示GPIO接口方向为输出
#define INP 0
//表示GPIO接口方向为输入
/* I2C起始条件 */
int i2c_start()
//初始化GPIO口
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
set_gpio_direction (SCL, OUTP);
//设置SCL方向为输出
set_gpio_value(SDA, 1);
//设置SDA为高电平
set_gpio_value(SCL, 1);
//设置SCL为高电平
//起始条件
set_gpio_value(SDA, 0);
//SCL为高电平时,SDA由高变低
/* I2C终止条件 */
void i2c_stop()
set_gpio_value(SCL, 1);
set_gpio_direction(SDA, OUTP);
set_gpio_value(SDA, 0);
set_gpio_value(SDA, 1);
//SCL高电平时,SDA由低变高
I2C读取ACK信号(写数据时使用)
返回值 :0表示ACK信号有效;非0表示ACK信号无效
unsigned char i2c_read_ack()
unsigned char
set_gpio_direction(SDA, INP);
//设置SDA方向为输入
set_gpio_value(SCL,0);
// SCL变低
r = get_gpio_value(SDA);
//读取ACK信号
set_gpio_value(SCL,1);
// SCL变高
/* I2C发出ACK信号(读数据时使用) */
int i2c_send_ack()
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
set_gpio_value(SCL,0);
// SCL变低
set_gpio_value(SDA, 0);
//发出ACK信号
set_gpio_value(SCL,1);
// SCL变高
/* I2C字节写 */
void i2c_write_byte(unsigned char b)
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
for (i=7; i&=0; i--) {
set_gpio_value(SCL, 0);
// SCL变低
set_gpio_value(SDA, b & (1&&i));
//从高位到低位依次准备数据进行发送
set_gpio_value(SCL, 1);
// SCL变高
i2c_read_ack();
//检查目标设备的ACK信号
/* I2C字节读 */
unsigned char i2c_read_byte()
unsigned char r = 0;
set_gpio_direction(SDA, INP);
//设置SDA方向为输入
for (i=7; i&=0; i--) {
set_gpio_value(SCL, 0);
// SCL变低
r = (r &&1) | get_gpio_value(SDA);
//从高位到低位依次准备数据进行读取
set_gpio_value(SCL, 1);
// SCL变高
i2c_send_ack();
//向目标设备发送ACK信号
addr:目标设备地址
buf:读缓冲区
len:读入字节的长度
void i2c_read(unsigned char addr, unsigned char* buf, int len)
unsigned char
i2c_start();
//起始条件,开始数据通信
//发送地址和数据读写方向
t = (addr && 1) | 1;
//低位为1,表示读数据
i2c_write_byte(t);
//读入数据
for (i=0; i& i++)
buf[i] = i2c_read_byte();
i2c_stop();
//终止条件,结束数据通信
addr:目标设备地址
buf:写缓冲区
len:写入字节的长度
void i2c_write (unsigned char addr, unsigned char* buf, int len)
unsigned char
i2c_start();
//起始条件,开始数据通信
//发送地址和数据读写方向
t = (addr && 1) | 0;
//低位为0,表示写数据
i2c_write_byte(t);
//写入数据
for (i=0; i& i++)
i2c_write_byte(buf[i]);
i2c_stop();
//终止条件,结束数据通信
阅读(...) 评论() &}

我要回帖

更多关于 gpio接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信