DSP5416的串口通信的设计Word下载.docx
《DSP5416的串口通信的设计Word下载.docx》由会员分享,可在线阅读,更多相关《DSP5416的串口通信的设计Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
当McBSP为SPI的主设备时,由McBSP内部的采样发生器产生时钟CLKX和从设备使能信号FSX。
3.2McBSP为从设备接口
图2McBSP为从设备时的接口
当McBSP作为SPI从设备时,由外部的主设备产生所需要的主控时钟信号和从设备使能信号。
四McBSP为主设备时的串口通信电路设计
1MAX3111功能特点
MAX3111是MAX3100的改进类型,它包括一个振荡器和一个可编程波特率发生器;
具有一个可屏蔽的中断源;
另具有一个8字节的接收FIFO(先入先出)缓冲器。
其应用SPI/MICROWIRE接口技术直接与控制器之间进行通信,通信速率可达230kbps,还包括两个RS-232电平转换器,这样无需再接入电平转换器,而使应用一个芯片即可实现具有SPI/MI-CROWIRE接口的微控器与PC或是其他设备进行异步数据传输。
2TMS320C5416与MAX3111硬件接口设计
TMS320C5416DSP的McBSP串行接口工作于SPI模式时可直接与MAX3111进行连接(MAX3111为3.3V器件的特性方便了于C5400系列DSP芯片进行接口),从而实现与RS-232设备进行异步数据传输,此时TMS320C5416作为SPI协议的主设备,其接口电路如图3所示。
图3:
DSP串口通信电路图
DSP的发送时钟信号(CLKX)作为MAX3111的串行时钟输入,发送帧同步脉冲信号(FSX)作为MAX3111的片选信号(CS)。
DX与DIN连接作为发送数据线,DR与DOUT连接为接收数据线。
MAX3111的DX与DIN连接,DX与DOUT连接,从而利用其片内的转换器实现UART到RS-232电平的转换。
由于SPI模式下的MCBSP并不能产生接受中断,因此MAX3111的中断信号(IRQ)与DSP的外部中断相连。
五软件流程图(附程序)
主程序软件流程图如下图所示。
图4:
主程序流程图
六软件硬件联调
把程序烧录到DSP芯片内,然后运行机房电脑里的串口调试工具,设置好端口和参数。
运行程序结果:
(1)按下键2,PC机向DSP处理器发送数据
(2)按下键1,DSP处理器向PC机发送数据,连续递增加1显示
经分析:
实验结果与我们理论设计结果相同,本实验圆满完成。
七总结与展望
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.回顾起此次DSP原理及应用的课程设计,至今我仍感慨颇多,从理论到实践,在整个实验的过程中,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟是第一次综合应用DSP技术来做设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固……通过这次毕业设计之后,可以把以前所学过的知识重新温故。
这次毕业设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的辛勤指导下,同学的帮助下终于迎刃而解。
在此我表示感谢!
八参考文献
[1]DSP原理及应用[M],邹彦:
电子工业出版社.
[2]张雄伟,曹铁男.DSP芯片的原理与开发应用(第2版)[M].北京:
电子工业出版社,2000.
[3]张毅刚,赵光权,孙宁,等.TMS320LF2812DSP原理,开发与应用[M].哈尔滨:
哈尔滨工业大学出版社,2006.
附录
附录一:
串口中断软件流程图
图5:
附录二:
定时器中断软件流程图
图6:
附录三:
外部中断2软件流程图
图7:
外部中断2中断软件流程图
附录四:
源程序
#include<
string.h>
#pragmaCODE_SECTION(vect,"
vect"
)
unsignedint*pmem=0;
#define
IMR
*(pmem+0x0000)
IFR
*(pmem+0x0001)
PMST
*(pmem+0x001d)
SWCR
*(pmem+0x002b)
SWWSR
*(pmem+0x0028)
CLKMD
*(pmem+0x0058)
PRD0
*(pmem+0x0025)
//timer0periodregister
TCR0
*(pmem+0x0026)
//timer0controlregister
/*mcbsp1*/
#defineSPSA1
*(pmem+0x0048)
//子地址寄存器
#defineSPSD1
*(pmem+0x0049)
//
#defineDRR11
*(pmem+0x0041)
//接收数据寄存器1
#defineDRR21
*(pmem+0x0040)
//接收数据寄存器2
#defineDXR11
*(pmem+0x0043)
//发送数据寄存器1
#defineDXR21
*(pmem+0x0042)
//发送数据寄存器2
/*mcbsp1subadress*/
#defineSPCR11
0x0000
//串行口控制寄存器1
#defineSPCR21
0x0001
//串行口控制寄存器2
#defineRCR11
0x0002
//接收控制寄存器1
#defineRCR21
0x0003
//接收控制寄存器2
#defineXCR11
0x0004
//发送控制寄存器1
#defineXCR21
0x0005
//发送控制寄存器2
#defineSRGR1
0x0006
//采样率发生寄存器1
#defineSRGR2
0x0007
#definePCR1
0x000e
//引脚控制寄存器
ioportunsignedportc000;
//数码管地址
ioportunsignedportc001;
//键盘地址
ioportunsignedportc002;
//发光二极管地址
intnum=0;
intn=0;
staticintTmcounter;
staticconstchartable[10]={"
1234567890"
};
staticintweima[8]=
{0x0100/*1*/,0x0200/*2*/,0x0400/*3*/,0x0800/*4*/,
0x1000/*5*/,0x2000/*6*/,0x4000/*7*/,0x8000/*8*/};
staticintduanma[16]=
{0x003f/*0*/,0x0006/*1*/,0x005b/*2*/,0x004f/*3*/,
0x0066/*4*/,0x006d/*5*/,0x007d/*6*/,0x0007/*7*/,
0x007f/*8*/,0x006f/*9*/,0x0077/*a*/,0x007c/*b*/,
0x0039/*c*/,0x005e/*d*/,0x0079/*e*/,0x0071/*f*/};
voiddelay()
//WAIT
{
asm("
STM#0008h,AR0"
);
RPT*AR0"
NOP"
}
voiddelay10ms()
int
i,j,k;
for(i=0;
i<
2;
i++)
for(j=0;
j<
j++)
for(k=0;
k<
k++);
voiddelay100ms()
14;
12;
20;
voidcpu_init()
//初始化DSP
ssbxintm"
ssbxxf"
PMST=0xe8;
SWWSR=0x7fff;
SWCR=0x0000;
CLKMD=0x1000;
TCR0=0x0a59;
PRD0=0xf9f;
IMR=0x0c0c;
//开放mcbsp1发送中断、mcbsp1接收中断、外部中断2、定时器0中断
IFR=0xffff;
rsbxintm"
rsbxxf"
voidmcbsp_init()
SPSA1=SPCR11;
//SerialPortControlRegister1
SPSD1=0x1800;
//1800
SPSA1=SPCR21;
//SerialPortControlRegister2
SPSD1=0x0000;
//0000
SPSA1=RCR11;
//ReceiveControlRegister1
SPSD1=0X40;
//0040
SPSA1=RCR21;
//ReceiveControlRegister2
SPSD1=0x01;
//0001
SPSA1=XCR11;
//TransmitControlRegister1
SPSD1=0x40;
SPSA1=XCR21;
//TransmitControlRegister2
//01
SPSA1=SRGR1;
//SampleRateGeneratorRegister1
//0000
SPSA1=SRGR2;
//SampleRateGeneratorRegister2
SPSD1=0x2000;
//2000
SPSA1=PCR1;
//PinControlRegister
SPSD1=0x0a08;
DXR11=0x000;
SPSD1=0x1801;
SPSD1=0x0041;
voidaic_init()
{
DXR11=0xcc0b;
//9600enablereceiveddatainterrupt
//低四位决定波特率
voidmain(void)
cpu_init();
mcbsp_init();
aic_init();
Tmcounter=0;
for(;
;
){}
}
interruptvoidrs232()
{
intrxdata;
intvalue;
DXR11=0x00;
//向MAX3111写入0x00,即最高两位为00,表示DSP要从MAX3111读数据
rxdata=DRR11;
//从数据接收寄存器DRR读出数据
if(rxdata&
0x8000)
//若读到的数据最高位R为1,则表示数据信息可被读取
value=rxdata&
0x00ff;
//传送的数据存放在16位数的低八位
if(value>
15)
value=15;
portc000=weima[n]|duanma[value];
n++;
if(n>
7)n=0;
}
interruptvoidtint0()
intrxdata,txdata,value;
if(Tmcounter==250)
0x4000)
//若读到的数据?
,则表示?
,已准备好接收数据
value=table[num];
txdata=value&
DXR11=0x8000|txdata;
//写数据
num++;
if(num==10)
num=0x0;
DXR11=0xc40b;
//写控制字,且TM为0,表示禁止MAX3111发送缓冲器的空中断
Tmcounter++;
interruptvoidKeyDown()
inta;
a=portc001;
a=a&
0xff00;
if(a!
=0xff00)
delay10ms();
if(a==0xfe00)
//当按键1按下时,开始定时,关mcbsp1接收中断
IMR=0x080c;
TCR0=0x0a69;
elseif(a==0xfd00)
//按键2按下时,停止定时,开mcbsp1接收中断
else;
void
vect()
.ref_c_int00"
.ref_rs232"
.ref_tint0"
b_c_int00"
/*reset*/
nop"
rete"
//nmi
rete"
rete"
/*int0*/
/*int1*/
b_KeyDown"
/*int2*/
b_tint0"
/*tint0*/
/*brint0*/
/*bxint0*/
/*dmac2*/
/*tint1*/
/*int3*/
/*hpint*/
b_rs232"
/*brint1*/
/*bxint1*/
/*dmac4*/
/*dmac5*/
.space29*4*16"