- 前言
- 实验须知
- 概述
- 实验一 TMS320LF2407 DSP 实验开发系统及CC软件应用
- 实验二 常用指令操作实验
- 实验三 追灯式电路控制
- 实验四 按键计数器
- 实验五 键盘和 LED 发光二极管显示电路
- 实验六 模/数转换器 ADC 应用
- 实验七 串行外围接口 SPI 的应用
- 实验八 串行通信接口模块(SCI)
- 实验九 TMS320LF2407 与图形液晶显示模块接口及应用
- 实验十 I2C 串行日历时钟与 TMS320LF2407 的接口应用
- 附录一 DSP 器件仿真开发技术基础
- 附录二 TMS320LF2407 DSP 实验开发系统
- 附录三 TMS320LF2407 DSP 器件简介
- 附录四 XDS510 仿真开发系统的基本操作技术
- 附录五 程序开发平台 Code Composer
- 参考文献
实验七 串行外围接口 SPI 的应用
一.实验说明
SPI是由美国摩托罗拉公司最先推出的一种同步串行传输规范,DSP外设芯片具有串行扩展接口SPI。SPI接口主要用来和带串行接口的外围器件进行通讯的一种串行标准接口。由于具备SPI接口的外围器件,具有引脚少、封装简便、造价低廉等突出优点,在各种应用上得到了迅速而广泛的普及。
SPI接口可以同时发送和接收8位数据,它共使用了4条引脚:
•SPI从器件输入/主器件输出引脚(简称SPISIMO):作用是在一个方向上传送数据:先送高位(MSB),后送低位(LSB)。
•SPI从器件输出/主器件输入引脚(简称SPISOMI):作用也是在一个方向上传送数据:先送高位,后送低位。如果从器件没有被选中,则主器件的SOMI线处于高阻状态。
•SPI串行时钟引脚(简称SPICLK): 用于主、从器件之间在MISO和MOSI线上传送数据时进行同步。在主器件中作为输出线,在从器件中作为输入线。在8个时钟周期之内,主、从器件之间完成一个字节信息的交换。SPISCK定时信号由主器件负责产生和输出。
•SPI从器件发送使能引脚(简称SPISTE):对于工作于从器件模式的芯片,SPISTE输入线用作选通信号输入端,该引脚必须在传送数据之前被设置为低电平,并且在整个数据传送过程中维持为稳定的低电平;对于工作于主器件模式的芯片,SPISTE输入线必须接高电平。
在DSP片内现有的硬件资源如果不能满足应用中产品需求时,可以利用同步串行接口来扩展各种通用外设芯片。本实验选用带SPI接口的DAC芯片MAX5121,用于目标系统的扩展,其应用原理:由TMS320LF2407送出的数字数据经过串行输出接口SPI将数值信号锁存在DAC控制芯片上,再经过DAC做数字到模拟信号的转换,最后输出设计所要求的正弦波、三角波等各种波形信号。
二.实验目的
1.展示SPI接口同时完成向对方发送一个字节数据和从对方接收一个字节数据两项任务的功能。
2.提供一种与带串行接口的外围器件接口方法,为其它方便、有效的DSP应用系统扩展方法打下基础。
三.实验内容
1. 使用MAX5121芯片功能产生模拟信号并设计调试相应的软件。
2. 将数字信号经DAC芯片转换的正弦波、三角波等波形输出用示波器观察、分析。
四.实验硬件电路
表7.1 MAX5121的SPI接口指令集
16位串行字
功能说明
C2
C1
C0
D11……D0
S0
0
0
0
XXXXXXXXXXXX
0
空操作
0
0
1
12位DAC数据
0
移入输入寄存器,DAC寄存器不变并关闭DAC
0
1
0
12位DAC数据
0
同时移入输入和DAC寄存器并关闭DAC
0
1
1
XXXXXXXXXXXX
0
把输入寄存器的值移入到DAC寄存器
1
0
1
XXXXXXXXXXXX
0
关闭DAC条件是PDL=1)
1
0
0
XXXXXXXXXXXX
0
UPO引脚上输出低电平
1
1
0
XXXXXXXXXXXX
0
UPO引脚上输出高电平
1
1
1
1XXXXXXXXXXX
0
方式1:DOUT在SCLK的上升沿发送数据
1
1
1
00XXXXXXXXXX
0
方式0:DOUT在SCLK的下降沿发送数据(缺省)
MAX5121的SPI接口指令有9条,采用16位操作码,其操作码由3位控制位、12位数据及1位子位组成。其指令集如表7.1所示。
五.实验参考程序清单
C语言程序
#include "register.h"
int GPR3;
int flag1;
int flag;
int initial()
{
asm(" setc INTM");
WSGR=0x00;
asm(" clrc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
*SCSR1=0x81FE;
*WDCR=0x0E8;
}
int SPIINITIAL()
{
*SPICCR=0x004F;
*SPICTL=0x0006;
*SPIBRR=0x0007;
*MCRB=0x003C;
*MCRC=*MCRC&0x0FFFE;
*SPICCR=*SPICCR|0x0080;
}
int SPITRANS()
{
*PEDATDIR=(*PEDATDIR|0x0100)&0x0FFFE;
*SPITXBUF=GPR3;
while(1)
{
flag=*SPISTS&0x40;
if(flag==0x40)
break;
}
*SPIRXBUF=*SPIRXBUF;
*PEDATDIR=*PEDATDIR|0x01;
}
main()
{
initial();
SPIINITIAL();
GPR3=0x4000;
flag1=0x00;
while(1)
{
if(flag1==0x00)
GPR3=GPR3+2;
else
GPR3=GPR3-2;
if(GPR3==0x5FFE)
flag1=0x01;
if(GPR3==0x4000)
flag1=0x00;
SPITRANS();
}
}
void interrupt nothing()
{
return;
}
汇编程序
;用户寄存器定义
SPI_DATA .usect ".data0",1 ;临时数据寄存器
SPI_FLAG .usect ".data0",1 ;SPI 标志位
SPI_CON .usect ".data0",1 ;MAX5121的控制字
DP_USER .set 5 ;用户寄存器存放页指针
;MAX5121 的控制字宏定义
DACOUT .set 4000h ;C2C1C0=010
UPINREG .set 2000h ;C2C1C0=001
UPDACREG .set 6000h ;C2C1C0=011
SHUTDAC .set 0A00h ;C2C1C0=101
;(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 ;4倍频CLKIN=6 M,CLKOUT=24 M
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 MCRC
AND #0FFFEH ;配置IOPE0为一般的I/O口功能
SACL MCRC ;CS=IOPE0
LDP #DP_PF1
SPLK #004FH,SPICCR ;配置SPI寄存器允许初始化,16位数据输出
SPLK #0006H,SPICTL ;主机方式,时钟方式为无延时的下降沿
SPLK #0002H,SPIBRR ;SPI波特率为6 MHz
SPLK #00CFh,SPICCR ;初始化结束,并关闭初始化使能位
LDP #DP_USER
SPLK #00H,SPI_DATA ;置发送数据初值
SPLK #00H,SPI_FLAG ;SPI_FLAG=0000H,执行三角波上
;SPI_FLAG=0001H,执行三角波下降
SPLK #DACOUT,SPI_CON;送MAX5121的控制字
RET
;(4) 输出三角波程序
SPI_SEND:
SPI_TX: LDP #DP_PF2
LACL PEDATDIR
OR #0100H ;IOPE0 脚为输出方式
AND #0FFFEH ;CS= IOPE0=0
SACL PEDATDIR
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 PEDATDIR
OR #0101H ;CS=IOPE0=1
SACL PEDATDIR ;锁存数据
LDP #DP_USER
BIT SPI_FLAG,BIT0
BCND SPI_FALL,TC
LDP #DP_USER ;三角波上升段程序
LACC SPI_DATA
AND #01FFEH
ADD #02H ;递增
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 #02H ;递减
SACL SPI_DATA
BCND SPI_RET,EQ
B SPI_TX
SPI_RET: RET
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论