使用28335中断接收数据的时候,一个一个的发送接收为正常的,例如发送01,接收为01。但是发送例如010203,接收为01FF,并且只会进入两次次中断。
interrupt void SCIARX_IRQn(void)
{
*PCData = ScibRegs.SCIRXBUF.all;
PCData++;
PieCtrlRegs.PIEACK.all |= 0x100; // Issue PIE ack
}
接收代码如上图,我需要添加什么来保证接收的正常吗?
EALLOW;
PieVectTable.SCIRXINTB = &SCIARX_IRQn;
EDIS;
InitScibGpio();
ScibRegs.SCICCR.all = 0x0007; // 1 stop bit, No loopback
ScibRegs.SCICTL1.all = 0x0003; // Relinquish SCI from Reset
ScibRegs.SCICTL2.bit.RXBKINTENA = 1;
ScibRegs.SCIHBAUD =scihbaud; // 9600 baud @LSPCLK = 37.5MHz.
ScibRegs.SCILBAUD =scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
ScibRegs.SCIFFTX.bit.SCIFFENA = 0;
ScibRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;
IER |= M_INT9;
EINT;
ERTM;
初始化如上
Green Deng:
像这样的通讯问题有很多潜在的原因:
首先,你能否确保该管脚已正确地MUX为SCIRX管脚?有关详细信息,请参阅TRM的"1.4.5 GPIO and Peripheral Multiplexing (MUX)"部分。这是最有可能的原因,因为没有分配GPIOA/GPIOB MUX寄存器,所以可能导致SCIRX接收0xFF(因为线路总是高电平,实际上没有接收任何数据)。
其次,如果MUX已正确分配给给定管脚的SCIRX,并且设备仍存在此问题,你可以尝试对RX线路进行blocking read(类似于C2000ware里面F280049的例程sci_ex2_interrupts.c):
SCI_readCharBlockingNonFIFO(uint32_t base) {//// Check the arguments.//ASSERT(SCI_isBaseValid(base));//// Wait until a character is available in the receive FIFO.//while(!SCI_isDataAvailableNonFIFO(base)){}//// Return the character from the receive buffer.//return(uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M); }SCI_isDataAvailableNonFIFO函数会反复检查RXRDY位,以确保数据已被实际接收。这样可以确保每次接收到完整字节。有关更多详细信息,请参阅C2000Ware中的sci_ex2_interrupts.c例程(位于:\…\C2000Ware_版本号\driverlib\f28004x\examples\sci)。
最后,如果条件允许的话,可以用逻辑分析仪或者示波器监控引脚的输入和输出,确定通信是否按预期进行(检查输入波特率是否正确,是否接收到数据等)。