PIC32 UART отправляет символы мусора после инициализации

Я пишу код для настройки последовательного порта на устройстве семейства pic32. Похоже, что инициализация работает по большей части, но я получаю данные мусора вместо первых 6 символов, которые я пишу. Однако я заметил, что если я добавлю сколь угодно долгое ожидание в конце функции инициализации, это исчезнет. Есть ли какой-то флаг регистрации, который мне нужно дождаться в конце моей инициализации? Мой код инициализации ниже. Если это помогает, я основываю эту инициализацию на разделе UART в pic32 справочное руководство. Я также добавил приведенный ниже код для своей функции передачи. Моя ожидаемая строка вывода - «Привет из кода загрузчика. \ 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);
}

person S E    schedule 05.02.2014    source источник
comment
Тот факт, что циклический цикл - это все, что вам нужно для стабилизации данных, должен немедленно указывать на то, что происходит какое-то нарастание или стабилизация с повышением-понижением.   -  person RufusVS    schedule 25.11.2020


Ответы (2)


MAX3161 требуется не менее 100 нс для стабилизации после переключения режимов на RS232.

Также эти строки:

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

следует поменять местами; установите выход, затем регистр направления, чтобы избежать сбоев.

person Doug Currie    schedule 05.02.2014
comment
что вы знаете, я перевернул заказ и добавил задержку в 1 микросекунду, и он работает отлично. Благодарность - person S E; 05.02.2014

Подозреваю, что микросхеме MAX3161, у которой есть насосы заряда, требуется дополнительное время для достижения стабильных рабочих напряжений.

Это может быть только время бита или 2, но если сообщение отправлено слишком рано, последовательный вывод будет нарушен до тех пор, пока не наступит время тишины.

Меньший кандидат: проблема заключается во взаимодействии между этим и процедурой неопубликованной отправки.

Примечание. Удивительно, как использование такой информации, как неопубликованные «данные мусора», может помочь. Также полезно знать, какие «хорошие» первые 6 байтов или около того.


[Edit] @Doug Currie находится на правильном пути.

Когда RS232_RS485_TRIS1 изменяется на вывод, требуется время задержки, как он предлагает, перед отправкой данных. Это применимо как здесь, так и к другому месту в коде.

Кроме того, прежде чем RS232_RS485_TRIS1 будет изменен на ввод, код должен гарантировать, что все данные полностью переданы. Это может быть 10 / бод после того, как PIC объявит буфер xmit пустым. Или проверьте правильный бит состояния xmit перед тем, как развернуть шину. (Сдвиговый регистр пуст - имена меняются в зависимости от компилятора.)

person chux - Reinstate Monica    schedule 05.02.2014
comment
S E Спасибо за размещение данных. Я надеюсь, что вместе с @Doug Currie у вас есть решение. Подождите 1) для стабилизации системы при включении питания и 2) подождите после включения вывода (потенциально несколько мест в коде) и 3) подождите до отключение вывода. (возможно несколько мест в коде) - person chux - Reinstate Monica; 05.02.2014