tag 标签: 外设接口

相关博文
  • 热度 10
    2015-3-24 13:27
    876 次阅读|
    0 个评论
       1 引言   DSP(数字信号处理)的优势除了处理复杂的运算,特别适用于数字滤波、语音、视频、图象处理、通信以及高速实时测控系统中已成为现代信息处理技术的重要器件,极大地促进了信号处理和测控各个领域的学术研究、产品开发及应用。TI公司TMS320LF2407是一种专用定点DSP芯片,与以往的产品相比.最大不同就是有丰富的外设.像SCI、SPI、EV等等.在处理数据优势上添加了事务管理能力。   其中串行外设接口(Serial Peripheral Interface)是Motorola公司提出的一种同步串行外围接口协议.主要应用在EEPROM、FLASH、实时时钟、AD转换器.还有数字处理和数字解码器之间。包括主/从2种模式,具有I/O资源占用少、协议实现简单、传输速度快、能够同时收发信息、支持绝大部分处理器芯片等优点,是一种高速的全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚.同时为PCB的布局上节约了空间,提供了方便,正是出于这种简单易用的特性,TMS320LF2407芯片也集成了这种通信协议。    2 SPI接口结构和设计原理   2.1 SPI接口结构   该SPI设计主要有两大部分组成:微控制器接口和SPI控制接口。通过控制线、数据线、和地址线三大总线把微控制接口与SPI控制接口连接在一起,如果外部有更多的SPI接口模块。可以由SPI控制接口运用软件编程与设置,实现扩展具有SPI接口的外部设备。   TMS320LF2407中采用的主从控制器连接通信。主控制器通过输出SPICLK信号来启动数据传送。对主控制器和从控制器.数据都是在SPICLK的一个边沿移出移位寄存器,并在相对的另一个边沿锁存到移位寄存器。如果CLOCK PHASE位是1.数据的发送和传输就要在SPICLK跳变之前的半个周期发生。主控制器可以在任一时刻启动数据发送.因为它控制着SPICLK信号。由软件决定了主控制器如何检测从控制器何时准备发送数据,以启动SPI传送数据。 图1 SPI内部结构    2.2 SPI设计原理   SPI接口是同步串行总线的一种,在同步时钟信号SCK下,能够高速、可靠的传送数据。它分为主从(MASTER/SLAVER)两种传输模式。主模式下的发送总线即是从模式的接收总线:与之对应的是从模式下的发送总线即是主模式的接收总线。它们可以同时接收和发送数据.而且发送和接收操作可以通过中断或者查询方法来完成。    2.2.1工作时钟   时钟极性CPOL和时钟相位CPHA控制着时钟信号引脚上4中不同的时钟方式。在设备被使能激活后.还未进行数据传输时或两个字节数据间歇期间,SCK处于空闲电平,通过时钟极性控制位可以选择此空闲电平的电平时0还是1:时钟相位控制位用来选择数据接收端设备的采样时刻。在该采样时刻,线上数据必须同时满足建立时间和保持时间两个参数,因此数据发送端设备应提前将数据移出到数据线上。   4种不同的时钟方式能根据外设需要,能够提供相对应的传输协议来完成数据的传输工作。它们之间没有优先级.SPI线上的主从设备必须根据具体情况设置匹配的传输时序模式.时序只有匹配擞据传输才能正常进行。如果设置的不匹配.可能导致数据接收方和发送方在同一个时钟沿作用.导致数据输出失败。   图2是CPHA=0时的数据传输时序.它同时包含了CPOL=0和CPOL=1的情况,当CPOL=O时,要传输的数据在时钟信号没有延时且上升沿出发送,在时钟信号下降沿处接收数据。当CPOL=1时,同样在没有延时的情况下传输,不同的是下降沿发送数据,上升沿接收。图3是CPHA=1时数据传输时序。与图2相似,但采样时刻延迟了半个周期。 图2 CPHA="0是SPI总线数据传输时序" 图3 CPHA="1时SPI总线数据传输时序"    3 SPI硬件设计   寄存器在SPI中起着决定性的作用.无论是在微控制器接口,还是SPI控制接口,寄存器在数据传输和控制方面都是主要的组成部分。而寄存器最基本最重要的单元是触发器.只有改善触发器的结构,才能提高整个SPI接口的性能。   有的串行接口设计中采用B结构的触发器设计,这些结构里应用的是一种简单的MOS管做开关.虽然MOS管做开关有功耗低,占面积小的优点。但要提高它的电路工作频率.开关速度,制作丁艺却是越来越困难。而且如果输入信号不强.就很可能出现信号倒流,这就需要一个较高电压来控制开关。这也不利于数据传输和降低功耗等等。   为了解决由MOS管做开关时引起的种种难题.来实现在TMS320LF2407串行接口中的信息传递的高速率。本设计综合考虑速度、工作电压、噪声容限等因素的影响.采用了一种新颖的触发器结构(图4A部分),本文接口电路中大都采用了该触发器的电路设计,工作电压降低到3.3V,大大降低了整体功耗;在开关方面采用了三态门,有效的防止了信号倒流,实现了信号传输的稳定;添加了一个反馈信号,在需要的时候.能够把所需反馈信号再次输入;同时加快r开关速率,带负载的能力也增强。 图4 A、B两种触发器比较    4 RTL级设计   随着数字系统设计的复杂性不断增加,在设计初期指定有效的设计策略对于整个设计是至关重要的。行为描述方式是对系统数学模型的描述。它包括RTL、算法级、系统级的描述。RTL是指通过描述寄存器之间数据流动来描述数字电路系统,是一个数据流的概念.寄存器与寄存器之间的数据处理由组合逻辑完成。RTL级是Verilog较高抽象层次,在这个抽象层次上,模块可以根据设计的算法来实现.而不用考虑具体的实现细节。    4.1寄存器整体电路设计   下面是部分Verilog HDL源代码.描述了数据传输时相关寄存器的功能设置:先是对复位时各个寄存器的初始值,接下来是对寄存器进行功能设计.和数据传输时候产生的中断使能和标志位的设计。    4.2整体时序仿真   将上述Verilog代码编译,再写上对应测试代码进行验证。图5是寄存器的写操作的整体时序仿真波形图.验证了上述代码正确可行。 图5写操作整体时序仿真    5 结论   本文作者的创新点是改进了硬件触发器的结构.用三态门和传输门取代那种单一MOS管的结构。首次应用到TMS320LF2407芯片串行外设接口上,降低工作电压到3.3V,加快数据传输,而且还有相应的反馈信号,进一步完善了触发器结构。同时有很好的可移植性好。具有充分的可裁剪性,本设计运行可靠,达到预期的效果。
  • 热度 22
    2012-9-12 09:26
    2148 次阅读|
    2 个评论
    转载请注明出处! 1.GPIO接口设计思想 1.1CoX.GPIO发展过程,历史版本      CoX第一版从2009年开始,从CoX诞生开始,CoX的目标就是要做到在M系列的CPU上实现平滑移植。所以,GPIO的实现,第一版首先实现了,IO的模式配置(输入、输出)和管脚的上拉、下拉配置;然后,实现了IO管脚的状态读写。具体可以从接口定义清晰的看出来: typedef struct {   COX_Status (*Init) (COX_PIO_Dev pio);   COX_Status (*Dir)  (COX_PIO_Dev pio, uint8_t dir);   uint8_t     (*Out)  (COX_PIO_Dev pio, uint8_t level);   uint8_t     (*Read) (COX_PIO_Dev pio);   COX_Status (*Cfg)  (COX_PIO_Dev pio, uint8_t index, uint32_t arg, uint32_t*pre_arg); } COX_PIO_PI_Def; typedef const COX_PIO_PI_Def COX_PIO_PI; 这样的实现,确实可以大大减小IO操作的移植,因为我们在每个厂商实现一套API,以新唐为例: COX_PIO_PI pi_pio = {        NUC_GPIO_Init,        NUC_GPIO_SetDir,        NUC_GPIO_Out,        NUC_GPIO_Read,        NUC_GPIO_Cfg }; 在使用的时候,我们仅仅需要使用pi_pio的指针就可以调用GPIO的API操作了,而且这个指针还可以被驱动嵌套使用。有兴趣的可以参考NUC140-LB Board的CoOS例程,这个在 www.coocox.org 官网可以下载到。 然而,第一版有几个明显的不足: 1.                实现的功能很少,只有IO的基本配置和读写操作,没有外部中断实现,没有多功能配置实现,以及一些其他特殊的功能。 2.                采用了结构体的形式,代码的可读性大大降低,效率也不高。 3.                CoX代码不能搞定所有基本的事情,在使用CoX库的使用还必须和厂商库配套使用。 4.                CoX在第一版更多的注重外设模块的移植,而忽略了系统。     所以,CoX需要改进、升级。经常一年多时间的积累,在2011年开始推出CoX 2.0版本,这个版本解决了上述所有的缺点的同时,保留了CoX设计的初衷——那就是在M系类CPU上面的通用性。下面,详细介绍2.0版的CoX.GPIO接口。 1.2通用强制接口 通用强制接口是提取的一套ARM Cortex M0/M3所有厂商系列MCU都具有的功能接口。本篇以新唐M051为例讲解CoX.GPIO,其他系列大同小异, 提取GPIO通用接口的时候,是从以下角度出发考虑的: u      配置一个GPIO管脚线 l        方向配置: n        输入  n        输出 n        硬件功能 l        外围功能配置: l        Pad配置: n        驱动能力大小(电流) n        开源/推挽 n        弱上拉/下拉电阻 u      GPIO管脚数据控制 l        输出高/低电平 l        获取管脚输入值 u      输入中断(EXTI) l        上升沿检测 l        下降沿检测 l        上/下沿检测 l        低电平检测 l        高电平检测   APIs分组完成以下几大功能: u      配置GPIO管脚线的函数: l        xGPIODirModeSet l        xGPIOSPinDirModeSet l        xGPIOPinConfigure u      读回GPIO管脚线模式配置的函数: l        xGPIODirModeGet u      还有很方便的函数,可以将GPIO配置成想要的功能: l        xGPIOSPinTypeGPIOInput l        xGPIOSPinTypeGPIOOutput l        xSPinTypeADC l        xSPinTypeI2C l        xSPinTypeSPI l        xSPinTypeTimer l        xSPinTypeUART l        xSPinTypeACMP u      处理GPIO中断的APIs l        xGPIOPinIntCallbackInit l        xGPIOPinIntEnable l        xGPIOSPinIntEnable l        xGPIOPinIntDisable l        xGPIOSPinIntDisable l        xGPIOPinIntStatus l        xGPIOPinIntClear l        xGPIOSPinIntClear u      处理GPIO Pin状态的APIs l        xGPIOPinRead l        xGPIOSPinRead l        xGPIOPinWrite l        xGPIOSPinWrite   1.3通用非强制接口  通用非强制接口是一部MCU通有的功能,而不是所有MCU都具有的功能接口: l        xGPIOSPinTypeGPIOOutputOD l        xGPIOSPinTypeGPIOOutputQB l        xSPinTypePWM l        xSPinTypeEXTINT l        xSPinTypeEBI   CoX的宏定义的参数和APIs都是以' x '开头的, 体现出CoX接口的特征。比如将 GPIOA Pin0配置成输出模式, 代码如下: xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT); 函数和形式参数都是x开头。 1.4厂商库特色接口 特色接口是包括了通用性接口,和MCU特有功能的接口。比如: void GPIOPinDebounceEnable(unsigned long ulPort, unsigned long ulPins);并不是通用强制型或者通用非强制型,而是MCU特有的功能,就是在厂商库特色接口这一组。   另外厂商库接口也实现了MCU其他所有的功能,比如: void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins,                       unsigned char ucVal); 也实现了GPIO管脚线模式的配置,这个在CoX接口的xGPIOPinWrite也是这个功能。其实这个时候xGPIOPinWrite的实现方式如下: #define xGPIOPinWrite(ulPort, ulPins, ucVal)                                  \         GPIOPinWrite(ulPort, ulPins, ucVal) 进行了一次宏定义包装罢了,对应的参数也是进行的一次宏定义比如: #define xGPIO_PIN_0             GPIO_PIN_0   2.设计技巧简介 GPIO的CoX接口创新性的提出了Short Pin,比如PA0 是GPIOA的Pin0脚,它的定义如下: #define PA0                     PA0   自从有了Short Pin之后,对GPIO的操作简单多了,例如比如将GPIOA Pin0配置成输出模式,并输出高电平, 代码如下: xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT); xGPIOPinWrite(xGPIO_PORTA_BASE, xGPIO_PIN_0, 1); 现在用Short Pin作为参数,上面的功能可以这样实现: xGPIOSPinTypeGPIOOutput(PA0); xGPIOSPinWrite(PA0, 1); 上面的Short Pin到底是如何实现的呢?看起来很神奇,以xGPIOSPinWrite为例说明它的实现过程: #define xGPIOSPinWrite(eShortPin, ucVal)                                      \         GPIOSPinWrite(eShortPin, ucVal) #define GPIOSPinWrite(eShortPin, ucVal)                                       \         GPIOPinWrite(G##eShortPin, ucVal) 关于##, 其实是宏定义里面的高级用法,它是一个连接符,遇到此连接符,宏会一直展开下去,直到不能展开为止。G##eShortPin其实会连接为GPA0,而GPA0同样是个宏定义,如下: #define GPA0                    GPIO_PORTA_BASE, GPIO_PIN_0 GPIOPinWrite(GPA0, ucVal)会进一步展开为 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, ucVal),这个函数在厂商库里面定义了的,所以实现了Pin写的功能。   另外Short Pin对GPIO管脚的外设多功能复用操作也带来了极大的方便,比如配置PD5为I2C的clock脚功能,如下: xSPinTypeI2C(I2C0SCK, PD5); 是不是很简单!!!上面的实现如下: #define xSPinTypeI2C(ePeripheralPin, eShortPin)                              \ do                                                                    \ {                                                                     \          GPIOSPinConfigure(ePeripheralPin, eShortPin);                      \          GPIOSPinFunctionSet(GPIO_FUNCTION_I2C,eShortPin);             \ }                                                                    \ while(0)     #define GPIOSPinConfigure(ePeripheralPin, eShortPin)                          \        GPIOPinConfigure(GPIO_##eShortPin##_##ePeripheralPin) 上面的会连接成这样GPIOPinConfigure(GPIO_PD5_I2C0SCK), GPIO_PD5_I2C0SCK宏定义如下: #define GPIO_PD5_I2C0SCK        0x00003510 这个是根据多功能复用进行的编码,视不同的芯片,这个编码方式灵活多变。   还有一些接口完全是为了移植方便性而产生的,比如xGPIOSPinToPort, 这个接口是由Short Pin就可以得到这个Pin所对应的PORT Base,而在CoX.SYSCTL中有一个接口xSysCtlPeripheralEnable2是使用外设地址Base为参数使能这个外设(在SYSCTL中维护了一个外设BASE-ID-INT的表),它实现的时候,是进行了一个Base到外设ID的一个转换,最终还是调用xSysCtlPeripheralEnable使能外设的。但是有了这个功能,也很利于基于CoX驱动组件的移植性,例如在AD7415温度传感器是通过I2C接口进行数据通信的,在这个驱动组件头文件中, 只需要考虑一下四个元素就可以平滑的使得这个驱动组件移植到其他的MCU上(比如NUC1xx,或者STM32F1xx): // //! Config the device i2c Address // #define AD7415_I2C_ADDRESS      0x48   // //! Config the devide i2c bus master // #define AD7415_MASTER_BASE     xI2C0_BASE   // //! Config the i2c SDA pin // #define AD7415_PIN_I2CSDA        PA8   // //! Config the i2c SCL pin // #define AD7415_PIN_I2CSCK        PA9 因为有了xI2C0_BASE在驱动中就可以使能这个I2C外设,有了连接的管脚也就可以使能对应的GPIO PORT, 如xSysCtlPeripheralEnable2(AD7415_MASTER_BASE); 这里不在需要给出I2C0的外设使能ID,或者GPIOA的外设使能ID, 用户移植的时候只需要从硬件连接角度出发,用了那个I2C, 管脚是怎么连接的,而不需要考虑其他的元素。 3. GPIO接口使用示例与移植 下面给出一个CoX.GPIO的示例,都是使用的通用强制型的接口,因此下面的例子在所有Cortex M0/M3上都是平滑移植的, 类似一个简单的电灯程序。 void Blinky(void) {     unsigned long i;           //     // Initionalize system clock.     //     xSysCtlPeripheralClockSourceSet( 12000000,  xSYSCTL_XTAL_12MHZ );           //     // Set GPIO port c pin 0 , 1 output mode.     //     xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT );     xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_1, xGPIO_DIR_MODE_OUT );           while (1)     {             //         // Delay some time.         //         for( i = 0; i 0x1FFFF; i++ )                          //         // Output high level.         //         xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 1 );                         for( i = 0; i 0x1FFFF; i++ )                         //         // Output low level.         //         xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 0 );        }       }   更多请访问: http://www.coocox.org/COX.html
相关资源
  • 所需E币: 4
    时间: 2020-1-1 23:51
    大小: 608.26KB
    上传者: wsu_w_hotmail.com
    压力测量器件可分为两类:一类将压力作为唯一激励源,另一类则需要使用电激励。仅由压力激励的机械器件,例如波纹管压力传感器、隔膜型压力传感器、管型压力传感器或压力计,通常都是纯机械系统的理想选择。在这些器件中压力的变化将导致系统产生机械应变,例如改变机械臂的位置或者管中的液位。电激励的压力传感器工作在单片机环境下可发挥最大作用。如压阻式压力传感器、线性可调差动变压器(LinearVariableDifferentialTransformer,LVDT)或者电容式压力传感器都是这种类型的传感器。测量压力时最常用的就是压阻式压力传感器。本应用笔记将重点讨论压阻式传感元件从传感器到单片机的信号调理路径。还将展示如何对此传感器的电输出信号进行放大、滤波和转换成数字信号,以供单片机的校准程序使用。在理论讨论完之后还给出了一个特别设计用来测量气压的具体的压力测量方案。AN695压力传感器与Microchip模拟外设的接口本应用笔记将重点讨论压阻式传感元件从传感器到单片作者:BonnieBaker机的信号调理路径。还将展示如何对此传感器的电输出MicrochipTechnologyInc.信号进行放大、滤波和转换成数字信号,以供单片机的校准程序使用。在理论讨论完之后还给出了一个特别设引言计用来测量气压的具体的压力测量方案。压力测量器件可分为两类:一类将压力作为唯一激励压阻式压力传感器源,另一类则需要使用电激励。仅由压力激励的机械器件,例如波纹管压力传感器、隔膜型压力传感器、管型……