返回介绍

实验八 串行通信接口模块(SCI)

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

一.实验说明

计算机与外界所进行的信息交换经常被人们称为数据通信(简称通信)。通信的基本方式又可分为并行通信和串行通信两种。串行通信的实现,在制式、种类、形式、规范、标准、编码、检错、纠错、帧结构、组网方式、调制方式、主要用途等许多方面,存在着多种类型、变化、选择和解决方案,其中之一有美国电子工业协会推荐标准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.

将PC机发送的数据返回到PC机。

四.实验硬件电路

五.实验参考程序清单

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

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

发布评论

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