【转】[原创] CCSV5之C2000USI 应用
dsp吧
全部回复
仅看楼主
level 2
文章来源于:http://bbs.ickey.cn/group-topic-id-40448.html
作者:barrettzxn
之前学习了外部中断的使用,接下来就学习,TMS320F28027的串口功能了,总所周知,在调试程序的时候,最好我能看见我想看的变量的值,所以,我们可以通过器件的串口通信接口把数据发送到电脑上位机上进行查看,这为我们的调试带来了极大的方便!
首先我们来看一下TMS320F28027的串口通信接口模块!
引用数据手册的内容:
和其他单片机的原理基本一样!
涉及到的寄存器有以下这些:
下面是SCI模块方框图
和大部分单片机一样,我们配置串口都是这么几步
一:配置串口使用的IO口
二:配置波特率,奇偶检验,数据长度
三:配置接收发送中断函数
接下来,我们就来看原理图
GPIO29-->SCITXD;
GPIO28-->SCIRXD;
下面附上代码:
#include"DSP28x_Project.h" // Device Headerfile and Examples Include File
#define CBR_110 11E1
#define CBR_300 3E2
#define CBR_600 6E2
#define CBR_1200 12E2
#define CBR_2400 24E2
#define CBR_4800 48E2
#define CBR_9600 96E2
#define CBR_14400 144E2
#define CBR_19200 192E2
#define CBR_38400 384E2
#define CBR_56000 56E3
#define CBR_57600 576E2
#define CBR_115200 1152E2
#define CBR_128000 128E3
#define CBR_256000 256E3
#define CPU_FREQ 60E6
#define
LSP
CLK_FREQ (CPU_FREQ/4)
#define SCI_BAUD(baud) (LSPCLK_FREQ/(baud*8))-1
interrupt void key_down(void);
void SCI_Configure(void) ;
void SCI_SendByte(unsigned char TxByte);
void Send_text(char *p);
char string[]="n UART IS OK !n";
char string1[]="nr Welcome TO ICKEY! !nr";
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart;
void main(void)
{
memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);
InitSysCtrl();
//Gpio_select();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
//允许访问受保护的空间
EALLOW;
PieVectTable.XINT1 = &key_down;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; //除能上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; //GPIO12作普通IO使用 p189
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; //配置为输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; // 6 samples
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF; //采样周期为510*Tsysclk,窗口宽度为5*510*Tsysclk=2550/60M=42.5us
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; //GPIO12作为xint1的中断源
XIntruptRegs.XINT1CR.bit.POLARITY = 1; //上升沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE = 1; //外中断1使能
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //使能int1.4
// IER |= 0x0001; //使能int1
IER |= M_INT1; // Enable CPU INT1
//禁止访问受保护的空间
EDIS;
SCI_Configure();
EINT;//使能中断
// 允许访问受保护的空间
EALLOW;
// 配置I/O口为输出
GpioCtrlRegs.GPADIR.all=0x000f;
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
GpioDataRegs.GPASET.bit.GPIO1=1;
GpioDataRegs.GPASET.bit.GPIO2=1;
GpioDataRegs.GPASET.bit.GPIO3=1;
// 禁止访问受保护的空间
EDIS;
Send_text(string);
while(1)
{
}
}
void SCI_Configure(void)
{
EALLOW;
// GPIO28/SCI_RX,配置成上拉输入,输入限定脉冲周期为3*2=6个时钟周期
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0; // 配置为输入
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // 使能上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // 配置 GPIO28 为SCI_RX
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // 限定输入脉冲为6
// GPIO29/SCI_TX,配置为无上拉输出
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1; // 配置为输出
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; // 禁止上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // 配置 GPIO29 为SCI_TX
EDIS;
SciaRegs.SCICTL1.bit.SWRESET = 0; // 复位SCI寄存器
SciaRegs.SCICTL1.bit.SWRESET = 1; // 完成复位
// 配置SCI 8位数据位,1个停止位,无校验,波特率 9600
SciaRegs.SCICCR.bit.STOPBITS = 0; // 0:1个停止位 1:两个停止位
SciaRegs.SCICCR.bit.PARITY = 0; // 0:奇校验 1:偶校验
SciaRegs.SCICCR.bit.PARITYENA = 0; // 0:禁止校验 1:允许校验
SciaRegs.SCICCR.bit.SCICHAR = 7; // 7:数据位8位
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = SCI_BAUD(CBR_9600);
SciaRegs.SCICTL1.bit.RXENA = 1; // 0:禁止接收 1:使能接收
SciaRegs.SCICTL1.bit.TXENA = 1; // 0:禁止发送 1:使能发送
SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 0:禁止接收中断 1:允许接收中断
SciaRegs.SCICTL2.bit.TXINTENA = 0; // 0:禁止发送中断 1:允许发送中断
PieVectTable.SCIRXINTA = &SCIRXINTA_ISR;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //使能int9.1
IER |= M_INT9; //使能int9
ERTM;
}
void SCI_SendByte(unsigned char TxByte)
{
while(SciaRegs.SCICTL2.bit.TXRDY != 1);
SciaRegs.SCITXBUF = TxByte;
}
void Send_text(char *p)
{
for(; *p!=''; p++)
{
SCI_SendByte(*p);
}
}
interrupt void key_down(void)
{
GpioDataRegs.GPATOGGLE.bit.GPIO0=1;
Send_text(string1);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
着重说说SCI的配置函数:
void SCI_Configure(void)
{
EALLOW;
// GPIO28/SCI_RX,配置成上拉输入,输入限定脉冲周期为3*2=6个时钟周期
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0; // 配置为输入
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // 使能上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // 配置 GPIO28 为SCI_RX
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // 限定输入脉冲为6
// GPIO29/SCI_TX,配置为无上拉输出
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1; // 配置为输出
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; // 禁止上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // 配置 GPIO29 为SCI_TX
EDIS;
SciaRegs.SCICTL1.bit.SWRESET = 0; // 复位SCI寄存器
SciaRegs.SCICTL1.bit.SWRESET = 1; // 完成复位
// 配置SCI 8位数据位,1个停止位,无校验,波特率 9600
SciaRegs.SCICCR.bit.STOPBITS = 0; // 0:1个停止位 1:两个停止位
SciaRegs.SCICCR.bit.PARITY = 0; // 0:奇校验 1:偶校验
SciaRegs.SCICCR.bit.PARITYENA = 0; // 0:禁止校验 1:允许校验
SciaRegs.SCICCR.bit.SCICHAR = 7; // 7:数据位8位
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = SCI_BAUD(CBR_9600);
SciaRegs.SCICTL1.bit.RXENA = 1; // 0:禁止接收 1:使能接收
SciaRegs.SCICTL1.bit.TXENA = 1; // 0:禁止发送 1:使能发送
SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 0:禁止接收中断 1:允许接收中断
SciaRegs.SCICTL2.bit.TXINTENA = 0; // 0:禁止发送中断 1:允许发送中断
PieVectTable.SCIRXINTA = &SCIRXINTA_ISR;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //使能int9.1
IER |= M_INT9; //使能int9
ERTM;
}
在这里,我使能了接收中断,接收函数中断对应的是INT9.1,所以添加下面语句
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //使能int9.1
IER |= M_INT9; //使能int9
ERTM;
中断函数是这样的:
// INT9.1
interrupt void SCIRXINTA_ISR(void) // SCI-A
{
SciaRegs.SCITXBUF = (SciaRegs.SCIRXBUF.bit.RXDT);//把接收到的字符再发回电脑
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}
其他的还是很好理解的,注释也很详细!
还有一个就是FIFO的问题,如果我们用到了FIFO,那么我们又用到了发送中断和接受中断,就会有这样一个问题,不用FIFO和用FIFO的中断标志位不一样!
如果我们用了FIFO那么对应的标志位也要修改!
最后烧录程序,打开串口助手!如下图
Over,谢谢观看!
下面附上TMS320F28027的USI模块
sci.pdf(244.23 KB, 下载次数:0, 售价:1个IC币)
2014年11月28日 07点11分 1
level 9
顶,好
2014年11月30日 11点11分 2
1