本讲主要内容:1、SSI的简介及传输模式2、常用的SSI库函数3、SSI配成SPI控制AD的模式选择4、调用API函数控制AD转换的操作流程1.1、SSI简介:Stellaris®系列ARM的SSI(SynchronousSerialInterface,同步串行接口)是与具有FreescaleSPI(飞思卡尔半导体)、MicroWire(美国国家半导体)、TexasInstruments(德州仪器,TI)同步串行接口(SSI)的外设器件进行同步串行通信的主机或从机接口。1、SSI的简介及传输模式Stellaris®SSI模块具有以下特性:主机或从机操作时钟位速率和预分频可编程独立的发送和接收FIFO,16位宽,8个单元深。FreescaleSPI、MICROWIRE、或德州仪器同步串行接口的操作可编程数据帧大小可编程,范围为4~16位内部回送测试(loopbacktest)模式,可进行诊断/调试测试1.2、SSI通信协议对于FreescaleSPI、MICROWIRE、TexasInstruments3种帧格式,当SSI空闲时串行时钟(SSICLK)都保持不活动状态,只有当数据发送或接收时处于活动状态,SSICLK才在设置好的频率下工作。利用SSICLK的空闲状态可提供接收超时指示。如果一个超时周期之后接收FIFO仍含有数据,则产生超时指示。对于FreescaleSPI和MICROWIRE这两种帧格式,串行帧(SSIFss)管脚为低电平有效,并在整个帧的传输过程中保持有效(被下拉)。对于TexasInstruments同步串行帧格式,在发送每帧之前,每遇到SSICLK的上升沿开始的串行时钟周期时,SSIFss管脚就跳动一次。在这种帧格式中,SSI和片外从器件在SSICLK的上升沿驱动各自的输出数据,并在下降沿锁存来自另一个器件的数据。不同于其它两种全双工传输的帧格式,在半双工下工作的MICROWIRE格式使用特殊的主-从消息技术。在该模式中,帧开始时向片外从机发送8位控制消息。在发送过程中,SSI没有接收到输入的数据。在消息已发送之后,片外从机对消息进行译码,并在8位控制消息的最后一位也已发送出去之后等待一个串行时钟,之后以请求的数据来响应。返回的数据在长度上可以是4~16位,使得在任何地方整个帧长度为13~25位。1.3、SSI的几种传输模式1)德州仪器同步串行的帧格式在该模式中,任何时候当SSI空闲时,SSICLK和SSIFss被强制为低电平,发送数据线SSITx为三态。一旦发送FIFO的底部入口包含数据,SSIFss变为高电平并持续一个SSICLK周期。即将发送的值也从发送FIFO传输到发送逻辑的串行移位寄存器中。在SSICLK的下一个上升沿,4~16位数据帧的MSB从SSITx管脚移出。同样地,接收数据的MSB也通过片外串行从器件移到SSIRx管脚上。然后,SSI和片外串行从器件都提供时钟,供每个数据位在每个SSICLK的下降沿进入各自的串行移位器中。在已锁存LSB之后的第一个SSICLK上升沿上,接收数据从串行移位器传输到接收FIFO。2)FreescaleSPI的帧格式FreescaleSPI接口是一个4线接口,其中SSIFss信号用作从机选择。FreescaleSPI格式的主要特性为:SSIClk信号的不活动状态和相位均通过SSISCR0控制寄存器中的SPO和SPH位来设置。SPO时钟极性位当SPO时钟极性控制位为低时,它在SSIClk管脚上产生稳定的低电平值。如果SPO位为高,则在没有进行数据传输的情况下,它在SSIClk管脚上产生一个稳定的高电平值。SPH相位控制位SPH相位控制位用来选择捕获数据的时钟边沿并允许边沿改变状态。SPH在第一个传输位上的影响最大,因为它可以在第一个数据捕获边沿之前允许或不允许一次时钟转换。当SPH相位控制位为低时,在第一个时钟边沿转换时捕获数据。如果SPH位为高,则在第二个时钟边沿转换时捕获数据。FreescaleSPI的四种帧格式:(1)SPO=0和SPH=0时,FreescaleSPI的帧格式(2)SPO=0和SPH=1时FreescaleSPI的帧格式(3)SPO=1和SPH=0时FreescaleSPI的帧格式(4)SPO=1和SPH=1时FreescaleSPI的帧格式注意:以上四个图的Q表示未定义3)MICROWIRE的帧格式MICROWIRE格式与SPI格式非常类似,只是MICROWIRE为半双工而不是全双工,使用主-从消息传递技术。每次串行传输都由SSI向片外从器件发送8位控制字开始。在此传输过程中,SSI没有接收到输入的数据。在消息发送完毕之后,片外从机对消息进行译码,SSI将8位控制消息的最后一位发送完成之后等待一个串行时钟,之后从机以请求的数据来响应。返回的数据在长度上为4~16位,使得任何地方的总的帧长度都为13~25位。MICROWIRE的帧格式2、常用的SSI库函数1)使能SSI模块函数VoidSysCtlPeripheralEnable(unsignedlongulPeripheral)参数:unsignedlongulPeripheral:SSI模块的基址,取下列值之一SYSCTL_PERIPH_SSI只有一个SSISYSCTL_PERIPH_SSI0有两个SSISYSCTL_PERIPH_SSI1有两个SSI举例:SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI);//使能SSI模块注:LM3S811只有一个SSI模块2)将GPIO管脚配置为SSI功能voidGPIOPinTypeSSI(unsignedlongulPort,unsignedcharucPins)参数:unsignedlongulPort:端口地址unsignedcharucPins:SSI所在的管脚举例:GPIOPinTypeSSI(SSICLK_PORT,SSICLK_PIN);//将相关PA2设置为SSICLK功能3)SSI配置函数VoidSSIConfig(a,b,c,d,e)等价于voidSSIConfigSetExpClk(unsignedlongulBase,unsignedlongulSSIClk,unsignedlongulProtocol,unsignedlongulMode,unsignedlongulBitRate,unsignedlongulDataWidth)宏定义里面已经定义过参数:ulBase:SSI模块的基址,应当取下列值之一:SSI_BASE//SSI模块的基址(用于仅含有1个SSI模块的芯片)SSI0_BASE//SSI0模块的基址(等同于SSI_BASE)SSI1_BASE//SSI1模块的基址ulSSIClk:提供给SSI模块的时钟速度ulProtocol:数据传输的协议,应当取下列值之一:SSI_FRF_MOTO_MODE_0//Freescale(飞思卡尔半导体)格式,极性0,相位0SSI_FRF_MOTO_MODE_1//Freescale(飞思卡尔半导体)格式,极性0,相位1SSI_FRF_MOTO_MODE_2//Freescale(飞思卡尔半导体)格式,极性1,相位0SSI_FRF_MOTO_MODE_3//Freescale(飞思卡尔半导体)格式,极性1,相位1SSI_FRF_TI//TI(德州仪器)格式SSI_FRF_NMW//National(美国国家半导体)MicroWire格式ulMode:SSI模块的工作模式,应当取下列值之一:SSI_MODE_MASTER//SSI主模式SSI_MODE_SLAVE//SSI从模式SSI_MODE_SLAVE_OD//SSI从模式(输出禁止)ulBitRate:SSI的位速率,这个位速率必须满足下面的时钟比率标准:ulBitRate≤FSSI/2(主模式)ulBitRate≤FSSI/12(从模式)其中FSSI是提供给SSI模块的时钟速率ulDataWidth:数据宽度,取值4~16举例:SSIConfig(SSI_BASE,SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER,ulBitRate,12);//SSI配置:基址,飞思卡尔模式0,主模式,2M位速率,12数据宽度4)使能SSI发送和接收voidSSIEnable(unsignedlongulBase)参数:ulBase:SSI模块的基址,取值:SSI_BASE、SSI0_BASE或SSI1_BASE举例:SSIEnable(SSI_BASE);//使能SSI收发5)等待SPI传输完毕intwait()//等待传输完毕{if((HWREG(SSI_BASE+SSI_O_SR)&0x00000010)==0x00000010)return1;elsereturn0;}上面的函数采用寄存器访问的方式读取SSISR寄存器中低4位的状态来决定SPI总线的状态是忙碌还是空闲,其中前面的是SSI端口的基址,后面的是寄存器的偏移量,具体的值已经在SSI.h文件中给出。寄存器中的各位定义如下页所示:6)将一个数据单元放入SSI的发送FIFO里voidSSIDataPut(unsignedlongulBase,unsignedlongulData)参数:ulBase:SSI模块的基址,取值:SSI_BASE、SSI0_BASE或SSI1_BASEucData:要发送数据单元(4~16个有效位)举例:SSIDataPut(SSI_BASE,cmd);//发送通道选择命令7)从SSI的接收FIFO里读取一个数据单元voidSSIDataGet(unsignedlongulBase,unsignedlong*pulData)参数:ulBase:SSI模块的基址,取值:SSI_BASE、SSI0_BASE或SSI1_BASEpulData:指针,指向保存读取到的数据单元地址3、SSI配成SPI控制AD的模式选择由于Stellaris®同步串行接口(SSI)是与具有FreescaleSPI、MICROWIRE或德州仪器同步串行接口(SSI)的外设器件进行同步串行通信的主机或从机接口,因此我们控制SPI外设器件的时候要根据所控制外设器件的SPI通信格式来选择其中的一种模式作为SSI的通信格式,才能保证数据的传输。我们所用的AD是TI公司的12位串行SPI模式的AD转换芯片TLC2543。使用片选,数据宽度为12位。因此根据TLC2543的时序要求,我们选择的是:SSI_FRF_MOTO_MODE_0即:飞思卡尔模式0(SPO=0和SPH=0),片选采用其它的GPIO来模拟,而不是用SSI的片选。TLC2543的SPI模式的时序图如下图所示:4、调用API函数控制AD转换的操作流程1)调用防止JTAG失效函数;2)初始化系统时钟并设置SSI的时钟;3)初始化SSI模块和所用到的GPIO;4)配置SSI模块,包括传输模式的选择;5)使能SSI收发;6)调用SSI接收与发送函数,实现数据的传送,注意调用接收与发送函数的时候要加入等待传输完毕。