我正在编写代码以配置PIC32家庭设备上的串行端口。初始化似乎在大多数情况下工作,但是我获得了垃圾数据代替我编写的前6个字符。但是,我注意到,如果我在初始化函数的末尾任意添加任意漫长的等待,那就消失了。在初始化结束时,我需要等待一些寄存器标志吗?我的初始化代码在下面。如果有所帮助,我将根据PIC32参考手册中的UART部分的初始化为基础。我还为传输功能添加了下面的代码。我的预期输出字符串是" bootloader代码的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);
}
MAX3161至少需要100 ns才能在切换到RS232后稳定。
另外,这些行:
RS232_RS485_TRIS=0; //set to output
RS232_RS485=0; //select RS-232 mode on MAX3161
应该颠倒;设置输出,然后设置方向寄存器以避免故障。
怀疑具有电荷泵的Max3161芯片需要额外的时间才能达到稳定的操作电压。
可能只有一点点时间或2个时间,但是如果消息发送得太早,则串行输出会混乱直到发生安静的时间为止。
较小的候选人:问题是此与未张贴的发送例程之间的交互。
注意:令人惊讶的是,如何使用未验证的"垃圾数据"之类的信息可能会有所帮助。还知道"好"前6个字节左右是有用的。
[edit] @Doug Currie在正确的轨道上。
当RS232_RS485_TRIS1
更改为输出时,在发送数据之前需要延迟时间。这适用于这里以及代码中的其他位置。
此外,在将RS232_RS485_TRIS1
更改为输入之前,代码需要确保所有数据已完全传输。PIC声明XMIT缓冲区空之后,这可能是10/baud。或者在扭转公共汽车之前检查正确的XMIT状态位。(移位寄存器空 - 名称根据编译器而变化。)