dsp实验报告 哈工大 实验二 异步串口通信实验

更新时间:2023-06-11 08:44:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

dsp实验报告 哈工大

实验二 异步串口通信实验

一. 实验目的

1. 了解 TMS320LF2407A DSP 片内串行通信接口(SCI)的特点。

2. 学会设置 SCI 接口进行通信。

3. 了解 ICETEK-LF2407-A 板上对 SCI 接口的驱动部分设计。

4. 学习设计异步通信程序。

二. 实验设备

计算机,ICETEK-LF2407-EDU 实验箱(或 ICETEK 仿真器+ICETEK-LF2407-A 系统板+相关连线及电源)。

三. 实验原理

1. TMS320LF2407A DSP 串行通信接口模块

TMS320LF240x 器件包括串行通信接口 SCI 模块。SCI 模块支持 CPU 与其他使用标准格式的异步外设之间的数字通信。SCI 接收器和发送器是双缓冲的,每一个都有它自己单独的使能和中断标志位。两者都可以独立工作,或者在全双工的方式下同时工作。

2. ICETEK-LF2407-A 板异步串口设计

由于 DSP 内部包含了异步串行通信控制模块,所以在板上只需加上驱动电路部分即可。驱动电路主要完成将 SCI 输出的 0-3.3V 电平转换成异步串口电平的工作。转换电平的工作由 MAX232 芯片完成,但由于它是 5V 器件所以它同 DSP 间的信号线必须有电平转换,此板采用的是 74LS245。

3. 串行通信接口设置

CPU 进行串行通信时可以采用两种方式,一种是轮询方式,即 CPU 不断查询串口状态进行接收和发送,缺点是占用 CPU 时间太多;另一种是中断方式,SCI 的接收和发送都可以产生中断信号,这样 CPU 可以在完成其他一些工作的同时进行串行通信。

串行通信接口波特率计算,内部生成的串行时钟由系统时钟 SYSCLK 频率和波特率选择寄存器决定。串行通信接口使用 16 位波特率选择寄存器,数据传输的速度可以被编程为 65000 多种不同的方式。

不同通信模式下的串行通信接口异步波特率由下列方法决定:

BRR=1—65535 时的串行通信接口异步波特率:

SCI 异步波特率=SYSCLK/ [( BRR+1)*8]

其中,BRR=SYSCLK/(SCI 异步波特率*8)-1;

BRR=0 时的串行通信接口异步波特率:

SCI 异步波特率=SYSCLK/16

这里 BRR 等于波特率选择寄存器的 16 位值。

dsp实验报告 哈工大

四. 实验程序

/* 2407A 板:将 JP11 和 JP14 短接到 2-3;

使用直连的串口通信电缆;

启动串口调试助手.exe;

PC 机发送一个"."为结束标志*/

程序见附页。

五. 实验步骤

1. 实验准备

⑴.连接设备

关闭计算机和实验箱电源;

检查 ICETEK-LF2407-A 板上 JP6 的位置,应连接在 1-2 位置(靠近DSP 芯片端),即设置 DSP 工作在 MP 方式;

关闭实验箱上三个开关;如使用PP型仿真器则用附带的并口连线连接计算机并口和仿真器相应接口;

用附带的串行通信电缆连接计算机COM端口和ICETEK-LF2407-A板上P6 九针接头。

⑵.开启设备

打开计算机电源;

打开实验箱电源开关,打开 ICETEK-LF2407-A 板上电源开关,注意板上指示灯 DS1 灭、DS2 和 DS3 亮;

如使用 USB 型仿真器用附带的 USB 电缆连接计算机和仿真器相应接口,注意仿真器上两个指示灯均亮。

⑶.设置 Code Composer Studio 为 Emulator 方式。

⑷.启动 Code Composer Studio

2. 打开工程,浏览程序,工程目录为 D:\2407EDULab\Lab20-SCI

3. 编译并下载程序

4. 运行“串口调试助手”

利用桌面上“我的电脑”,找到 D:\2407EDULab\Lab20-SCI 目录中的程序“串口调试助手 V2.0B.exe”,双击它启动;设置“串口调试助手”的串行端口为实际连接的计算机 COM 端口,设置波特率为 9600,设置传输方式为 8 位、无校验、1 个停止位。

5. 运行程序观察结果

运行程序后,切换窗口到“串口调试助手”;在“串口调试助手”的接收窗口中可看到 DSP通过 SCI 发送来的“Hello PC!,Over|”字样;在“发送的字符/数据”栏中输入一些要发送到 DSP 的字符串,以“.”字符结尾;然后单击“手动发送”按钮;DSP 在接收到 PC 机的信息后会自动进行回答。

dsp实验报告 哈工大

6. 结束程序运行退出。

六. 实验结果

通过 DSP 传送到 PC 机上的信息,可以看出:SCI 正确工作。 当第一打开时候,串口收到“hello pc!over”,通过串口手动发送一段字母之后,会被返送回来。

七. 问题与思考

请考虑用中断方式设计程序完成异步串行通信。

修改的程序见附页。

dsp实验报告 哈工大

未修改的程序(查询方式):

#include "2407c.h"

void wait(int nWait);

char cString[17]={"Hello PC!, Over|" }, cReceive, cBuffer[17], cAnswer[16] = {"Oh, you say"}; int bReceive,nLen;

main()

{

unsigned int uWork;

int i,k;

bReceive=0;

asm(" setc INTM");

asm(" clrc SXM");

asm(" clrc OVM");

*WDCR=0x6f;

*WDKEY=0x5555;

*WDKEY=0xaaaa; /*关闭看门狗中断*/

*SCSR1=0x81fe; /* 打开所有外设,设置时钟频率为 40MHz */

uWork=(*MCRA);

uWork|=0x03; /* use SCITXD,SCIRXD */

(*MCRA)=uWork;

(*SCICCR)=0x07; /* 8 位字符,1 停止位,无校验*/

(*SCICTL1)=0x03; /* 使能发送和接收 */

(*SCICTL2)=0x00; /* 禁止接收和发送中断 */

(*SCIHBAUD)=0x02; /* 波特率=208H,40MHz */

(*SCILBAUD)=0x08; /* 208h=40*10^6/(9600*8)-1 */

(*SCICTL1)=0x23; /* 使能发送和接收,复位 SCI */

while ( 1 )

{

if ( bReceive==0 )

{

for ( i=0;i<16;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)=cString[i];

wait(1024);

}

}

else

{

for ( i=0;i<10;i++ )

dsp实验报告 哈工大

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)=cAnswer[i];

wait(1024);

}

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)='\"';

for ( i=0;i<nLen;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)=cBuffer[i];

wait(1024);

}

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)='\"';

wait(1024);

for ( i=9;i<16;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 )

(*SCITXBUF)=cString[i];

wait(1024);

}

}

k=0; bReceive=0;

while ( 1 )

{

do

{

dsp实验报告 哈工大

uWork=(*SCIRXST);

} while ( (uWork&0x40)==0 );

cReceive=(*SCIRXBUF);

cBuffer[k]=cReceive;

if ( cReceive=='.' )

{

cBuffer[k+1]='\0';

nLen=k+1;

bReceive=1;

break;

}

k++; k%=16;

}

}

}

void wait(int nWait)

{

int i,j,k=0;

for ( i=0;i<nWait;i++ )

for ( j=0;j<64;j++ )

k++;

}

修改之后的程序(中断方式):

#include "2407c.h"

void interrupt gpSCI(void); /* 中断服务程序 */

void wait(int nWait);

char cString[17]={ "Hello PC!,Over|" };

char cReceive,cBuffer[17],cAnswer[16]={"Oh,you say"};

int nLen;

int k=0;

int NotRec=0;

unsigned int flag=0;

main()

{

unsigned int uWork;

int i;

asm(" setc INTM"); /* 关中断,进行关键设置时不允许发生中断,以免干扰 */

asm(" clrc SXM");

asm(" clrc OVM");

*WDCR=0x6f;

*WDKEY=0x5555;

dsp实验报告 哈工大

*WDKEY=0xaaaa; /*关闭看门狗中断*/

*SCSR1=0x81fe; /* 打开所有外设,设置时钟频率为40MHz */ uWork=(*MCRA);

uWork|=0x03; /* use SCITXD,SCIRXD */

(*MCRA)=uWork;

(*SCICCR)=0x07; /* 8位字符,1停止位,无校验*/ (*SCICTL1)=0x03; /* 使能发送和接收 */

(*SCIHBAUD)=0x02; /* 波特率=208H,40MHz */

(*SCILBAUD)=0x08; /* 208h=40*10^6/(9600*8)-1 */ (*SCICTL1)=0x23; /* 使能发送和接收,复位SCI */

(*SCICTL2)=0x02; /* 使能接收和发送中断 */

asm(" clrc INTM"); /* 开中断 */

for ( i=0;i<16;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)=cString[i];

wait(1024);

}

while ( 1 )

{

unsigned int uWork;

uWork=(*PIVR); /* 读外设中断向量寄存器*/

switch(uWork)

{

case 0x06: /* SCI发 */

if(flag)

{

flag = 0 ;

for ( i=0;i<11;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 );

(*SCITXBUF)=cAnswer[i];

wait(1024);

}

do

{

dsp实验报告 哈工大

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 ); (*SCITXBUF)='\"';

for ( i=0;i<nLen;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 ); (*SCITXBUF)=cBuffer[i];

wait(1024);

}

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 ); (*SCITXBUF)='\"';

wait(1024);

for ( i=9;i<16;i++ )

{

do

{

uWork=(*SCICTL2);

} while ( uWork&0x0c0 != 0x0c0 ); (*SCITXBUF)=cString[i];

wait(1024);

}

NotRec=0;

k=0;

}

}

}

}

void interrupt gpSCI(void) /* 中断服务程序 */ {

unsigned int uWork,Rec;

uWork=(*PIVR); /* 读外设中断向量寄存器*/ switch(uWork)

{

case 0x06: /* SCI收 */

dsp实验报告 哈工大

if(!NotRec)

{

cReceive=(*SCIRXBUF); cBuffer[k]=cReceive;

if ( cReceive=='.' ) {

flag = 1 ; NotRec = 1 ; cBuffer[k]='\0'; nLen=k;

Rec=(*SCIRXBUF); break;

}

Rec=(*SCIRXBUF); k++;k%=16;

break;

}

Rec=(*SCIRXBUF); break;

}

}

void wait(int nWait)

{

int i,j,k=0;

for ( i=0;i<nWait;i++ )

for ( j=0;j<64;j++ ) k++;

}

本文来源:https://www.bwwdw.com/article/ljo1.html

Top