我在从pic24f发送的每条消息后收到帧错误。消息的持续时间或发送的消息数量无关紧要。在我的情况下发送最后一个字符(' \ 0'或0x00)后,我收到一个框架错误,我不知道为什么。我认为这是一个波特率问题,但是无论消息长度如何,都应该在同一个地方或附近产生一个关闭位样本,从而导致该点出现帧错误。不是这种情况。发送完最后一个字符后发生错误。
这是初始化代码:
_TRISF5 = 0; //TX pin to output
_TRISF3 = 1; //RX pin to input
iPPSOutput(OUT_PIN_PPS_RP17,OUT_FN_PPS_U1TX); //RP17 tied to TX
iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RP16); //RP26 tied to RX
U1MODE = 0; //disable, set defaults
//setup
U1MODEbits.STSEL=0;//one stop bit
U1MODEbits.PDSEL=0;//8 bit no parity
U1MODEbits.BRGH=1;//High speed mode (baud clock from Fcy/4)
U1MODEbits.RXINV=0;//UxRX idle state is '1' (don't invert)
U1MODEbits.ABAUD=0;//baud rate measurement disabled or completed
U1MODEbits.LPBACK=0;//loopback disabled
U1MODEbits.WAKE=0;//No wake up enabled
U1MODEbits.UEN1=0;//TX,RX enabled (others controlled by latch)
U1MODEbits.UEN0=0;//TX,RX enabled (others controlled by latch)
U1MODEbits.RTSMD=0;//RTS pin in flow control mode (don't think this applies for UEN = 0)
U1MODEbits.IREN=0;//irda encoder and decoder disabled
U1MODEbits.USIDL=1;//stop in idle mode
IFS0bits.U1RXIF = 0; //clear rx flag
IFS0bits.U1TXIF = 0; //clear tx flag
IEC0bits.U1RXIE = 1; //enable rx interrupt
IEC0bits.U1TXIE = 1; //enable tx interrrupt
U1BRG = 34; //115200, -0.62% Error
U1STAbits.URXISEL = 0; //Interupt when RX buffer has one or more characters
U1STAbits.UTXISEL1 = 0; //Interrupt when all transmit operations are complete
U1STAbits.UTXISEL0 = 0; //Interrupt when all transmit operations are complete
U1STAbits.UTXEN = 1;
U1MODEbits.UARTEN = 1; //enable
这是传输代码:
void send_msg(const char* msg){
char* p = (char*) msg;
U1STAbits.UTXEN = 1;
while(*p != '\0'){
while(U1STAbits.UTXBF); //wait for buffer room (1: buffer full, 0: buffer has room)
U1TXREG = *p++;
}
while(!U1STAbits.TRMT); //wait for transmission to complete
U1STAbits.UTXEN = 0; //disable the transmitter
}
链接到salae逻辑捕获:
答案 0 :(得分:3)
看here,我看到了:
通过将UTXEN使能位置1使能UART传输 (UxSTA的< 10 -10)。直到UxTXREG才会发生实际传输 已经加载了数据并且波特率发生器已经产生了 移位时钟,根据寄存器UxBRG中的值。该 也可以通过首先加载UxTXREG寄存器来启动传输 并设置UTXEN使能位。
在传输过程中清除UTXEN位将导致 传输将被中止并将重置发射机。作为一个 结果, UxTX引脚将恢复为高阻态。
[Bolding mine。]
我不熟悉PIC,但听起来我不应该启用和禁用发射器。 TX引脚变为高阻态将导致电平转换器的输入变为浮动,这可能是帧错误的来源。
我建议在初始化期间启用发射器并使其保持启用状态。只要您不向UART提供新的传输字符,它就应该保持空闲状态。
如果要使用中断,当发送器空闲时,屏蔽中断而不是禁用发送器。