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.
应用SCI的A组通讯,做一个简单的收发控制,作为从机,将接受到的数据通过一个数组原路返回给上位机(ComMonitor)。将发送任务函数放入到定时器0中,设置定时器周期为10ms,可以正常收发信息,接受和发送的数据一致,但是将定时器设置为1ms,返回和发送信息完全不一样。SCI的时钟频率为默认的LSPCLK设置。这个问题是和定时器周期有关吗?
只是进行数据赋值,把接受的数据放到一个数组里边,然后再把这个数组里的数据给到发送寄存器。也是通过SCI进行的。
发送代码如下
void scitx_a(void) { int i = 0; for(i=0;i<RXD_iSciA;i++) { SciaRegs.SCITXBUF = tdata[i]; while(0==SciaRegs.SCICTL2.bit.TXEMPTY); //TEXMPTY :0 SCITXBUF or TXSHF contain data } RXD_iSciA = 0; SCIA_TX_L; //发送禁止 SCIA_RX_H; } void SCI_work(void) { int i = 0; for(i=0;i<RXD_iSciA;i++) { tdata[i]=rdata[i]; } SCIA_RX_L; SCIA_TX_H; //发送使能 }
这个是在Timer0中运行的
interrupt void TIM0_IRQn(void) { LED_work(&LED_count); SCI_work(); scitx_a(); // SCIA_RX_H; PieCtrlRegs.PIEACK.bit.ACK1 = 1; }
尝试过5ms和50ms也可以收发,但是会经常报错误,看错误标志位提示是停止位丢失。1ms的也会有这个错误,而且更奇怪的是1ms的时候接受和发送的数据不一致(基本都不对),在5ms的时候是偶尔不对。
你好,传输所需数据需要多少时间?您计时器ISR中没有类似配置,是将其放在了普通函数流程中吗?您应该试试将其放在Timer ISR中。
你好,传输数据具体时间没有计算,但是很短。具体配置为波特率为19200,上位机发送的数据为12 34 56,发送周期为300ms;28335这边发送数据的函数是放在Timer0里边的,周期为分别设置过1ms,5ms,10ms,50ms,5ms以上收发数据基本一致,只是偶尔会出现停止位丢失(通过寄存器的标志位看到的),1ms的收发数据不一致。上面回答中有收发数据的配置。以下为Timer0的配置。
EALLOW;
PieVectTable.TINT0 = &TIM0_IRQn; //Timer0
EDIS;
interrupt void TIM0_IRQn(void)
{
LED_work(&LED_count);
SCI_work();
scitx_a(); //数据发送
// SCIA_RX_H;
PieCtrlRegs.PIEACK.bit.ACK1 = 1;
}
ConfigCpuTimer(&CpuTimer0,150,1000); //1ms