TMS320F2812串行外设接口 Serial Peripheral Interface (SPI)
什么是SPI SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。(AD7705、AD1255、MAX7219) SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度可达到几Mbps。
串行异步通信 数据传输中,以帧为单位进行数据的传送。如图7.1.1所示,一帧数据由一个起始位、5-8位数据位、一个可编程校验位和一个停止位组成。
串行异步通信 起始位:占一位,用于实现发送和接收双发设备之间的同步。 数据位:包含着传输的数据信息,一般为5--8位。可编程校验位:占一位。这是用户自定义的特征位。用户可以根据发送数据的特征,对这一位进行相应的置1或清零。 校验位的信息和数据位的信息一起通过串行通信线发送到接收端,接收端在收到数据和校验信息位后,可以通过校验位来判别接收数据是否正确。 停止位:占一位。数据传输结束,发送端发送逻辑1,将通信线再次置为高电平,表示通知接收端一帧数据发送结束。直到下一帧数据到来,由起始位再次置低通信线,开始下一次数据的传输。 从上述可以看出,在串行异步通信过程中,发送和接收端之间的数据同步是通过数据帧中的起始位来完成的,每传输一帧数据,发送和接收端需要进行一次同步。
SPI控制模式 SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号: (1)MOSI – 主器件数据输出,从器件数据输入 (2)MISO – 主器件数据输入,从器件数据输出 (3)SCLK – 时钟信号,由主器件产生 (4)/SS – 从器件使能信号,由主器件控制
SPI工作时序 SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。
F2812的串行外设接口 F2812的SPI是一个高速同步的串行输入/输出接口。 SPI通常用于DSP和外设或其他处理器进行通信,主要应用于显示驱动器、ADC等器件之间。也可以采用主/从模式实现多处理器的通信。
在采用SPI 实现数据通信过程中,在多个SPI 器件互联的系统中其中一个设备必须设置成Master 模式,其它设置为Slave 模式。主设备驱动总线上的时钟信号为其它从设备提供通信时钟
SPI的操作 主模式(MASTER/SLAVE=1) 提供时钟。 从模式 (MASTER/SLAVE=0) SPI在SPICLK引脚为整个串行通信网络 提供时钟。 数据从SPISIMO引脚输出,并锁存SPISOMI引脚上输入的数据。 从模式 (MASTER/SLAVE=0) SPICLK引脚为串行移位时钟的输入,该时钟由网络主控制器提供。 SPISOMI引脚为数据输出引脚,SPISIMO引脚为数据输入引脚。
SPI 设备可以有以下几种工作模式: Master 发送数据,Slave 发送伪数据;
SPI 模块功能概述 在简单工作模式下,SPI可以通过移位寄存器实现数据交换,SPI通过SPIDAT寄存器移入或移出数据。 此外还可以通过可编程寄存器设置SPI接口的工作方式。在发送数据帧的过程中将16位的数据发送到SPITXBUF缓冲,直接从SPIRXBUF读取接收到的数据帧
C28x的SPI有两种操作模式: “基本操作模式” 在基本操作模式下,接收操作采用双缓冲,也就是在新的接收操作启动时CPU可以暂时不读取SPIRXBUF中接收到的数据,但是在新的接收操作完成之前必须读取SPIRXBUF,否则将会覆盖原来接收到的数据。在这种模式下,发送操作不支持双缓冲操作。在下一个字写到SPITXDAT寄存器之前必须将当前的数据发送出去,否则会导致当前的数据损坏。由于主设备控制SPICLK时钟信号,它可以在任何时候配置数据传输。 “增强的FIFO缓冲模式” 在增强的FIFO缓冲模式下,用户可以建立16级深度的发送和接收缓冲,而对于程序操作仍然使用SPITXBUF和SPIRXBUF寄存器。这样可以使SPI具有接收或发送16次数据的能力。此种模式下还可以根据两个FIFO的数据装载状态确定其中断级别
C28x的SPI接口特点
C28x的SPI接口特点
SPI 的数据传输 SPI主设备负责产生系统时钟,并决定整个SPI网络的通信速率。由于所有的SPI设备都采用相同的接口方式,可以通过调整处理器内部寄存器改变时钟的极性和相位 由于SPI器件并不一定遵循同一的标准,比如EEPROM,DAC,ADC,实时时钟,温度传感器等器件的SPI接口的时序都有所不同,为了能够满足不同的接口需要采用时钟的极性和相位可配就能够调整SPI的通信时序。
SPI设备传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或收发器左移一位数据。对于小于16位的数据在发送之前必须左对齐,如果接收的数据小于16位则采用软件将无效的数据位屏蔽。
SPI接口有主和从两种操作模式,MASTER / SLAVE位(SPICTL.2)选择操作模式以及SPICLK信号的来源。
主控制器模式 工作在主模式下(MASTER/SLAVE = 1),SPI在SPICLK引脚为整个串行通信网络提供时钟。 数据从SPISIMO引脚输出,并锁存SPISOMI引脚上输入的数据。SPIBRR寄存器确定通信网络的数据传输的速率,通过SPIBRR寄存器可以配置126种不同的数据传输率。
写数据到SPIDAT或SPITXBUF寄存器启动SPISIMO引脚上的数据发送,首先发送的是最高有效位(MSB)。 同时,接收的数据通过SPISOMI引脚移入SPIDAT的最低有效位。 当传输完特定的位数后,接收到的数据被发送到SPIRXBUF寄存器,以备CPU读取。 数据存放在SPIRXBUF寄存器中,采用右对齐的方式存储。
当指定数量的数据位已经通过SPIDAT位移位后,则会发生下列事件: SPIDAT中的内容发送到SPIRXBUF寄存器中。 SPI INT FLAG位(SPISTS.6)置1。 如果在发送缓冲器SPITXBUF中还有有效的数据(SPISTS寄存器中的TXBUFFULL位标示是否存在有效数据),则这个数据将被传送到SPIDAT寄存器并被发送出去。否则所有位从SPIDAT寄存器移出后,SPICLK时钟立即停止; 如果SPI INT ENA位(SPICTL.0)置1,则产生中断; 在典型应用中,SPISTE引脚作为从SPI控制器的片选控制信号,在主SPI设备同从SPI设备之间传送信息的过程中,SPISTE置成低电平;当数据传送完毕后,该引脚置高。
从设备模式 在从模式中(MASTER/SLAVE = 0),SPISOMI引脚为数据输出引脚, SPISIMO引脚为数据输入引脚。 SPICLK引脚为串行移位时钟的输入,该时钟由网络主控制器提供,传输率也由该时钟决定。SPICLK输入频率应不超过CLKOUT频率的四分之一
当从SPI设备检测到来自网络主控制器的SPICLK信号的合适时钟边沿时,已经写入SPIDAT或SPITXBUF寄存器的数据被发送到网络上。 要发送字符的所有位移出SPIDAT寄存器后,写入到SPITXBUF寄存器的数据将会传送到SPIDAT寄存器。 如果向SPITXBUF写入数据时没有数据发送,数据将立即传送到SPIDAT寄存器。为了能够接收数据,从SPI设备等待网络主控制器发送SPICLK信号,然后将SPISIMO引脚上的数据移入到SPIDAT寄存器中。 如果从控制器同时也发送数据,而且SPITXBUF还没有装载数据,则必须在SPICLK开始之前把数据写入到SPITXBUF或SPIDAT寄存器。
当TALK位(SPICTL.1)清零,数据发送被禁止,输出引脚(SPISOMI)处于高阻状态。 如果在发送数据期间将TALK位(SPICTL.1)清零,即使SPISOMI引脚被强制置成高阻状态也要完成当前的字符传输。这样可以保证SPI设备能够正确的接收数据。 这个TALK位允许在网络上有许多个从SPI设备,但在某一时刻只能有一个从设备来驱动SPISOMI。
SPISTE引脚用作从动选择引脚时,当SPISTE引脚为低时,允许从SPI设备向串行总线发送数据。当SPISTE为高电平时,从SPI串行移位寄存器停止工作,串行输出引脚被置成高阻状态。
SPI FIFO的描述 C28X的端口支持一个16级的收发FIFO,以减少CPU的开销; 什么是FIFO? FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
SPI FIFO的描述
SPI FIFO的描述 上电复位时,SPI工作在标准SPI模式,禁止FIFO功能。FIFO的寄存器SPIFFTX、SPIFFRX和SPIFFCT不起作用。 通过将SPIFFTX寄存器中的SPIFFEN置1,使能FIFO模式。SPIRST能在操作的任意阶段复位FIFO模式。 缓冲器:发送和接收器使用两个16*16FIFO。 延时发送:FIFO的发送速率可编程;便于SPI与许多速率较慢的外设接口; FIFO状态位可定义FIFO中可获得的字的数量。
FIFO 操作 系统在上电复位时,SPI工作在标准SPI模式,禁止FIFO功能 通过将SPIFFTX寄存器中的SPIFFEN的位置为1,使能FIFO模式。SPIRST能在操作的任一阶段复位FIFO模式。
FIFO模式有两个中断,一个用于发送FIFO、 SPITXINT,另一个用于接收FIFO、SPIINT/SPIRXINT。 对于SPI FIFO接收来说,当SPI FIFO接收信息,产生接收错误或者接收FIFO溢出都会产生SPIINT/SPIRXINT中断。 对于标准SPI的发送和接收,唯一的SPIINT将被禁止且这个中断将服务于SPI接收FIFO中断。发送和接收都能产生CPU中断。
一旦发送FIFO状态位TXFFST (位12–8)和中断触发级别位TXFFIL (位4–0 )匹配,就会触发中断。这给SPI的发送和接收提供了一个可编程的中断触发器。接收FIFO的触发级别位的缺省值是0x11111 ,发送FIFO的触发级别位的缺省值是0x00000
发送和接收缓冲器使用两个16x16FIFOs,标准SPI功能的一个字的发送缓冲器作为在发送FIFO和移位寄存器间的一个发送缓冲器 。移位寄存器的最后一位被移出后,这个一字发送缓冲器将从发送FIFO装载。FIFO中的发送字发送到发送移位寄存器的速率是可编程的。 SPIFFCT寄存器位 (7–0) FFTXDLY7–FFTXDLY0定义了在两个字发送间的延时。这个延时以SPI串行时钟周期的数量来定义。 该8位寄存器可以定义最小0个串行时钟周期的延迟和最大256个串行时钟周期的延时。 该可编程延时的特点,使得SPI接口可以同许多速率较慢的SPI外设如EEPROMs、ADC、 DAC等方便的直接连接。
发送和接收FIFOs 都有状态位TXFFST或RXFFST (位12– 0) ,状态位定义任何时刻在FIFO中可获得的字的数量。当发送FIFO复位位TXFIFO和接收复位位RXFIFO被设置为1时,将使FIFO指针指向0。一旦这两个复位位被清除为0,则FIFO将重新开始操作。
SPI 寄存器
SPI 配置控制寄存器(SPICCR)
SPI 操作控制寄存器(SPICTL)
SPI 状态寄存器(SPISTS)
SPI 波特率设置寄存器(SPIBRR) SPI模块支持125种不同的波特率和4种不同的时钟方式。当SPI工作在主模式时,SPICLK引脚为通信网络提供时钟;当SPI工作在从模式时,SPICLK引脚接收外部时钟信号。 在从模式下,SPI时钟的SPICLK引脚使用外部时钟源,而且要求该时钟信号的频率不能大于CPU时钟的四分之一; 在主动模式下,SPICLK引脚向网络输出时钟,且该时钟频率不能大于LSPCLK频率的四分之一;
SPI 串行接收缓冲寄存器 (SPIRXBUF) SPIRXBUF包含有接收到的数据,读SPIRXBUF会清除SPI INT FLAG 位(SPISTS.6)
SPI 串行发送缓冲寄存器(SPITXBUF)
SPIFFTX 寄存器
SPIFFRX 寄存器
SPIFFCT 寄存器
应用实例 TLV5617A 是带有灵活3 线串行接口的双10 位电压输出数/模转换器DAC 。 双10位电压输出数/模转换器(DAC) 可编程的内部基准 可编程的稳定时间 快速方式2.5us 慢速方式12us 可与TMS320 和SPITM 串行端口兼容 差分非线性<0.2 LSB(典型值)
TLV5617与F2812处理器接口连线
数据传送举例
SPI的初始化 当系统复位时,SPI外设模块默认状态: 该单元被配置为从模式; 禁止发送功能(TALK=0); 在SPICLK信号的下降沿输入的数据被锁存; 字符长度设定为1位; 禁止SPI中断; SPIDAT中的数据为0000H; SPI模块引脚功能被配置为通用的输入; 对SPI的初始化 清除SPI RESET位(SPICCR.7),以迫使SPI进入复位状态; 初始化SPI的配置包括数据格式、波特率、工作模式和引脚功能; 设置SPI RESET位(SPICCR.7),使SPI退出复位状态; 写数据到SPIDAT或SPITXBUF(启动主模式通信过程); 数据传输结束(SPISTS.6=1),读取SPIRXBUF数据; 在初始化SPI过程中,为防止产生不必要的事件,在使初始化值改变前清除SPI RESET位(SPICCR.7),然后,在初始化完成后再设置该位。在通信过程中不改变SPI的设置。
SPI设计应用举例
16位AD转换芯片AD7705 AD7705是十六位分辨率的A/D转换器,2 通道全差分模拟输入,使用+ 5V 单电源,主要应用于低频测量。它利用了Σ- △转换技术实现了16 位无G失代码性能,三线数字接口,可以通过串行输入接口由软件配置芯片的增益值、输入信号极性和数据更新速率,非常灵活方便。具有自校准和系统校准功能,能够消除器件本身和系统的增益以及偏移误差,是用于开发智能系统、微控制器系统和基于DSP 系统的理想产品。
AD7705的引脚 AIN2(+)/AIN2(-):差分模拟输入通道1的正/负输入端; VDD:电源电压,+2.7V~+5.2V; GND:内部电路的地点为基准点。 MCLK IN/MCLK OUT:主时钟信号输入/输出; SCLK:串行时钟输入; CS:片选信号,低电平有效; DOUT/DIN:串行数据输出/输入端; DRDY:数据输出准备; RESET:复位输入端;
AD7705内部结构框图
AD7705转换原理 ∑-△型ADC的电路结构核心是由∑-△调制器和数字滤波器组成。
AD7705片内控制寄存器 AD7705共有8个片内寄存器,通过器件SPI串行口访问。 通信寄存器:是一个8位读写寄存器,写入通信寄存器的数据决定下一次读写操作在哪一个寄存器上进行。所有与器件的通信都必须从通信寄存器开始,系统上电或初始化后,器件等待指令数据写入通信寄存器。通信寄存器中的RS2,RS1,RS0为寄存器选择位,它们决定对哪一个寄存器进行读写操作。常用寄存器主要有通信寄存器、设置寄存器、时钟寄存器和数据寄存器。
通讯寄存器 内容决定下一次操作是对哪一个寄存器进行读操作还是写操作,并控制对哪一个输入通道进行采样。所有与器件的通信都必须先写通信寄存器。上电或复位后,器件默认状态为等待指令数据写入通信寄存器。它的寄存器选择位RS2~RS0确定下次操作访问哪一个寄存器,而输入通道选择位CH1,CH0则决定对哪一个输入通道进行A/D转换或访问校准数据。
0/DRDY—— For a write operation, a “0” must be written to this bit so that the write operation to the Communications Register actually takes place. Once a “0” is written to this bit, the next seven bits will be loaded to the Communications Register. For a read operation, this bit provides the status of the DRDY flag from the part. The status of this bit is the same as the DRDY output pin. R/W ——Read/Write Select. This bit selects whether the next operation is a read or write operation to the selected register.A “0” indicates a write cycle for the next operation to the appropriate register, while a “1” indicates a read operation from the appropriate register.
其他控制寄存器 设置寄存器:是一个8位读写寄存器。用于设置工作模式、校准方式、增益等等。其中MD1、MD0为工作模式选择器,当MD1MD0=00时,设置寄存器进入正常工作模式,转换器开始进行正常的AD转换。 时钟寄存器:是一个8位读写寄存器,其中CLK为时钟位。用于设置有关AD7705运行频率参数和A/D转换输出更新速率。 数据寄存器:是一个16位只读寄存器,用来存放AD7705的最新转换结果。 其他的寄存器分别是测试寄存器、零标度校准寄存器、 满标度校准寄存器等,用于测试和存放校准数据,可用来分析噪声和转换误差。
接口电路设计 #define AD_RST GpioDataRegs. GPFDAT. bit 接口电路设计 #define AD_RST GpioDataRegs.GPFDAT.bit.GPIOF9 //output #define AD_REDY GpioDataRegs.GPADAT.bit.GPIOA1 //input
SPI端口配置初始化程序 设置系统时钟及使能SPI时钟 SysCtrlRegs.HISPCP.all=0X0007;//高速外设时钟/14 SysCtrlRegs.LOSPCP.all=0X0007;//低速外设时钟/14 SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; 设置使用端口 GpioMuxRegs.GPADIR.bit.GPIOA1 = 0;//use as input GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9=0; //digital I/O GpioMuxRegs.GPFDIR.bit.GPIOF9 = 1; //output
void InitSpi(void) { EALLOW; GpioMuxRegs.GPFMUX.all = 0x000f;//SPI外设端口使能 EDIS; SpiaRegs.SPICCR.bit.RESET=0;//复位状态 SpiaRegs.SPICCR.bit.SPICHAR=0x0f;//16bit SpiaRegs.SPICTL.bit.MASTER_SLAVE=1;//主模式 SpiaRegs.SPICTL.bit.SPIINTENA=1;//使能中断 SpiaRegs.SPICTL.bit.TALK=1;//使能发送 SpiaRegs.SPICCR.bit.CLKPOLARITY=1;//上升沿输出数据 SpiaRegs.SPICTL.bit.CLK_PHASE=0; SpiaRegs.SPIBRR=0x00ff;//波特率设置 SpiaRegs.SPICCR.bit.RESET=1; }
初始化AD7705内部寄存器 writeword(0x20); delay(); writeword(0x0C);
写函数 void writeword(unsigned int byteword) { unsigned int dataword; dataword=byteword; if((Spi_TxReady() == 1)) SpiaRegs.SPITXBUF = dataword; delay(); }
读函数 unsigned int readword(void) { unsigned int dataout; writeword(0x38); /*set the next operation for 16 bit read from the data register */ while(AD_REDY==0); // while(Spi_RxReady() ==0); dataout = data1; times++; return(dataout); }
unsigned int Spi_TxReady(void) { unsigned int i; if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1) i = 0; } else i = 1; return(i);
unsigned int Spi_RxReady(void) { unsigned int i; if(SpiaRegs.SPISTS.bit.INT_FLAG == 1) i = 1; } else i = 0; return(i);
串行LED显示驱动器MA7219 MAX7219 是美国MAXIM公司生产的串行输入/输出共阴极显示驱动器。该芯片可直接驱动最多8 位7 段数字LED 显示器。 MAX7219内涵8*8位静态RAM,用于存放显示数据,内部设有动态扫描电路及译码电路,可以通过硬件实现对8个显示数码管的动态扫描。 具有较强位段驱动能力,8位驱动电流大于170mA,段驱动能力大于20mA。
MAX7219 管脚 DIN 为串行数据输入端。 CLK 为串行时钟输入端。其最大工作频率可达10MHz。 LOAD 为片选端。 DIG0~DIG7 为吸收显示器共阴极电流的位驱动线。其最大值可达500mA。 SEGA~SEGG, DP 为驱动显示器7 段及小数点的输出端口驱动电流一般为40mA 左右。
工作原理
当LOAD 为低电平时, 芯片接收来自DIN 的串行数据。 数据传输位数为16位,在CLK时钟脉冲控制下,每个时钟上升沿从DIN 脚串行输入一位。 LOAD 脚在第16 个时钟上升沿出现的同时或者之后但在下一个CLK 上升沿到达之前对输入的数据进行锁存。 接收完毕, LOAD 回到高电平时, 接收的数据将被锁定。
MAX7219与DSP的接口扩展 MAX7219接口电平逻辑 F2812接口电平逻辑
电平转换芯片74LVC245 74LVC4245A Octal dual supply translating transceiver; 3-state The 74LVC4245A is an octal dual supply translating transceiver featuring non-inverting 3-state bus compatible outputs in both send and receive directions. It is designed to interface between a 3 and 5 V bus in a mixed 3/5 V supply environment. The 74LVC4245A features an output enable (OE) input for easy cascading and a send/receive (DIR) input for direction control. (OE) controls the outputs so that the buses are effectively isolated.
引脚及内部逻辑
真值表
输入及输出电平逻辑
接口的连接
MAX7219工作方式及控制寄存器 Serial-Data Format (16 Bits)
Serial-Addressing Modes
Decode-Mode Register Examples (Address (Hex) = X9)
Code B Font The decimal point is set by bit D7 = 1
No-Decode Mode Data Bits and Corresponding Segment Lines
Scan-Limit Register Format (Address (Hex) = XB)
Intensity Register Format (Address (Hex) = XA)
Shutdown Register Format (Address (Hex) = XC)
程序设计 Main() { ………. /**************初始化MAX7219程序*********************/ Intensity(11); //通过Intensity Register设置数码管亮度 ScanLimit(7); //选择显示数码管的个数 DisplayTest(); //测试数码管 ShutDown(0x01); //采用正常模式 DecodeMode(0x0ff);//选择B码译码模式 /**************初始化MAX7219完成*********************/ }
//通过Intensity Register设置数码管亮度 void Intensity ( int brightness ) { unsigned int w = 0x0A00; brightness &= 0x0F; w |= brightness; W2MAX7219(w); } /* The function sends a 16 bit display control */ /* word to MAX7219 to select how many digits */ void DecodeMode (unsigned int w) w &= 0xFF; w |= 0x0900;
/*************************************************/ /* The function sends a 16 bit control word to */ /* MAX7219 Data Line Input port */ void W2MAX7219(unsigned int w) { if((Spi_TxReady() == 1)) SpiaRegs.SPITXBUF = w; Delay(10000); }
主函数中MAX7219的操作 while(1) { data = readdata(); data_out = (int)1000*3.0*(data-32768.0)/32768.0; if((Spi_TxReady() == 1)) shownum = BIN2BCD(data_out); ShowBCD(shownum); } Delay(400000); KickDog();
十进制数转换为BCD码函数 unsigned int BIN2BCD(unsigned int bin) { unsigned int a, v; a = bin%10; v = a; bin /= 10; v |= a<<4; v |= a<<8; v |= a<<12; return(v); }
显示字符函数 void ShowBCD(unsigned int bcd) { int k, m; m = (bcd&0xF000)>>12; k = m | 0x0400; k = k | 0x0080; //显示小数点 W2MAX7219(k); m = (bcd&0xF00)>>8; k = m | 0x0300; m = (bcd&0xF0)>>4; k = m | 0x0200; m = bcd&0xF; k = m | 0x0100; }