UART RX не работает на PIC16F1704

У меня есть UART TX, работающий на одном изображении, но не могу заставить UART RX работать на другом PIC. Мой план состоит в том, чтобы первый PIC отправлял данные второму PIC.

Мой код инициализации для первого PIC TX:

Код:

void configure_TX_port(){
    /*Port configurations*/
    OSCCON = 0X68;
    //Push button
    TRISC3 = 1;
    INLVLC3 = 0;
    ANSC3 = 0;
    //Led output
    TRISC2 = 0;
    //TX output
    TRISA2 = 0;   
    ANSA2 = 0;

    /*PPS setup for RA2*/
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCK = 0;
    RA2PPS = 0x14;
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCK = 1;

    /*UART configuration*/
    TXEN = 1;
    SYNC = 0;
    SPEN = 1;

    TXSTA = (0x4|0x20);
    SPBRG = (int)(4000000L/(16UL * 9600) -1);
}

Мои данные отправки в код tx

Код:

void putch(unsigned char byte) {
    /* output one byte */
    while (!TXIF) /* set when register is empty */

    TXREG = byte;
}

Мой код инициализации для второго PIC RX:

void configure_RX_port(){
    /*Port configurations*/
    OSCCON = 0X68;
    //Led output
    TRISC3 = 0;
    //RX input
    TRISC5 = 1;
    ANSC5 = 0;

    /*UART configuration*/
    CREN = 1;
    SYNC = 0;
    SPEN = 1;
    TXSTA = (0x4|0x20);
    RCSTA = 0x90;
    SPBRG = (int)(4000000L/(16UL * 9600) -1);
}

Мой код получения данных,

unsigned char getch(void) {
    /* retrieve one byte */
    unsigned char ret;
    while (!RCIF) {  /* set when register is not empty */
    }
    ret = RCREG;
    return ret;
}

Когда я отлаживаю код, функция getch блокируется в ожидании символа, но мой другой PIC отправляет данные. На этом PIC RC5 назначен контакт RX, поэтому я не думаю, что мне нужно делать какую-либо конфигурацию pps.

Рахул


person rudasi    schedule 03.07.2014    source источник
comment
Вы включили прерывания? Если бы можно было включить больше деталей, таких как инициализация и т. Д., Кто-нибудь получил бы больше понимания.   -  person Ruslan Gerasimov    schedule 03.07.2014
comment
прерывания в этом случае не требуются для чтения регистров RCIF и TXIF, они устанавливаются независимо.   -  person rudasi    schedule 03.07.2014


Ответы (4)


TX1STA = 0b00100100; This enablex TX (TXEN=1) and high baud rate (BRGH = 1)

RC1STA = 0b10000000; This enable the serial port (SPEN = 1)

Единственная важная недостающая часть — это настройка часов и скорость передачи данных, которую вы хотите иметь.

Я видел в формуле 4000000, что означает 4 МГц, и /9600, поэтому предположим, что 9600BDS).

Результат = 0x25.

SPBRGL = 0x25; 

SPBRGH = 0;

Таким образом, ваш TX должен работать. Ваша функция tx хороша.

Обязательно настройте контакты RX и TX как ЦИФРОВЫЕ, отключив ANSELA, ANSELB и ANSELC. Ваш PIC также использует PPS, поэтому обязательно настройте его правильно.

*********ОТРЕДАКТИРОВАНО, УСЛОВИЯ ПОЛУЧЕНИЯ************

Единственная разница здесь, чтобы получить работающий приемник, состоит в том, чтобы включить непрерывный бит приемника, CREN.

RC1STA = 0b10010000; //Enable serial port(SPEN) and continuous receive(CREN).

Обязательно установите вывод RX (в вашем случае RC5) в качестве ВХОДА (TRISC5 = 1), чтобы он мог считывать любые входящие данные. Вам также следует рассмотреть возможность выполнения процедуры прерывания вместо опроса бита флага приемника. Таким образом, вы точно не пропустите вводимые данные.

person Jean-francois    schedule 03.07.2014
comment
Пожалуйста, посмотрите мой измененный код, я не уверен, правильно ли я использую PPS uart, я разблокирую pps, устанавливаю RA2PPS в качестве порта tx, а затем блокирую pps. Я также установил все соответствующие контакты на цифровые. - person rudasi; 03.07.2014
comment
Единственная разница здесь, чтобы получить работающий приемник, состоит в том, чтобы включить непрерывный бит приемника, CREN. RC1STA = 0b10010000; // Включить последовательный порт (SPEN) и непрерывный прием (CREN). Обязательно установите контакт RX (в вашем случае RC5) в качестве ВХОДА (TRISC5 = 1), чтобы он мог считывать любые входящие данные. Вам также следует рассмотреть возможность выполнения процедуры прерывания вместо опроса бита флага приемника. Таким образом, вы точно не пропустите вводимые данные. - person Jean-francois; 04.07.2014
comment
Спасибо за ваш ответ, ваш ответ такой же, как у меня в моем отредактированном коде. Мне было интересно, нужно ли устанавливать регистры TXSTA и RCSTA (для установки битов) или, например, значение CREN можно установить явно? - person rudasi; 05.07.2014
comment
Обычно настройка регистров будет проще для вас, так как вы не будете пропускать какой-либо конкретный бит (например, TXEN в TXSTA), я всегда делал это таким образом, и в большинстве случаев легче отлаживать сразу после того, как вы видите значение вы сделали запись в регистр, и вы можете положиться на таблицу данных, чтобы увидеть, подходит ли это значение для ваших желаемых операций. В вашей процедуре приема UART немного опросите светодиод, подключенный к этому порту, чтобы увидеть, есть ли там какая-либо активность. Вы используете 2 одинаковых фото? Та же скорость передачи данных? Может быть, у вас включено прерывание, и оно там застряло? - person Jean-francois; 07.07.2014

По умолчанию при сбросе все выводы на PIC16F1704 устанавливаются как аналоговые. Поэтому очистите соответствующие биты контактов RX и TX в регистрах ANSELA, ANSELB и ANSELC, чтобы установить их как цифровые.

person GJ.    schedule 03.07.2014
comment
Я установил соответствующие контакты на цифровые, проблема все еще сохраняется. - person rudasi; 03.07.2014

Похоже, вы используете асинхронный режим с SYNC = 0, но не устанавливаете TXEN = 1.

Настройка CREN = 1 имеет приоритет только над TXEN в синхронном режиме. Попробуйте установить TXEN = 1.

person uncleO    schedule 03.07.2014
comment
Я использую SYNC = 0 для асинхронного режима. - person rudasi; 03.07.2014
comment
У меня есть часть TX, работающая с приведенным выше кодом, см. Редактирование, теперь у меня проблемы с кодом RX на отдельной PIC. Идея в том, что первый PIC будет отправлять данные второму PIC. Спасибо. - person rudasi; 03.07.2014

Я добавил следующую строку: TXSTA = (0x4|0x20); к коду PIC приемника, и теперь он работает. Нет необходимости в

CREN = 1;
SYNC = 0;
SPEN = 1;

как его установка тех же битов.

person rudasi    schedule 03.07.2014