Transcript SPI

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)
 SPI在SPICLK引脚为整个串行通信网络
提供时钟。
 数据从SPISIMO引脚输出,并锁存SPISOMI引脚上输入的
数据。
• 从模式 (MASTER/SLAVE=0)
 SPICLK引脚为串行移位时钟的输入,该时钟由网络主控
制器提供。
 SPISOMI引脚为数据输出引脚,SPISIMO引脚为数据输入
引脚。
• SPI 设备可以有以下几种工作模式:
–
–
–
Master 发送数据,Slave 发送伪数据;
Master 发送数据,其中一个Slave 发送数据
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设备,但
同一时刻只能有一个设备起作用。
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的电路结构核心是由∑-△调制器和数字滤波器
组成。
• ∑-△型调制器是由积分器、比较器、16位DA转换器等组
成的简单的模拟电路,原理上近似于积分型,将输入电压
转化成时间(脉冲宽度)信号,用数字滤波器处理后得到数
字值。
• ∑-△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.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;
•
EALLOW;
•
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;
•
EDIS;
• }
初始化AD7705内部寄存器
•
•
•
•
•
•
•
•
writeword(0x20);
delay();
writeword(0x0C);
delay();
writeword(0x10);
delay();
writeword(0x40);
delay();
写函数
• 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 noninverting 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;
W2MAX7219(w);
}
/*************************************************/
/* 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
Delay(10000);
}
}
= w;
主函数中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;
a = bin%10;
v |= a<<4;
bin /= 10;
a = bin%10;
v |= a<<8;
bin /= 10;
a = bin%10;
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;
W2MAX7219(k);
m = (bcd&0xF0)>>4;
k = m | 0x0200;
W2MAX7219(k);
m = bcd&0xF;
k = m | 0x0100;
W2MAX7219(k);
}