繁体   English   中英

pic24f尾随UART成帧错误

[英]pic24f trailing UART framing error

从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逻辑捕获:

这里 ,我看到了:

通过将UTXEN使能位(UxSTA <10>)置1来使能UART发送。 根据UxBRG寄存器中的值,只有在UxTXREG装入数据并且波特率发生器产生移位时钟后,才会​​进行实际传输。 也可以通过先加载UxTXREG寄存器并将UTXEN使能位置1来开始发送。

发送过程中将UTXEN位清零将导致发送中止,并使发送器复位。 结果, UxTX引脚将恢复为高阻抗状态

[大胆的雷]

我对PIC并不熟悉,但听起来好像您不应该启用和禁用发送器。 TX引脚变为高阻态将导致电平转换器的输入变为悬空,这可能是成帧错误的根源。

我建议在初始化期间启用发送器,然后将其保持启用状态。 只要您不向UART提供新的发送字符,它就应该保持空闲状态。

如果要使用中断,则在发送器空闲时,屏蔽该中断而不是禁用发送器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM