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 通信 ,发送一串数据过去,只有第一个字节正确读出。 如果 把停止位改成2才行, 但是实际上我在DSP软件里面配置的停止位是1位。比如我把收到的数据反馈回来如下。
上位机PC 设置为 1 位停止位时(错误):
[2023-07-21 08:35:40.052]# SEND HEX>
90 07 25 31 44 08 33 22
[2023-07-21 08:35:40.199]# RECV HEX>
90 83 49 26 14 68 12 FF
上位机PC 设置为 2位停止位时(正确):
[2023-07-21 08:35:33.797]# SEND HEX>
90 07 25 31 44 08 33 22
[2023-07-21 08:35:33.932]# RECV HEX>
90 07 25 31 44 08 33 22
但是我的代码实际上配置的是1位停止位如下:
//*****************************************************************************
//
// SCI Configurations
//
//*****************************************************************************
void SCI_init(){
MOD_SYS_init();
}
void MOD_SYS_init(){
SCI_clearInterruptStatus(MOD_SYS_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY);
SCI_clearOverflowStatus(MOD_SYS_BASE);
SCI_disableFIFO(MOD_SYS_BASE);
SCI_resetChannels(MOD_SYS_BASE);
SCI_setConfig(MOD_SYS_BASE, DEVICE_LSPCLK_FREQ, MOD_SYS_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));
SCI_disableLoopback(MOD_SYS_BASE);
SCI_performSoftwareReset(MOD_SYS_BASE);
SCI_enableInterrupt(MOD_SYS_BASE, SCI_INT_RXRDY_BRKDT);
SCI_enableModule(MOD_SYS_BASE);
}
void main(void)
{
Device_init();
Interrupt_initModule();
Interrupt_initVectorTable();
Board_init();
Interrupt_enableGlobal();
DEVICE_DELAY_US(300000);
///force SET SCI_CONFIG_STOP_ONE
HWREGH(SCIA_BASE + SCI_O_CCR) = 7;
for(;;)
{
SysLoop();
}
}
__interrupt void INT_MOD_SYS_RX_ISR(void)
{
//add data to array
ModSysRxIrq(SCI_readCharNonBlocking(SCIA_BASE));
// SCI_clearOverflowStatus(SCIA_BASE);
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXRDY_BRKDT);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}
改成在主循环里面,查询方式读 SCI_readCharNonBlocking(SCIA_BASE)就好了。
感觉这是芯片的一个BUG,中断读期间,SCI不接收数据导致的,导致第2 ,3 以及后面的数据出错,收少了一个bit。
问题解决就好。
但是并不认同推测。F280025C的SCI采用双缓冲设计,包括移位寄存器和数据缓冲寄存器;移位寄存器接收完毕后,会将数据送入数据缓冲寄存器,同时触发接收中断。
首先数据的接收与否并不受中断影响;其次双缓冲的设计更加保证了数据的完整性。
spruin7b_TMS320F28002x Real-Time Microcontrollers Technical Reference Manual (Rev. B) 第2570页 Figure 26-2. Serial Communications Interface (SCI) Module Block Diagram