#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
unsigned int Sci_VarRx,temp_RX;
unsigned int Sci_VarTx;
volatile Uint16 * ptr;
int Send_Flag;
int SciaTx_Ready(void);
int SciaRx_Ready(void);
int Rx_flag,ix,ii,n;
int Tx_flag;
void Scia_init(void);
int str_TX[]={0x01,0x03,0x21,0x00,0x00,0x01};//010321000001
unsigned int Crc_16();
unsigned int crc16,crc1,crc2;
unsigned int str_RX[100];
int Rx_Int16=0x1234;
void main(void)
{
crc16=Crc_16();
crc1=crc16%256;
crc2=crc16/256;
Rx_flag=0;
Tx_flag=0;
Sci_VarRx = 0;
Sci_VarTx = 0;
Send_Flag = 0;
InitSysCtrl();//LSPCLK=SYSCLKOUT/2=60MHZ/2=30MHZ
InitSciaGpio();
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; //配置485-RTS使能上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0; //配置485-RTS的GPIO25为IO功能
GpioCtrlRegs.GPADIR.bit.GPIO25 = 1; //配置485-RTS为输出
GpioDataRegs.GPADAT.bit.GPIO25 = 0; //设置485-RTS默认输出为低电平
EDIS;
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
Scia_init();
EnableInterrupts();
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
EINT;
ERTM;
for(;;)
{
SciaRx_Ready();
if(Rx_flag == 1)
{
ix=0;
while(SciaRegs.SCIRXST.bit.RXRDY == 1)
{
str_RX[ix]=0;
str_RX[ix]= SciaRegs.SCIRXBUF.all;
DELAY_US(1000);
ix++;
}
SciaTx_Ready();
if(Tx_flag==1)
{
n=sizeof(str_RX)/sizeof(int);
for(ii=0;ii<n;ii++)
{
SciaRegs.SCITXBUF =str_RX[ii];
DELAY_US(1000);
}
}
}
}
}
void Scia_init()
{
SciaRegs.SCICCR.all =0x0007; // 设置通信控制寄存器
SciaRegs.SCICTL1.all =0x0003; // 设置SCI控制寄存器1
SciaRegs.SCICTL2.all =0x0003;//设置控制寄存器2
SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
SciaRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
SciaRegs.SCIHBAUD =0x0000; //
SciaRegs.SCILBAUD =0x00C2
SciaRegs.SCICTL1.all =0x0023; // 0x0023 = 0010 0011
//SW RESET = 1(系统复位后,向此位写入1将重新使能SCI)
}
int SciaRx_Ready()
{
GpioDataRegs.GPADAT.bit.GPIO25 = 0; //低电平,收数据
DELAY_US(10000);
if(SciaRegs.SCIRXST.bit.RXRDY == 1)
{
Rx_flag = 1;
}
else
{
Rx_flag=0;
}
return(Rx_flag);
}
int SciaTx_Ready(void)
{
GpioDataRegs.GPADAT.bit.GPIO25 = 1; //高电平,发数据
DELAY_US(10000);
if(SciaRegs.SCICTL2.bit.TXRDY == 1)
{
Tx_flag=1;
}
else
{
Tx_flag=0;
}
return(Tx_flag);
}
上述程序要实现的功能是:DSP通过485与PC机的“串口调试软件”通讯,“串口调试软件”首先按十六制发送一个串03 03 20 00 00 01,DSP接收到后,把接收的值 01 03 20 00 00 01发送给PC,即把接收到的值,发送给PC。
现在的问题是:串口调试软件只能接收到01,其它的接收不到;如果用串口调试软件发送02、03或04给DSP时,接收值都是正确的(即02、03、04),PC就是在发送多个值时,DSP只能接收到最后一个值。我查看了DSP接收数组的内容 ,只有str_RX[0]有接收值,即上述的01;如果DSP单独发送str_TX数据的值时,PC接收是正确的;可能是DSP程序的接收部分的语句有点问题,请各位指点一下!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
第一呢,我看了你的程序,很多毛病, 我挑主要的说吧,我也遇到过,我第一意识告诉我是FIFO的问题,我看到你没有初始化FIFO,这个你查看一下,是不是有问题,这个FIFO最好是关掉,因为我们接受数据的时候,是不确定数据的长度的,如果你确定了深度的话(如:15个深度),那么你要等15个字(数字、char等等),我感觉很麻烦,
第二个就是 你用的是等待的办法来接受数据的,那么在单片机里面可能是好使的(因为我也是从那学过来的),但是对于DSP2000系列,你最好是用中断,dsp接受一个数据就中断一次,直到没有数据发过来为止,我个人感觉很方便, interrupt void scibRxFifoIsr(void)
{
Uint16 i;
i=ScibRegs.SCIRXBUF.all;
scib_xmit(i); //接受到dsp的数据,立刻就再从dsp发送给PC机
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}
还有你出现的这个问题,我还像遇到过,也好像没遇到过,SciaRegs.SCICTL2.bit..RXRDY 不管PC给多少数,但是dsp只能接受到一个数(第一个数),剩下的数就丢失了,。。。。。不要听我的,也有可能是你程序的问题,如
if(Rx_flag == 1)
{
ix=0;
while(SciaRegs.SCIRXST.bit.RXRDY == 1)
{
str_RX[ix]=0;
str_RX[ix]= SciaRegs.SCIRXBUF.all;
DELAY_US(1000);
ix++;
}
确实当dsp接受到第一数的时候,READY==1;那么你有没有想想,当第一个数传给 str_RX[ix]的时候,ready是不是==0;了呢,会不会就在那时候跳出循环了呢?(我懂你写这个程序的意思,但是事与愿违,)
还有你说你只能看到str_RX[0]的数组有数,你没注意你写的程序就有问题吗?但Rx_flag == 1;就进入循环的时候,你的第一句话ix=0; 是造成str_RX[ix]只显示第一个数的原因吗?
我就说这么多,希望我说的对你有帮助
是 接受都没有问题,你是指的是一个数据?还是很多个呢?我理解你的意思是 一个数据,你没有用中断吗?
你试试
一周热门 更多>