📄 serial.c
字号:
/*****************************************************************
TMS2407SCI串口程序
在串口调试助手2.2中输入第一个字符是a后面14个是数据,DSP给电脑返回这15个数据
输入第一个字符是除了a以外的字符,且接收满了15个数据后,DSP给电脑发送Hello PC!,Over!
RS232串口初始化要和电脑的一致
那么还有比较重要的是你用INT1(高优先级中断)还是INT5(低优先级中断)
网上很多232的2407串口程序都不能用
刘和平老师的结构原理及应用我是没看懂(因为是汇编)
c语言开发应用是两个DSP的通讯没法调通。
这里希望大家能够更加快点入手
作者:章明 QQ:158585463
*******************************************************************/
#include "2407c.h"
void wait(int nWait);
unsigned char cString[20]={ "Hello PC!,Over!" },cReceive,cBuffer[17],cAnswer[16]={"Oh,you say!"};
int bReceive=0;
unsigned char cReceiveString[20];
int receivestringLen=0; /*定义接收到的字符串长度,我们人为在接收字符串子程序中判断他的长度。过了10个字符他就置0*/
void init_SCIcomm(void)
{
unsigned char baud,form;
form = 0x00; /*固定为9600bps,8位字符,1停止位,无校验*/
baud = 0x00;
asm(" setc INTM");
asm(" clrc SXM");
asm(" clrc OVM");
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa;
*IFR=0xFFFF; /*清除中断标志位*/
*SCSR1=0x81FE; /* 40MHz */
switch(form)
{
case 0x00 : { *SCICCR=0x07; break; } /*8位字符,1停止位,无校验*/
case 0x01 : { *SCICCR=0x67; break; } /*8位字符,1停止位,even parity*/
case 0x02 : { *SCICCR=0x27; break; } /*8位字符,1停止位,odd parity*/
default : { *SCICCR=0x07; break; } /*8位字符,1停止位,无校验*/
}
*SCICTL1=0x13; /* 使能发送和接收 */
*SCICTL2=0x03; /* 使能接收和发送中断 */
switch(baud)
{
case 0x00 : { *SCIHBAUD=0x02; *SCILBAUD=0x07; break; } /*波特率=9600bps,40MHz;0x0208=30*10^6/(9600*8)-1*/
case 0x01 : { *SCIHBAUD=0x01; *SCILBAUD=0x04; break; } /*19200bps*/
case 0x02 : { *SCIHBAUD=0x00; *SCILBAUD=0x81; break; } /*38400bps*/
case 0x03 : { *SCIHBAUD=0x00; *SCILBAUD=0x57; break; } /*57600bps*/
case 0x04 : { *SCIHBAUD=0x00; *SCILBAUD=0x2a; break; } /*115200bps*/
default : { *SCIHBAUD=0x02; *SCILBAUD=0x08; break; } /*9600bps*/
}
*SCICTL1=0x33; /* 使能发送和接收,复位SCI */
*SCIPRI=0x00;
*MCRA=0x0003; /* use SCITXD,SCIRXD */
*PADATDIR=0x0100;
*IMR=0x0001;
asm(" CLRC INTM ");
}
unsigned char serialReceive(void) /*接收一个ASC||字符,也就是一个字节的数据,也是一个8bit的数据*/
{
unsigned char d;
d = *SCIRXBUF;
while((*SCIRXST & 0x40)!=0);
return d;
}
void serialOutput(unsigned char c) /*发送一个ASC||字符,也就是一个字节的数据,也是一个8bit的数据*/
{
*SCITXBUF = c;
while((*SCICTL2 & 0x80) == 0);
}
void StringserialOutput( unsigned char *cString1,int i ) /*发送一个ASC||字符串,这里规定每次接收的长度不能超过10个字符,也就是10个字节的数据。80bit的数据*/
{
int j;
for( j=0; j<i; j++)
{
serialOutput(*(cString1+j));
wait(1024);
}
}
main()
{
init_SCIcomm(); //初始化SCI串口
while ( 1 )
{
if ( bReceive==0 )
{
}
else if(bReceive==1)
{
// serialOutput(0x61);
// serialOutput(0x62);
// serialOutput(0x63);
StringserialOutput(cReceiveString,15);
/* receivestringLen=0; //发送完了让长度为0 */
bReceive=0; //取数标志清0
}
else
{
// serialOutput(0x79);
StringserialOutput( cString,16);
// wait(1024);
bReceive=0;
}
}
}
void wait(int nWait)
{
int i,j,k=0;
for ( i=0;i<nWait;i++ )
for ( j=0;j<64;j++ )
k++;
}
void interrupt GISR1()
{
unsigned char rec;
switch(*PIVR)
{
case 0x0006:
{
// rec = *SCIRXBUF;
rec= serialReceive();
cReceiveString[receivestringLen++]=rec;
if(cReceiveString[0]==0x61 && receivestringLen==15) /*如果电脑给DSP发送的是字符a,DSP就接收下面的电脑给的数据并且把接收过来的数据发送给电脑*/
{
bReceive=1;
receivestringLen=0;
}
else if(cReceiveString[0]!=0x61 && receivestringLen==15) /*如果电脑给DSP发送的是AS||码除了a以外的字符,那么DSP就把自己要给电脑发的数据发给电脑。这里发的是"Hello PC!,Over!"*/
{
bReceive=2;
receivestringLen=0;
}
else
{
bReceive=0;
}
}
default : break;
*IFR|=0x0001;
asm(" CLRC INTM ");
}
}
void interrupt nothing()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -