- 前言
- 实验须知
- 概述
- 实验一 TMS320LF2407 DSP 实验开发系统及CC软件应用
- 实验二 常用指令操作实验
- 实验三 追灯式电路控制
- 实验四 按键计数器
- 实验五 键盘和 LED 发光二极管显示电路
- 实验六 模/数转换器 ADC 应用
- 实验七 串行外围接口 SPI 的应用
- 实验八 串行通信接口模块(SCI)
- 实验九 TMS320LF2407 与图形液晶显示模块接口及应用
- 实验十 I2C 串行日历时钟与 TMS320LF2407 的接口应用
- 附录一 DSP 器件仿真开发技术基础
- 附录二 TMS320LF2407 DSP 实验开发系统
- 附录三 TMS320LF2407 DSP 器件简介
- 附录四 XDS510 仿真开发系统的基本操作技术
- 附录五 程序开发平台 Code Composer
- 参考文献
实验八 串行通信接口模块(SCI)
一.实验说明
计算机与外界所进行的信息交换经常被人们称为数据通信(简称通信)。通信的基本方式又可分为并行通信和串行通信两种。串行通信的实现,在制式、种类、形式、规范、标准、编码、检错、纠错、帧结构、组网方式、调制方式、主要用途等许多方面,存在着多种类型、变化、选择和解决方案,其中之一有美国电子工业协会推荐标准RS-232,它是用来实现与串行通信功能相关的技术和规范。
RS-232接口采用25针的链接器DB-25或9针链接器DB-9,其每一条插针的信号功能都是标准的,对于各种信号的电平规定也是标准的,因而便于各种数字设备之间的兼容和互相链接。其基本的信号定义如表8.1所列。
表8.1 RS-232接口的信号定义
DB-25脚位
DB-9脚位
信号名称
方向
含义
2
3
4
5
6
7
8
20
22
1
3
2
7
8
6
5
1
4
9
-
TXD
RXD
RTS
CTS
DSR
SG
DCD
DTR
RI
-
输出
输入
输出
输入
输入
-
输入
输出
输入
-
数据发送端
数据接收端
请求发送(计算机要求发送数据)
清除发送(MODEM准备接收数据)
数据设备准备就绪
信号地
数据载波检测
数据终端准备就绪(计算机)
响铃指示
保护地
大多数的电脑设备都具有RS-232接口,尽管它的性能指标并非很好,但其在广泛的市场支持下依然常胜不衰。就使用而言,RS-232也确实有其优势:仅需3根线(TXD、RXD和SG)便可在两个数字设备之间全双工的传送数据。
TMS320LF2407内部集成SCI模块。SCI模块采用的是一种在标准规范基础上简化了的、无握手信号的、二线式的串行通信方式,使得占用芯片引脚资源的数量降低到最低限度。
TMS320LF2407的SCI具有异步和同步通信能力,其异步通信能力主要用于与其它计算机系统或DSP系统进行远程通信,而同步通信能力则主要用于本DSP电路系统之内的片外器件串行扩展。
SCI可以定义三种工作方式:全双工异步方式、半双工同步主控方式和半双工同步从动方式。在DSP应用项目的开发过程中,如何利用更少的DSP引脚实现更多信息吞吐?如何利用更简练的电路和更廉价的器件实现更丰富功能?始终是我们孜孜以求的努力目标。为此,本实验利用PC机的超级终端程序,经过异步串行通讯端口COM与TMS320LF2407芯片的串行通信模块接口,进行双向异步通信的实验。本例的应用方案将会对同学们有一定的启发和实用价值。
二.实验目的
1. 了解DSP与PC机之间串行异步通信接口的应用。
2. 了解串行通信的设置,以便正确实现与PC机(上位机)的通信。
3. 通过实验了解串行数据的接收及传送。
三.实验内容
1. 理解硬件电路和RS-232标准。
2. 令SCI模块工作于异步接收/发送两种状态。
3. 将通信波特率设定在9600波特、8位数据、1位停止位、不设奇偶校验位。
4.
四.实验硬件电路
五.实验参考程序清单
C语言程序
#include "register.h"
int x,y,k=0;
static int receive[4],j=0;
//const int var[4]={0x12,0x23,0x34,0x45};
int var[4]={0x12,0x23,0x34,0x45};
void inline disable()
{
asm(" setc INTM");
asm(" setc SXM");
}
void inline enable()
{
asm(" clrc INTM");
}
main()
{
disable();
*IFR=0xFFFF;
*SCSR1=0x81FE;
*WDCR=0xE8;
*SCICCR=0x7;
*SCICTL1=0x13;
*SCICTL2=0x3;
*SCIHBAUD=0x1 ;
*SCILBAUD=0x38;
*SCICTL1=0x33;
*SCIPRI=0x60;
*MCRA=0x3;
*PADATDIR=0x100;
*IMR=0x10;
enable();
*SCITXBUF=0x55;
while(1)
;
}
void UartSent()
{
static int i=0,m;
if(i>3)
return;
*SCITXBUF=var[i++];
*IFR=0x0010;
enable();
}
void UartRec()
{
receive[j++]=*SCIRXBUF;
if(j>9)
j=0;
*IFR=0x0010;
enable();
}
void interrupt uarttr()
{
switch(*PVIR)
{
case 6:UartRec();
case 7:UartSent();
}
}
void interrupt nothing()
{
return;
}
汇编程序
SCI_FLAG .usect ".data0",1 ;SCI标志寄存器
TXD_PTR .usect ".data0",8 ;发送的数据存放区
RXD_PTR .usect ".data0",8 ;接收到的数据存放区
N .set 8
.include "F2407REGS.H" ;引用头部文件
.def _c_int0
;(1)建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 复位向量 1
INT1 B GISR1 ;PM 2 中断优先级1 4
INT2 B PHANTOM ;PM 4 中断优先级2 5
INT3 B PHANTOM ;PM 6 中断优先级3 6
INT4 B PHANTOM ;PM 8 中断优先级4 7
INT5 B PHANTOM ;PM A 中断优先级5 8
INT6 B PHANTOM ;PM C 中断优先级6 9
RESERVED B PHANTOM ;PM E (保留位) 10
SW_INT8 B PHANTOM ;PM 10 用户定义软件中断 —
SW_INT9 B PHANTOM ; PM 12 User S/W int -
SW_INT10 B PHANTOM ; PM 14 User S/W int -
SW_INT11 B PHANTOM ; PM 16 User S/W int -
SW_INT12 B PHANTOM ; PM 18 User S/W int -
SW_INT13 B PHANTOM ; PM 1A User S/W int -
SW_INT14 B PHANTOM ; PM 1C User S/W int -
SW_INT15 B PHANTOM ; PM 1E User S/W int -
SW_INT16 B PHANTOM ; PM 20 User S/W int -
TRAP B PHANTOM ; PM 22 Trap vector -
NMI B PHANTOM ; PM 24 Non maskable Int3
EMU_TRAP B PHANTOM ; PM 26 Emulator Trap 2
SW_INT20 B PHANTOM ; PM 28 User S/W int -
SW_INT21 B PHANTOM ; PM 2A User S/W int -
SW_INT22 B PHANTOM ; PM 2C User S/W int -
SW_INT23 B PHANTOM ; PM 2E User S/W int -
SW_INT24 B PHANTOM ; PM 30 User S/W int -
SW_INT25 B PHANTOM ; PM 32 User S/W int -
SW_INT26 B PHANTOM ; PM 34 User S/W int -
SW_INT27 B PHANTOM ; PM 36 User S/W int -
SW_INT28 B PHANTOM ; PM 38 User S/W int -
SW_INT29 B PHANTOM ; PM 3A User S/W int -
SW_INT30 B PHANTOM ; PM 3C User S/W int -
SW_INT31 B PHANTOM ;PM 3E 用户定义软件中断 —
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量0000h
B PHANTOM ;保留向量地址偏移量0001h
B PHANTOM ;保留向量地址偏移量0002h
B PHANTOM ;保留向量地址偏移量0003h
B PHANTOM ;保留向量地址偏移量0004h ADC中断
B PHANTOM ;保留向量地址偏移量0005h
B SCI_RX_ISR ;保留向量地址偏移量0006h SCI接收中断
B PHANTOM ;保留向量地址偏移量0007h
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-0a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-10
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-15
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-1a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-20
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-25
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-0027 T1PINT
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-2a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 向量地址偏移量0x02f - T3PINT
B PHANTOM ; 保留向量地址偏移量-30
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-35
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-3a
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量
B PHANTOM ; 保留向量地址偏移量-3f
B PHANTOM ;CANMBX_ISR; 保留向量地址偏移量
B PHANTOM ;保留向量地址偏移量0041h
;(2)主程序:
.text
_c_int0
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH,SCSR1 ;CLKIN=6 M,CLKOUT=24 M
SPLK #0E8h,WDCR ;关看门狗
CALL SCI_INIT ;调串口初始化程序
LDP #5H
SPLK #00H,SCI_FLAG ;清发送软件标志位
TXD_LOOP:
LDP #5H
BIT SCI_FLAG,BIT0
BCND TXD_DATA,TC ; SCI_FLAG.0=1则发送数据
B WAIT
TXD_DATA: ;发送N个数据程序
MAR *,AR0
LAR AR0,#TXD_PTR
ADRK #N+1 ;发送N个数据
MAR *,AR4
LACC *+ ;读数据
CMPR 00
BCND TXD_DATA_END,TC ;判数据发送完?
MAR *,AR2
SACL *,AR4 ;数据送SCITXBUF寄存器
XMIT_RDY:
LDP #DP_PF1
BIT SCICTL2,BIT7
BCND XMIT_RDY,NTC ;判发送器是否空?
B TXD_DATA
TXD_DATA_END:
MAR *, AR4
LAR AR4,#TXD_PTR ;恢复发送的数据指针
LDP #5H
SPLK #00H,SCI_FLAG ;清发送软件标志位
WAIT: NOP
B TXD_LOOP
;(3)串行通信初始化程序:
SCI_INIT:
LDP #0E1H
LACL MCRA
OR #03H
SACL MCRA ;配置串行口引脚为特殊功能:TXD、RXD
LDP #DP_PF1
SPLK #000FH,SCICCR ;地址位唤醒模式,8位数据,
;1位停止位,无奇偶校验
SPLK #0007H,SCICTL1 ;接收、发送、内部时钟使能 ,SLEEP=1
SPLK #0002H,SCICTL2 ;接收中断使能
SPLK #0001H,SCIHBAUD
SPLK #0038H,SCILBAUD ;波特率为9600
SPLK #0027H,SCICTL1 ;串口初始化完成
SPLK #00H,SCIPRI
LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址
LAR AR2,#SCITXBUF ;发送缓冲寄存器地址
LAR AR3,#RXD_PTR ;接收的数据指针
LAR AR4,#TXD_PTR ;发送的数据指针
LDP #0
SPLK #0001h,IMR ;允许INT1中断
SPLK #0FFFFh,IFR ;清所有中断标志
CLRC INTM ;开总中断
RET
;(4)中断程序
GISR1: ;优先级INT1中断人口
; 保护现场
LDP #0 ; 保存机器上下文
SST #0, st0_temp ; 使用自动寻址DP-0
SST #1, st1_temp ; 保存状态寄存器到 B2 DARAM.
SACL context ; 保存ACC的低16位
SACH context+1 ; 保存ACC的高16位
SAR AR1,context+2
SAR AR2,context+3
SAR AR3,context+4
SAR AR4,context+5
SAR AR5,context+6
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断人口地址
BACC ;跳到相应的中断服务子程序
SCI_RX_ISR: ;接收中断服务程序
LDP #DP_PF1
MAR *,AR1
BIT SCICTL1,BIT2
BCND RXD_DATA,NTC ;SLEEP=0,接收数据
LACC * ;读入地址
SUB #0AAH
BCND TXD_FLAG,EQ ;接收到的地址为AAH,则发送数据
SUB #0001H
BCND SCI_RX_END,NEQ ;地址错误,退出中断
SPLK #0033H,SCICTL1 ;地址为ABH,则清SLEEP=0
;表示准备接收数据
B SCI_RX_END
TXD_FLAG: ;置发送标志
LDP #5H
SPLK #01H,SCI_FLAG
B SCI_RX_END
RXD_DATA: ;接收N个数据
LACC *,AR3 ;读入数据
SACL *+,AR0 ;保存数据
LAR AR0,#RXD_PTR
ADRK #N
MAR *,AR3
CMPR 00
BCND SCI_RX_END,NTC ;判是否接收完
LAR AR3,#RXD_PTR ;恢复接收的数据指针 #RX_PTR
SPLK #0037H,SCICTL1 ;置SLEEP=1表示准备接收地址
SCI_RX_END: ; 中断返回
;恢复现场
LDP #DP_EVA
SPLK #0FFFFH,EVAIFRA
LDP #0
LAR AR5,context+6
LAR AR4,context+5
LAR AR3,context+4
LAR AR2,context+3
LAR AR1,context+2
LACC context+1,16
ADDS context
LST #1, st1_temp
LST #0, st0_temp
CLRC INTM ;开总中断,因为一进中断就
;自动关闭总中断
RET
;(5)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论