初始化后,PIC32 UART发送乱码

时间:2014-02-05 15:59:15

标签: c pic uart microchip pic32

我正在编写代码来配置pic32系列设备上的串行端口。初始化似乎在大多数情况下都有效,但我得到了垃圾数据来代替我写的前6个字符。但是,我注意到,如果我在初始化函数结束时添加任意长的等待,这就会消失。在初始化结束时是否需要等待一些寄存器标志?我的初始化代码如下。如果它有帮助,我将这个初始化基于pic32 reference manual中的UART部分。我也为我的传输功能添加了下面的代码。我的预期输出字符串是"来自引导加载程序代码的Hello。\ r \ n"但我得到的实际字节是:

00000000  00 00 aa b1 b1 bd 81 66  72 6f 6d 20 74 68 65 20  |.......from the |
00000010  62 6f 6f 74 6c 6f 61 64  65 72 20 63 6f 64 65 2e  |bootloader code.|
00000020  0d 0a


void initializeUART2()
{
    uint32 counter;
    initialized = TRUE;
    U2MODE = 0;
    U2STA = 0;
    U2BRG = 0;

    IEC1bits.U2TXIE = 0;
    IEC1bits.U2RXIE = 0;
    IEC1bits.U2EIE = 0;

    //disable UART transmission before config
    U2STA &= ~UART_TRANSMIT_ENABLED_STATUS_FLAG;

    //disable UART before config
    U2MODE &= ~UART_ENABLED_MODE_FLAG;

    RS232_RS485_TRIS=0; //set to output
    RS232_RS485=0; //select RS-232 mode on MAX3161

    //set baudrate BAUDRATE = CLOCK_FREQUENCY/(16*(U2BRG + 1))
    //solve for U2BRG value
    U2BRG = (UINT16)(((PERIPHERAL_CLOCK_FREQUENCY/UART2_BAUDRATE)/16)-1);

    //set mode to 8 bit no parity
    U2MODE &= ~UART_PARITY_DATA_MODE_BITS;

    //set number of stop bits to 1
    U2MODE &= ~UART_EXTRA_STOP_MODE_BIT_FLAG;

    //enable the UART port
    U2MODE |= UART_ENABLED_MODE_FLAG;

    //enable serial transmission
    U2STA |= UART_TRANSMIT_ENABLED_STATUS_FLAG;

    //without this loop, I get garbage in first 6 bytes of my first message
    counter = 1000;
    while(counter--);
}

void putUART2(uint32 value)
{
    if(!initialized)
    {
        initializeUART2();
    }

    //make sure value is in range of writable values
    value &= UINT32_MASK(8);

    //clear transmit interrupt flag
    IFS1bits.U2TXIF = 0;

    //wait for the transmit buffer to be empty
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0);

    //set the data byte to be written in the write register
    //also starts transmission
    U2TXREG = value;

    //wait for the transmit buffer to be empty
    //both of these waits are necessary to avoid missing bytes
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0);
}

2 个答案:

答案 0 :(得分:3)

将模式切换为RS232后,MAX3161需要至少100 ns才能稳定。

另外,这些行:

RS232_RS485_TRIS=0; //set to output
RS232_RS485=0; //select RS-232 mode on MAX3161

应该颠倒;设置输出,然后设置方向寄存器以避免毛刺。

答案 1 :(得分:2)

怀疑具有电荷泵的MAX3161芯片需要额外的时间才能达到稳定的工作电压。

可能只有一段时间或2,但如果过早发送消息,则串行输出会混乱,直到出现安静时间。

较小的候选人:问题是此与未发布的发送例程之间的交互。

注意:看到使用未发布的“垃圾数据”之类的信息可能会有所帮助,这真是令人惊讶。也知道“好”前6个字节左右有用。


[编辑] @Doug Currie走在正确的轨道上。

RS232_RS485_TRIS1更改为输出时,在发送数据之前需要建议的延迟时间。这适用于此处以及代码中的其他位置。

此外,在RS232_RS485_TRIS1更改为输入之前,代码需要确保所有数据都已完全传输。在PIC声明xmit缓冲区为空之后,这可能是10 /波特。或者在转动总线之前检查正确的xmit状态位。 (移位寄存器为空 - 名称因编译器而异。)