This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,我使用的DSP是TMS320F28027。现在我需要做PC和DSP的双向通讯,利用PC来监控。数据格式:1位起始位,8位数据位,一位停止位,无校验位和校验位。双向通讯时:DSP每隔5分钟,发送一次数据至PC;而只有当需要改变DSP工作状态时,PC才需要发送数据给DSP,由于PC每次发送数据为4帧,所以使用了28027的FIFO功能,原本打算28027一次FIFO中断可以接收4帧数据,但此功能在程序中没有实现,只能每次中断接收这4帧数据中的第一帧数据。如下是SCI FIFO配置和接收程序:
void InitSci(void)
{
// Initialize SCI-A:
SciaRegs.SCICCR.all =0x0007; // 1bit 停止位 无循环模式
// 无极性, 字符长度:8 bits,
// 异步模式, 空闲线协议
SciaRegs.SCICTL1.all =0x0003; // 使能 TX, RX, 内部 SCICLK,
// 禁止 RX ERR, SLEEP, TXWAKE
SciaRegs.SCIHBAUD = 0x00; // Baud=15MHz/((0x00C2+1)*8)
SciaRegs.SCILBAUD = 0xC2;
SciaRegs.SCICTL2.bit.TXINTENA = 1; // 使能SCI发送中断
SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 使能SCI接收中断
SciaRegs.SCIFFTX.all = 0xE060;
// bit 15 = 1 : 退出复位
// bit 14 = 1 : 使能FIFO增强模式
// bit 13 = 1 : 使能 TX FIFO操作
// bit 6 = 1 : CLR TXFFINT-标志
// bit 5 = 1 : 使能TX FIFO匹配
// bit 4-0 : 如果TX FIFO等于0,产生TX-ISR中断
SciaRegs.SCIFFRX.all = 0xE064; // Rx 中断级设置为4
SciaRegs.SCICTL1.all =0x0023; // 使SCI退出复位
}
void InitSciGpio()
{
InitSciaGpio();
}
void InitSciaGpio()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up for GPIO19 (SCIRXDA)
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; // Disable pull-up for GPIO12 (SCITXDA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // Configure GPIO19 for SCIRXDA operation
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for SCITXDA operation
EDIS;
}
interrupt void sciaRxFifoIsr(void)
{
static int l=0;
Uint16 k=0;
static int rdd[4];
/*********************************************************************************************************************/
EINT; // Enable Global interrupt INTM
EALLOW;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear receive FIFO interrupt flag
PieCtrlRegs.PIEACK.bit.ACK9 |= PIEACK_GROUP9; // Issue PIE ack
EDIS;
/*********************************************************************************************************************/
/*** Receive Data ***/
/*********************************************************************************************************************/
for(l=0;l<4;l++)
{
rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT;
}
if(l==4) // recieve 4 Remote control data
{
l = 0;
Recive_OK_Flag = 1;
}
else
{
l = 0;
Recive_OK_Flag = 0;
}
rdd[0] = rdataA[0]; // For testing
rdd[1] = rdataA[1];
rdd[2] = rdataA[2];
rdd[3] = rdataA[3];
k++;
}
此程序功能没有实现,比如PC发出了"01 02 03 04”,而DSP却只接收了第一帧数据,即"01"。原本是希望FIFO接收中断一次就可以将这4帧数据全部接收,所以请大家帮忙看看,是哪里设置错误。谢谢!
您好!
首先PC每次发送数据为4帧,正常情况下,每收到一帧然后进入中断,您可以这样实现。
个人感觉 SciaRegs.SCIFFRX.all这个寄存器的配置有问题,建议您对照着例程进行修改。无非就是设置一下FIFO深度为4然后触发中断。
另外,在中断前面部分加入断点,看一下接收Buf中4个数据是不是都进来了。
确认一下是不是在以下程序段中出问题。
for(l=0;l<4;l++)
{
rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT;
}
提醒您的是,您需要一定的机制去判断4帧数据的次序,比如1、2、3、4,如果处理不好,会出现2、3、4、1。