管理信息化教你为任何系统增加.

上传人:精****库 文档编号:137823442 上传时间:2020-07-12 格式:DOC 页数:13 大小:207.79KB
返回 下载 相关 举报
管理信息化教你为任何系统增加._第1页
第1页 / 共13页
管理信息化教你为任何系统增加._第2页
第2页 / 共13页
管理信息化教你为任何系统增加._第3页
第3页 / 共13页
管理信息化教你为任何系统增加._第4页
第4页 / 共13页
管理信息化教你为任何系统增加._第5页
第5页 / 共13页
点击查看更多>>
资源描述

《管理信息化教你为任何系统增加.》由会员分享,可在线阅读,更多相关《管理信息化教你为任何系统增加.(13页珍藏版)》请在金锄头文库上搜索。

1、为任何系统增加USB引言有关通用串行总线(USB)的文章通常从USB是个人电脑的一个新连接标准开始讲起。谢天谢地现在不再需要如此做,因此本引言可以简短地写为:如果你有一个嵌入式系统并且想连到PC,主流的连接通道是USB。本文介绍了一款Maxim最新推出的芯片,MAX3420E,它可以很容易地把USB加入到任何系统中。本文主要着重于SPI接口,提供了实现通用SPI的C例程。最后给出了一个简单的USB HID (人机接口设备) 基于Windows的应急按钮程序。 为任何系统增加USB微控制器(C)的选择通常基于它所集成的外设。许多处理器集成了USB功能,但是大多数处理器,特别是一些低价位的处理器不

2、含USB。有时,您可能选用了一个I/O和外设都很完美的微控制器,但它却缺少USB。您是否希望只是添加USB功能而继续使用当前的微控制器呢? 利用Maxim的芯片MAX3420E,可以为任何处理器添加USB功能。MAX3420E集成了USB全速收发器、智能USB串行接口引擎(SIE)和一个可工作到26MHz时钟的从SPI接口。MAX3420E的使用如同一个具有单个控制端点、两个双重缓冲的64字节数据端点和一个64字节的中断端点的全速USB外设。总线供电图1. USB供电图1是一个普通的USB外设结构。USB的VBUS电源线为3.3V稳压器提供5V输入,该稳压器给微控制器和MAX3420E供电(无

3、需墙上适配器)。SPI接口可以是3、4或5线。表1列出了5线接口。表1. 使用3到5线的SPI接口 如果应用中不需要中断(MAX3420E的中断条件可以通过读取寄存器直接检测到)s,可以去掉INT引脚,得到一个4线接口。如果SPI主机具有双向数据接口(MOSI/MISO),则可以省掉另外一条接口线,这样,没有中断、支持双向通信的SPI接口只需要3个引脚。如果微控制器没有SPI接口怎么办呢?没问题,可以很容易地设计一个直接触发GPIO的、固件形式的SPI主控器。USB的一个非常强的特性是自控流量能力,它自动配合SPI侧的任何速度(它利用在USB侧插入NAK握手来提示“忙,重试”)。很多USB外设

4、,特别是与人接口的,即使与最低速的SPI接口都能应答自如。如果图1中的微控制器非常小,只有10脚以下怎么办呢?难道就不能把这些珍贵的I/O口用来连USB芯片了?不,这就是为什么MAX3420E提供了四个通用输出口和四个通用输入口的原因,它们可以替代被用掉的处理器上的I/O口,事实上你的系统在接上MAX3420E后还得到了更多的口线。大规模集成芯片图2. 只连接大规模集成芯片的少许引脚MAX3420E不仅仅只限用于小系统。图2说明了如何给一个ASIC,FPGA,DSP和其他大芯片增加USB功能。这样做的一个明显原因是大芯片没有内建的USB或内部的USB不是正好符合你的所需。另一个原因是随着工艺尺

5、寸的缩小,这些大片子不能兼容USB所需的3.3V “高”压,此时使用外部带低压SPI接口的USB芯片就是一个很好的方案。MAX3420E内带电平转换器,VL脚设定接口电平的范围,从1.7V到3.6V。隔离USB图3. 隔离USB如图3所示,由于SPI接口信号是单向的,还很容易进行光隔。同时还可以设定较低的速率来支持廉价的光耦。SPI接口SPI (串行外设接口)是一个简单的串行接口,它使用两根数据线,一根串行时钟和一个片选信号。SPI主控把SS#拉低来开始传输,然后驱动串行时钟SCLK来把数据同步输入和输出从设备。SPI主控通过把SS#拉回到高电平,以终止传输。SPI接口有四种时钟模式,反映了两

6、个信号CPOL (时钟极性)和CPHA (时钟相位)的两个状态。这两信号以(CPOL, CPHA)的形式来表示。可以证明一个接口利用正沿SCLK且在第一个正沿时钟到来以前MOSI数据已经准备就绪可以工作在(0,0)和(1,1)模式而无需任何改变。这一属性使MAX3420E无需额外的模式引脚设置,就可以工作在(0,0)或(1,1)模式。图4和图5显示了利用SPI模式在微控制器(MAXQ2000,随后介绍)和MAX3420E之间的数据传输。图4所示为(0,0)模式,图5所示为(1,1)模式。两者的区别是SCLK信号的无效电平不同,(0,0)是低无效,(1,1)是高无效。MAX3420E每次传输接收

7、的第一个字节是命令字节。命令字节包含寄存器号和方向位,第二个字节和后续字节包含数据。在图4和图5中,移入命令字时,来自MAX3420E (MISO引脚)的8位数据是USB状态位。此特性只在使用分离MISO和MOSI脚的接口中有效。SPI代码编写MAX3420E通用C代码的窍门是把原始的最基本的SPI操作封装到独立的模块中,然后针对不同的SPI接口的只需客户化这一模块。最基本的模块只须做三件事: 初始化SPI口 读一个字节 写一个字节 本文中的应用例子使用硬件SPI单元。对没有此单元的SPI主控器,我们先看看一些位仿真SPI接口的通用C代码。位仿真SPIInit SPI初始化SPI口的函数会随处

8、理器的不同而有很多变化。比较好的做法是先指定接口使用的I/O脚,设置它们的方向,然后设定SS=1和SCLK=0的初始条件(我们假定用SPI主控器的(00)模式)。读寄存器,写寄存器rreg是读取MAX3420E寄存器的C函数,这个宏把功能从不同微控制器的不同I/O结构中独立出来,使用宏使代码易读且与处理器无关。wreg是写MAX3420E寄存器的例程。更换处理器时,只需对宏进行修改即可使用这些例程。例如:下面是用于不带硬件SPI单元的微控制器的宏。 #define SCLK_HI OUTA = PINSA | 0x02;#define SCLK_LO OUTA = PINSA & 0xFD;#

9、define SS_HI OUTA = PINSA | 0x04;#define SS_LO OUTA = PINSA & 0xFB;#define MOSI(v) OUTA = (PINSA & 0x7F) | (v & 0x80);#define MISO inval |= PINSA & 0x01; BYTE rreg(BYTE r) / Read a register, return its value.int j;BYTE bv,inval;inval = 0;SS_LObv = r3; / Left-shift the reg number, WRITE=0for (j=0; j8

10、; j+) / send the register number and direction bitMOSI(bv) / put out a bitbv = 1; / shift one bit leftSCLK_HISCLK_LOfor (j=0; j7; j+) / get 7 bits and shift left into invalSCLK_HIMISOinval = 1; / shift in one bitSCLK_LOSCLK_HI / one more bit, but dont shift inval this timeMISOSCLK_LOSS_HIreturn inva

11、l; / return the byte we read invoid wreg(BYTE r,BYTE v) / register, valueint j;BYTE bv;SS_LObv = (r3)+2; / Left-shift the reg number, set the WRITE direction bitfor (j=0; j8; j+) / send the register number and direction bitMOSI(bv) / put out a bitbv = 1; / shift one bit leftSCLK_HISCLK_LOfor (j=0; j

12、8; j+) / send the register dataMOSI(v) / put out a bitv = 1; / shift one bit leftSCLK_HISCLK_LOSS_HI硬件SPI这一部分讨论上面提到的MAXQ2000微控制器,简单地说,MAXQ2000是低功耗、16位、高性能RISC处理器家族中的第一个。“Q”代表安静,表示这一结构能够与敏感的模拟电路很好地协调工作。MAXQ2000内建了一个SPI口,它与MAX3420E配合特别合适,下面的例子使用MAXQ2000开发板和MAX3420E搭建了一个简单、有趣的Windows小产品。MAXQ2000硬件SPI单元

13、提供了SCK、MOSI和MISO,但是没有SS#。由于SS#的操作方式会变化(比如寻址一个字节与突发的字节串),最好用通用I/O脚做SS#。MAXQ I/O单元图6. MAXQ I/O单元图6所示是一个基本的MAXQ I/O单元。I/O口以格式port.bit表示,p代表端口,b代表位。作为例子,我们主要讨论I/O口5,第3位(用P53)表示。每一个I/O单元有一个触发器,本例中用一个称为PO5.3的位来写。O代表输出。你一直可以写这个触发器,它的输出有没有与引脚相连由方向位决定。配置输出脚时,实际应用时先写触发器再连到引脚比较好,这样它可以避免引脚上出现毛刺。P53脚的方向由称作PD5.3的

14、位来设定。D代表方向,D信号充当引脚驱动的输出使能:1 = 驱动,0 = 浮空。引脚的状态一直可以通过称作PI5.3的位读取,I代表输入,无论引脚是如何驱动的,被内部触发器(PD5.3 = 1)还是被外部的信号(PD5.3 = 0),PI位表示引脚状态。这种结构的一个好处是如果引脚被配制成输入(PD5.3 = 0),触发器的输出没有被用作输出,那么它可以作为上拉电阻的开关重新利用。如果D = 0,0信号被重新定义,表示“连接一个上拉电阻”,如图6中的点状线所示。许多I/O脚有中断功能,如图6下面的框图所示,中断模块有三个信号: 一个中断标志位,中断请求有效时被置位,由CPU来复位。 一个边沿选

15、择位,决定是正信号跳变还是负信号跳变引起中断请求。 对每一个能引起中断的引脚有一个中断使能位。 我们的应用例子把MAX3420E的中断输出配置成正边沿触发中断,在MAXQ2000这边,程序直接测试USB中断的中断触发器,而不是使用MAXQ2000的中断系统。程序除了检测按键的状态和响应USB请求外什么都不干,因此只需一个查询循环。初始化SPIMAXQ2000的I/O引脚由通用I/O和像SPI单元这样的特殊功能硬件共享。使用特殊功能硬件时,先配置硬件块,然后把它连到I/O脚上。程序清单中的SPI_Init()过程设置了引脚方向,配置了SPI接口,最后使能它。 void SPI_Init(void)/ MAXQ2000 SPI portCKCN = 0x00; / system clock divisor is 1SS_HI / SS# high PD5 |= 0x070; / Set SPI output pins (SS, SCLK, DOUT) as output.PD5 &= 0x080; / Set SP

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号