返回介绍

实验七 串行外围接口 SPI 的应用

发布于 2023-05-14 20:35:30 字数 8666 浏览 0 评论 0 收藏 0

一.实验说明

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文