7 DSP原理与应用教案 SPI
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《DSP原理与应用》教案(7)
教学课时:4学时
七、串行外设接口模块
7.1 串行外设接口概述
部分F240x器件包括带4个引脚的串行外设接口(SPI)模块。
SPI是一个高速、同步串行I/O口,它允许长度可编程的串行位流(1~16位)以可编程的位传输速度移入或移出器件。
通常SPI用于DSP处理器和外部外设以及其他处理器之间的通信。
典型的应用包括通过诸如移位寄存器、显示驱动器、DAC以及日历时钟等器件所进行的外部I/O 或器件的扩展。
SPI的主/从操作支持多处理器通信。
SPI模块的特性包括:
★4个外部引脚:
----SPISOMI:SPI从动输出/主动输入引脚;
----SPISIMO:SPI从动输入/主动输出引脚;
----SPISTE:SPI从动发送使能引脚;
----SPICLK:SPI串行时钟引脚。
注意:在使用SPI模块时,这4个脚都可用作一般I/O引脚。
★两种工作方式:主动或从动工作方式。
★波特率:125种可编程的波特率,在CPU时间方式下,当频率为30MHz,波特率可达7.5Mb/s。
图7-1 串行外设接口结构框图
★数据字长:1~16个数据位。
★4种时钟方案(由时钟极性和时钟相位控制)包括:
----无延时的下降沿:串行外设接口在SPICLK信号下降沿发送数据信号上升沿接收数据。
----有延时的下降沿:串行外设接口在SPICLK信号下降沿之前的半个周期时发送数据,而在SPICLK信号下降沿接收数据。
----无延时的上升沿:串行外设接口在SPICLK信号上升沿发送数据,而在SPICLK 信号下降沿接收数据。
----有延时的上升沿:串行外设接口在SPICLK信号上升沿之前的半个周期时发送数据,而在SPICLK信号上升沿接收数据。
★同时接收和发送操作(发送功能可用软件禁止)。
★发送和接收操作可通过中断或查询方法来完成。
★9个SPI模块控制寄存器地址位于7040h~704Fh之间。
注意:在SPI模块中,有的摔制寄存器为8位,但是它又与l 6位的外设总线相连。
当访问这些寄存器时,寄存器的数据在低字节(0-7位),高字节(8-15位)读作0,对高字节的写操作无效。
串行外设接口结构框图如图7-1所示,图中给出的是DSP为从动方式下的结构。
7.2 串行外设接口操作
这里介绍串行外设接口的操作,其中包括:操作方式、中断、数据格式、时钟源和初始化,并给出典型数据传送的时序图。
7.2.1 操作介绍
图7.2表明用于通信的串行外设接口与两个控制器(主控制器和从控制器)之间的连接。
主控制器通过输出SPICLK信号来启动数据传送。
对于主控制器和从控制器,数据都是在SPICLK的一个边沿移出移位寄存器,并在相对的另一个边沿锁存到移位寄存器。
如果位CLOCK PHASE(SPICTL.3)为1,则在SPICLK跳变之前的半个周期时数据被发送和接收。
因此,两个控制器可同时发送和接收数据。
应用软件可决定数据的真伪。
发送数据的方法有以下3种可能:
★主控制器发送数据,从控制器发送伪数据;
★主控制器发送数据,从控制器发送数据;
★主控制器发送伪数据,从拧制器发送数据。
主控制器可在任一时刻启动数据发送,因为它控制着SPICLK信号。
但是软件决定了主控制器如何检测从控制器何时准备发送数据,以启动SPI传送数据。
7.2.2 串行外设接口模块的主动和从动方式
串行外设接口可工作于主动方式或从动方式。
用MASTER/SLA VE(SPICTL.2)位来选择工作方式和SPICLK信号的来源。
1、主动方式
在主动方式下(MASTER/SLA VE=1),串行外设接口在SPICLK引脚上提供整个串行通信网络的串行时钟。
数据从SPISIMO引脚输出,并在SPISIMO引脚输入。
SPI波特率设置寄存器(SPIBRR)决定着网络发送和接收的位传输率,SPI可选择126种不同的数据传输率。
写入到SPIDAT或SPITXBUF寄存器的数据启动了SPISIMO引脚上的数据发送,先发送最高位。
同时,接收到的数据通过SPISOMI引脚移入SPIDAT的最低位。
当选定数量的位发送完时,则整个数据发达完毕。
首先将接收到的数据传送到SPIRXBUF寄存器,并进行右对齐供CPU读取。
当指定数量的数据位已经通过SPIDAT移位后,则将发生下列事件:
SPIDAT中的内容传送到5PIRXDUF寄存器中;
SPI INT FLAG位置位;
如果SPITXBUF寄存器中还有有效的数据,或TXBUF FULL标志位为1,则这个数据将传送到SPIDAT寄存器中,否则将已接收到的数据移出SPIDAT寄存器后,SPICLK 时钟停止;
如果SIII INT ENA使能,则将产生中断。
在典型应用中,SPISTE引脚作为SPI从控制器的片选信号引脚(在接收主控制器的数据前把SPISTE引脚置低.在接收完主控制器的数据后把SPISTE引脚置高)。
2、从动方式
在从动方式下(MASTER/SLA VE=0),数据从SPISOMI引脚输出并且由SPISIMO 引脚输入。
SPICLK引脚作为串行移位时钟的输入,该时钟由SPI网络主控制器提供。
传输率由该时钟决定,SPICLK的输入频率应不超过器件系统时钟的1/4。
当网络主控制器的SPICLK信号为合适的边沿时,写入到SPIDAT或SPITXBUF寄存器中的数据被传送到网络。
当SPIDAT寄存器中的所有位被移出后,SPITXBUF中的数据将传送到SPIDAT寄存器中。
如果当前SPITXBUF寄存器中的数据没有往网络传送,则其数据立即传送到SPIDAT寄存器中。
为了接收数据,串行外设接口等待网络主控制器送出的SPICLK信号,然后再将SPISIMO引脚上的数据移入到SPIDAT寄存器。
如果从控制器同时也发送数据,则必须在SPICLK信号开始之前把数据写入到SPIRXBUF或SPIDAT寄存器中。
当TALK(SPICTL.1)位清0时,数据传送被禁止,从控制器输出引脚(SPISOMI)被置成高阻态。
在数据发送期间,TALK位清0,虽然SPISOMI引脚被强制置成高阻态,但当前正在发送的数据将完全发送完毕。
这就使得同—个SPI网络上有多个从器件,但是任一时刻只能有一个从器件起作用。
当SPISTE引脚用作从控制器片选引脚时,引脚SPISTE上的低有效信号使得从串行外设接口将数据传送到串行数据线。
而高无效信号则使得串行外设接口的串行移位寄存器终止,并且串行输出引脚被置成高阻态。
这使得同一网络上可以有多个从器件,但是同一时刻只能有一个从器件起作用。
7.2.3 串行外设接口中断
有五个控制位与串行外设接口中断相关:
.SPI中断使能位SPI INT ENA(SPICLT.0);
.SPI中断标志位SPI INT FLAG(SPISTS.6);
.SPI过冲中断使能位OVERRUN INT ENA(SPICLT.4);
.SPI过冲中断标志位RECE[VR OVHR只UN INl’FI。
A(;(SPIST
.SPI中断优先级选择位SPI PRIORITY(SPIPRI. 6)。
在SPI中断使能的情况下,当数据被移人或移出SPIDAT寄存器时,中断标志位被置位,并产生中断。
中断标志位保持置位,直到以下情况之一发生时才被清除:·中断被响应;
·CPU读取SPIRXBUF寄存器(注意读SPIRXEMU并不清除中断标志位);
·软件清除SPI SW RESET位;
·系统复位。
当SPI中断发生时,接收到的数据已存放在SPIRXBUF寄存器中并等待CPU读取.如果CPU在下一个字符已经接收完毕时,还没有读取SPIRXBUF寄存器中的数据,则新数据被写入到SPIRXBUF寄存器,覆盖旧数据,并且将旨位SPI过冲中断标志位。
7.2.4 数据格式
SPICCR.3~0这4位确定了数据的位数(1~16位),该信息指导状态控制逻辑计算接收和发送的位数,从而决定何时处理完一个数据,下列情况适用于少于16位的数据:·当数据写入到SPIDAT或SPITXBUF寄存器时必须左对齐;
·数据从SPIRXBUF寄存器读取出时必须右对齐;
·SPIRXBUF中存放最新接收到的数据位(右对齐),再加上那些已移位到左边的前次留下的位。
如果发送字符的长度为1,且SPIDAT当前值为737Bh,那么在主动方式下,将SPIDAT 和SPIRXBUF寄存器在数据发送前和发送后的数据格式表示如下。
注意:如果SPISOMI引脚上的电平为高,则X=1;如果SPISOMI引脚上的电平为低,则X=0。
7.2.5 串行外设接口波特率设置和时钟方式
串行外设接口支持125种不同的波特率和4种不同的时钟方式。
根据串行外设接口处于从动工作方式还是主动工作方式,引脚SPICLK是接收一个外部的SPI时钟信号还是由DSP提供SPI时钟信号。
·在从动工作方式中,DSP串行外设接口时钟由SPI外部的SPI时钟信号提供,并且该时钟信号的频率不能大于CPU时钟的四分之一。
·在主动工作方式中.串行外设接口时钟由DSP串行外设接口产生并由SPICLK引脚输出。
1、波特率的计算
·对于SPIBRR=3~127时:
SPI波特率=SYSCLK/(SPIBRR+1)
SPIBRR=(SYSCLK/SPI波特率)-l
·对于SPIBRR=0,1或2时
SPI波特率=SYSCLK/4
其中,SYSCLK为系统时钟频率;SPIBRR为主串行外设接口器件中的SPIBRR寄存器中的内容。
例7-1 已知系统时钟频率SYSCLK=24MHz,现要将SPI的波特率设置为3Mbps,试确定SPI波特率寄存器的值即SPIBRR。
根据上面计算SPIBRR的公式可知:
SPIBRR=24×106/(3×106)-1=8-1=7h
所以SPI波特率寄存器设置为SPIBRR=7h。
2、串行外设接口的时钟方式
时钟极性位CLOCK POLARITY(SPICCR.6)和时钟相位位CLOCK PHASE(SPICTL 3)控制着引脚SPICLK上的4种不同的时钟方式。
时钟极性位选择时钟有效沿为上升沿还是下降沿;时钟相位位则选择时钟的l/2周期延时。
四种不向的时钟方式如下:·无延时的下降沿:串行外设接口在SPICLK信号下降沿发送数据,而在SPICLK 信号上升沿接收数据;
·有延时的下降沿:串行外设接口在SPICLK信号下降沿之前的半个周期时发送数据,而在SPICLK信号下降沿接收数据;
·无延时的上升沿:串行外设接口在SPICLK信号上升沿发送数据,而在SPICLK 信号下降沿接收数据;
·有延时的上升沿:串行外设接口在SPICLK信号上升沿之前的半个周期时发送数据,而在SPICLK信号上升沿接收数据。
串行外设接口时钟方式选择如表7-1所列,这4种时钟方式与图7-3中的发送和接收是一一对应的。
表7-1 串行外设接口时钟方式选择
对于串行外设接口,仅当(SPIBRR+1)的结果为偶数时,才保持SPICLK的对称性。
当(SPIBRR+1)为奇数并且SPIBRR大于3时,SPICLK变成非对称。
当CLOCK POLARITY 位清0时,SPICLK的低脉冲比它的高脉冲长一个系统时钟;当CLOCK POLARITY位置1时,SPICLK的高脉冲比它的低脉冲长一个系统时钟。
图7-4为当(SPIBRR+1)为奇数,SPIBRR>3且CLOCK POLARITY=1时的SPICLK 引脚的输出特性。
7.2.6 串行外设接口的初始化
当系统复位时迫使SPI 外设模块进人下列缺省的配置:
·该单元被配置成从动模式(MASTER /SLA VE =0);
·禁止发送功能(TALK =0);
·在SPICLK 信号的下降沿输入数据被锁存;
·字符长度为1位;
·禁止串行外设接口中断;
·SPIDAT 寄存器中的数据被复位为0000h ;
·SPI 的4个引脚被配置成一般的I/O 功能。
为了改变串行外设接口在系统复位后的配置,应进行如下操作:
·将SPI SW RESET 位置清0,强制SPI 进入复位状态;
·初始化串行外设接口的配置、数据格式、波特率和所需引脚的功能;
·将SPI SW RESET 位置l ,使SPI 进入工作状态;
·写数据到SPIDAT 或SPITXBUF 寄存器中(这就启动了主动方式下的通信过程); ·在数据传送完成后,即SPISTS.6=1时,读取SPIRXBUF 寄存器中的数据。
7.2.7 数据传送示例
SPI 数据传送的时序图如图7.5所示,图中表明在使用对称的SPICLK
信号时,两个图7-3 串行外设接口时钟方式时序图
图7-4 串行外设接口SPICLK 引脚输出特性
SPI 器件之间进行5位字符的SPI 数据传送。
使用非对称的SPICLK 时序具有与图7.5类似的性质,但有一点除外:在低脉冲期间(CLOCK POLARITY=0)或高脉冲期间(CLOCK POLARITY =1),采用非对称SPICLK 的数据传送每一位时,要延长一个系统时钟周期。
图7.5给出的SPI 数据传送的时序图只适用于串行位流最大为8位的DSP 器件,对于具有串行位流最大为16位的F240x 系列不适用,但也可从图中了解到SPI 数据传送的基本情况。
注:
A 从控制器将0D0h 写入到SPIDAT ,并等待主控制器移出数据。
B 主控制器将从控制器的SPISTE 引脚的电平置低(有效)。
C 主控制器将058h 写入到SPIDAT 来启动传送过程。
D 第一个字节传送完成,设置中断标志。
E 从控制器从它的SPIRXBU
F 寄存器中读取数据。
F 从控制器将04Ch 写入到SPIDAT 中,并等待主控制器移出数据。
G 主控制器将06Ch 写入到SPIDAT 中来启动传送过程。
H 主控制器从SPIRXBUF 寄存器中读取01Ah 。
I 第二个字节传送完成,设置中断标志。
J 主、从控制器分别从相应的SPIRXBUF 寄存器中读取89h 和8Dh 。
在用户程序屏蔽掉了未使用的位之后,主、从控制器分别接收到09h 和0Dh 。
K 主控制器将从控制器的SPISTE 引脚的电平置高(无效)。
7.3 串行外设接口控制寄存器
串行外设接口总共有9个控制寄存器地址位于7040h 一704Fh 之间,如表7-2所列。
表7-2 串行外设接口控制寄存器列表
图7-5 SPI 数据传送时序图
1、串行外设接口配置控制寄存器(SPICCR)-----地址7040h
位7 SPI SW RESET。
SPI软件复位位。
用户在改变配置前,应把该位清0,并在恢复操作前把该位置1。
0 初始化串行外设接口操作标志位至复位条件;
1 串行外设接口准备发送成接收下一个字符。
位6 CLOCK POLARITY。
移位时钟极性位,该位控制SPICLK信号的极性。
具体见表7-1。
0 在SPICLK信号的上升沿输出数据,在下降沿输入数据。
当无数据发送时,
SPICLK保持低电乎
1在SPICLK信号的下降沿输出数据,在上升沿输入数据。
当无数据发送时,
SPICLK保持高电平
位5~4 保留位。
位3~0 SPI CHAR3~SPI CHAR0。
数据长度选择位,具体如表7-3。
表7-3 数据长度选择对应表
2、串行外设接口操作控制寄存器(SPICTL)-----地址7041h
位7~5 保留位。
位4 OVERRUN INT ENA。
过冲中断使能位。
0 禁止过冲中断;
l 使能过冲中断。
位3 CLOCK PHASE。
SPI时钟相位选择位,具体见表7-1。
0 正常的SPI时钟方式;
l 延迟半个周期的SPICLK信号。
位2 MASTER/SLA VE。
SPI主从工作方式选择位。
0 从工作方式;
l 主工作方式。
位1 TALK。
主/从工作方式下发送允许位。
0 禁止发送:
·在从工作方式下,如果以前没有被配置成一般的I/O功能,则引脚
SPISOMI将置成高阻态;
·在主工作方式下,若以前没有被配置成一般的I/O功能,则引脚
SPISIMO将置成高阻态。
l 允许发送。
位0 SPI INT ENA。
SPI中断使能位。
0 禁止中断;
l 使能中断。
3、串行外设接口状态寄存器(SPISTS)-----地址7042h
注:R=可读;C=清0;_0=复位值。
★RECEIVER OVERRUN PLAG接收过冲位和SPI INT FLAG 中断标志位共用同一个中断矢量。
★向5、6和7位写入0不会影响这些位的值。
位7 RECEIVER OVERRUN PLAG。
SPI接收过冲标志位,该位为只读只清除标志位。
在前一个数据从缓冲器中读出之前又完成了下一个数据的接收或发送操作,则
SPI硬件将设量该位。
该位表明最后一个接收到的数据已经被覆盖写入,并因此
而丢失。
如果OVERRUN INT ENA位已被置1,则该位每次置位时,SPI就发生
一次中断请求。
该位可由以下三种操作来清除:写1到该位;写0到SPI SW
RESET位;系统复位。
OVERRUN INT ENA位被置位,则SPI将在第一次RECEIVER OVERRUN PLAG
置位时产生一次中断请求。
如果在该标志位仍置位时又发生了接收过冲事件,则
SPI将不会再次申请中断请求。
这就使得在每次发生接收过冲事件后.必须向SPI SW RESET位写0来清除该标志位,使下一次发生接收过冲事件时,又能产生过
冲中断请求。
换句话说,如果RECEIVER OVERRUN PLAG标志位由中断服务
子程序保留设量(未被清除),则当中断服务子程序退出时,将不会立即产生另一
个过冲中断。
无论如何,在中断服务子程序期间应清除RECEIVER OVERRUN PLAG标志位。
因为RECEIVER OVERRUN PLAG标志位和SPI INT FLAG标志
位共用相同的中断向量。
在接收下一个数据时这将减少关于中断源的任何可能疑
问。
0 无中断请求;
1 中断请求。
位6 SPI INT FLAG。
SPI中断标志位s
0 无中断请求;
1 中断请求。
位5 TX BUF FULL FLAG。
SPI发送缓冲器满标志位。
当向SPITXBUF寄存器写入数据时,将置位该位。
当SPITXBUF寄存器中的数据移入到SPIDAT寄存器中
后,将自动清除该位。
0 发送缓冲器空;
1 发送缓冲器中有数据。
位4~0 保留位。
4、串行外设接口波特率设置寄存器(SPIBRR)-----地址7044h
位7 保留位。
位6~0 SPI BIT RATE6~ SPI BIT RATE0。
SPI波特率设置位,具体计算参见7.2.5小节。
5、串行外设接口仿真接收缓冲寄存器(SPIRXEMU)-----地址7046h
位15~0 ERXBl5~ERXB0。
仿真缓冲器接收的数据。
SPIRXEMU寄存器的功能与SPIRXBUF基本相同,只是读SPIRXEMU时,不会清除SPI INT FLAG标志
位。
一旦SPIDAT已经接收到完整的数据,该数据被传送到SPIRXEMU和
SPIRXBUF寄存器中,在这两个寄存器中的数据可被读取。
与此同时,SPI INT
FLAG标志位置位。
创建该镜像寄存器是为了支持仿真,读SPIRXBUF时,
将清除SPI INT FLAG标志位。
在仿真器的正常操作中,通常靠读取控制寄
存器来不断地更新显示在屏幕上的寄存器内容,对于SPI来说,是采用在访
真器读取SPIRXEMU中的值来更新其显示在屏幕上的内容。
SPIRXEMU寄
存器允许仿真器更准确地模拟SPI的真实操作,因此建议在正常的仿真器工
作方式下读取SPIRXEMU寄存器中的值。
6、串行外设接口接收缓冲寄存器(SPIRXBUF)-----地址7047h
位15~0 RXB15~RXB0。
接收到的数据。
一旦SPIDAT已经接收到完整的数据,该数据就被传送到SPIRXBUF寄存器,供CPU读取,同时SPI INT FLAG
标志位被置位。
因为数据首先被移位到SPI的最高有效位中,所以数据在
该寄存器中采用右对齐方式存储。
串行外设接口发送缓冲寄存器(SPITXBUF)。
该寄存器存储下一个要发送的数据,当写数据到该寄存器中时,置位TX BUF FULL标志位。
当正在发送的数据发送完毕时,该寄存器中的数据自动装入到SPIDAT寄存器中,并清除发送缓冲器满TX BUF FULL标志位。
如果当前发送没有被激活,则该奇作器中的数据将传达到SPIDAT寄存器中,且发送缓冲器满TX BUF FULL标志位不置位。
在主动工作方式下,如果当前发送没有被激活,则写入数据到该寄存器将启动发送,同时数据被传送别SPIDAT寄存器中。
7、串行外设接口发送缓冲寄存器(SPITXBUF)-----地址7048h
位15~0 TXB15~TXB0。
发送的数据。
8、串行外设接口发送/接收缓冲寄存器(SPIDAT)-----地址7049h
位15~0 SDATl5~SDAT0。
串行数据。
写入SPIDAT的操作可执行两种功能:如果TALK位被置位,则该寄存器提供了将被输出到串行输出引脚的数据。
当
SPI处于主动工作方式时,数据开始发送。
在主动工作方式下,将伪数据
写入到SPIDAT用以启动接收器的排序功能,因为硬件不支持少于16位
的数据进行对齐处理,所以发送的数据必须先进行左对齐,而接收的数据
则用右对齐格式读取。
串行外设接口发送/接收寄存器(SPIDAT),当SPIDAT寄存器中的数据在连续个SPICLK周期中被移出去(最高位)。
其移出的SPI的每一位(最高位)的同时,将有一位移人到移位寄存器的最低位。
9、串行外设接口中断优先级控制寄存器(SPIPRI)-----地址704Fh
位7 保留位。
位6 SPI PRIORITY。
SPI中断优先级选择位
0 高优先级中断请求;
1 低优先级中断请求。
位5~4 SPI SUSP SOFT,SPI SUSP FREE。
SPI仿真挂起时的操作控制位。
00 一旦仿真挂起,就立即停止;
10 一旦仿真挂起,就在当前的接收或发送完成后才停止;
01 SPI操作与仿真挂起无关;
11 SPI操作与仿真挂起无关。
位3~0 保留位。
串行外设中断优先级控制寄存器(SPIPRI)。
该寄存器用于选择SPI中断优先级的级别,可选择INTl级或INT5级中断。
并确定当仿真器挂起时的SPI操作。
7.4 串行外设接口应用举例1
下面的设计是SPI串行数模转换芯片MAX5741与TMS320LF2407的接口及应用。
由于SPI系统总线只需3~4位数据线和控制线,即可扩展具有SPI接口的各种器件,而并行总线扩展方法需8根数据线、8~16位地址线、l~2位控制线;又由于如今SPI器件种类多,有SPI语音芯片、LED驱动芯片、A/D转换芯片、D/A转换芯片和EEPROM芯片等,给设计带来了更多的选择。
因此在实时性要求不高的系统,使用SPI总线可以简化电路设计,省掉很多常规电路中的接口器件,提高设计的可靠性。
7.4.1 硬件电路的设计
1、MAX5741芯片功能
MAX5741是4路、10位、低功耗、电压缓冲输出的D/A转换器。
高达20MHz的时钟频率,3线串行接口兼容了SPI、QSPI、MICROWIRE和DSP的串行接口,可大大节省电路板空间,降低光电或变压器隔离应用的复杂程度。
宽达+2.7~+5.5V的电源电压范围,消耗229uA电源电流,适于低功耗和低电压应用。
DAC输出使用片上精密输出放大器满摆幅输出。
MAX5741基准输入电压范围为0~V DD。
MAX5741片上上电复位(POR)电路设定DAC输出为0,并以对地100k的电阻加载输出。
这为驱动电磁阀或变送器等在上电时提供了额外的安全性。
MAX5741具有软件控制的关断模式,将电源降低至0.1uA以下,提供软件可选的关断输出负载(1k、100k 或高阻抗),进一步减少系统的总功耗。
MAX5741满足汽车级温度范围(-40~+125℃),提供10引脚uMAX封装。
芯片的引脚分布如图7-6所示,各引脚的名称和功能如表7-4。
图7-6 MAX5741引脚示意图
2、MAX5741的SPI接口指令
MAX5741有两种工作模式:一是低功耗的睡眠模式(Power-Down Mode);另一是正常的3线串行工作模式。
它们分别有15条指令,具体指令如表7-5所列。
3、MAX5741的SPI 接口工作时序图
标准的SPI 是8位、16位或32位结构,MAX5741和F2407都是16位结构,所以两者能很好地配合。
DSP 提供了4种不同的时钟设计,可参见7.2.5小节中的“串行外设接口的时钟方式”部分。
MAX5741的工作时序如图7-7所示。
可以看出:当CS 为低电平时,串行数据才能被移入输入寄存器。
当CS 为低电平时,在每一个SCLK 的时钟上升沿,将DIN 的一位数据移入16位输入寄存器。
当16位数据全被移入串行输入寄存器之后,输入寄存器的内容被锁入DAC 锁存器。
在写下一组数据之前,CS 必须维持高电平至少80ns 。
注:X 为不关心的值。
4、MAX5741与DSP 的SPI 接口电路
MAX5741兼容了SPI 、QSPI 、MICROWIRE 和DSP 的串行接口。
而F2407 DSP 器件的SPI 是一个高速、同步串行I/O 口,它允许长度可编程的串行数据流(1~16位)以可编程的位传输速度移入或者移出器件。
利用F2407的SPI (I/O )口与MAX5741构成的DAC 电路,如图7-8所示。
在图中,F2407的SPISIMO 脚接到了MAX5741的DIN 。
这是F2407的SPI 从动输入/主动输出引脚。
MAX5741作为从机,即MAX5741只接收来自主机的数据,然后进行D/A 转换,从OUT 引脚输出模拟电压信号。
图7-7 MAX5741的SPI 时序图 SCLK
CS
DIN
F2407
图7-8 F2407与MAX5741接口电路
7.4.2 软件设计
1、SPI总线波特率的设置
不同SPI器件的最高频率不同,为了使SPI总线高效工作,应了解各个SPI器件最高能接受的频率,再取较低频率的SPI器件的最高频率作为通信波特率。
在此DSP的主频为24MHz,它作为SPI的主机时,SPI总线频率可达到1/4主频(即6MHz);作为SPI 从机时,其频率也可达到1/4主频(即6MHz)。
MAX5741的SPI通信频率可达到20MHz。
由于DSP只作为SPI的主机,因此本设计中SPI总线的最高频率为6MHz。
2、MAX5741与DSP的SPI软件实现
本实例选用的是16位数据模式,编程时最主要应注意时序以及编写一个数据的输入子程序。
利用F2407的SPI模块向MAX5741芯片发送数据用于D/A转换。
下面是在MAX5741的OUTA端输出一个三角波来说明SPI总线的软件编程。
由于MAX5741为SCLK的上升沿时接收SPI线上的数据,因此DSP用无延时的下降沿(或有延时的下降沿)时钟方式来发送SPI数据,这样才能配合MAX5741的SPI时序。
采用软件查询的方式来发送数据。
(1)汇编源程序
;用户寄存器定义
SPI_DATA .usect ".data0",1 ;临时数据寄存器
SPI_FLAG .usect ".data0",1 ;SPI 标志位
SPI_CON .usect ".data0",1 ;MAX5741的控制字
DP_USER .set 5 ;用户寄存器存放页指针
;MAX5121 的控制字宏定义
DACOUT .set 0000H ;0
UPINREG .set 07FEH ;
UPDACREG .set 0FFCH ;1
;(1)主程序
.include "F2407REGS.H"
.def _c_int0
.text
_c_int0
CALL SYSINIT ;调系统初始化程序
CALL SPI_INIT ;调SPI初始化程序
LOOP: CALL SPI_SEND ;调输出三角波程序
NOP
WAIT: LDP #DP_USER
SPLK #00H, SPI_FLAG ;清标志
SPLK #00H, SPI_DATA ;重置初值
B LOOP
;(2)系统初始化程序
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH,SCSR1 ;四倍频CLKIN=6M,CLKOUT=24M
SPLK #0E8h,WDCR ;关看门狗
LDP #0
SPLK #0001h,IMR ;使能中断1
SPLK #0FFFFh,IFR ;清中断标志
RET
;(3)SPI初始化程序
SPI_INIT:
LDP #DP_PF2
LACL MCRB
OR #00014H ;配置SPISIMO和SPICLK引脚为特殊功能方式SACL MCRB
LACL MCRB
AND #0FFF7H ;配置IOPC3为一般的I/O口功能
SACL MCRC ;CS=IOPC3
LDP #DP_PF1
SPLK #004FH,SPICCR ;配置SPI寄存器允许初始化,16位数据输出
SPLK #0006H,SPICTL ;主机方式,时钟方式为无延时的下降沿
SPLK #0002H,SPIBRR ;SPI波特率为6MHZ
SPLK #00CFh,SPICCR ;初始化结束,并关闭初始化使能位
LDP #DP_USER
SPLK #00H,SPI_DATA ;置发送数据初值
SPLK #00H,SPI_FLAG ;SPI_FLAG=00H,执行三角波上升
;SPI_FLAG=01H,执行三角波下降
SPLK #DACOUT,SPI_CON ;送MAX5741的控制字
RET
;(4)输出三角波程序
SPI_SEND:
SPI_TX: LDP #DP_PF2
LACL PCDATDIR
OR #0800H ;IOPC3 脚为输出方式
AND #0FFF7H ;CS= IOPC3=0
SACL PCDATDIR
NOP
NOP
LDP #DP_USER
LACC SPI_DATA
AND #01FFEH ;;S0=0
OR SPI_CON
SACL SPI_DATA ;规格化发送的数据
LDP #DP_PF1
SACL SPITXBUF ;数据写入到SPI发送缓冲区
XMIT_RDY: BIT SPISTS,BIT6 ;等待数据
BCND XMIT_RDY,NTC ;发送完
NOP
NOP
NOP
LDP #DP_PF2
LACL PCDATDIR
OR #0808H ;CS=IOPC3=1
SACL PCDATDIR ;锁存数据
LDP #DP_USER
BIT SPI_FLAG,BIT0
BCND SPI_FALL,TC
LDP #DP_USER ;三角波上升段程序
LACC SPI_DATA
AND #01FFEH
ADD #04H ;递增
SACL SPI_DATA
SUB #01FFEH
BCND SPI_FALL,EQ
B SPI_TX
SPI_FALL: LDP #DP_USER ;三角波下降段程序
SPLK #01, SPI_FLAG
LACC SPI_DATA
AND #01FFEH
SUB #04H ;递减
SACL SPI_DATA
BCND SPI_RET,EQ
B SPI_TX
SPI_RET: RET
(2)C语言源程序
// 该程序利用LF2407的SPI模块向MAX5741芯片发送数据用于D/A转换
// MAX5741的模拟输出端A输出一个三角波
#include "register.h"
int GPR3;
int flag1;
int flag;
//系统初始化子程序
void initial()
{
asm(" setc INTM"); //屏蔽中断
WSGR=0x00; //禁止所有的等待状态
asm(" CLRC SXM");
asm(" CLRC OVM");
asm(" CLRC CNF"); //B0被配置为数据空间
SCSR1=0x81FE; //CLKIN=6M,CLKOUT=24M ,并且使能到SPI模块的时钟。