Перейти к содержанию
    

PIC18F67J94 Не удается настроить UART1_RX

Уважаемые коллеги, 

столкнулся с такой простой задачей и в силу того, что я новичок - не могу понять в чем проблема. К порту USART1 подключен модем. Передавать данные получилось довольно легко, а вот с приемом - никак. Настроил скорость - 115200, выдаю AT\r, в ответ летит ОК\r.

И вот тут дальше - ни в какую.  Инизиализиру так:

    TRISAbits.TRISA3 = 1;           // RX as input
    RPINR0_1 &= 0xF0;               // write 0 to [3:0], RP3 to USART1_RX
    RCSTA1 = 0; // reset unwanted bits
    RCSTA1bits.SPEN = 1;
    RCSTA1bits.RX9 = 0;
    RCSTA1bits.CREN = 1;
Далее в цикле передачи проверяб флаг заполнености буфера приемника

if (PIR1bits.RC1IF)
        {//И никогда сюда не попадаю.

Анализатором на ножке данные вижу, они точно там есть и с ними все в порядке. Но флаг не взводится.

Такое подозрение, что я неправильно как то сконфигурировал SPP_Lite на вход. Или что то не доделал, а что?..

С примерами в интернете довольно сложно по этому чипу...

Заранее спасибо за подсказки!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

Receive Overrun Error
The receive FIFO buffer can hold two characters. An overrun error will be generated if a third character, in its entirety, is received before the FIFO is accessed. When this happens the OERR bit of the RC1STA register is set. The characters already in the FIFO buffer can be read but no additional characters will be received until the error is cleared.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал комментарии к инициализационному коду, чтобы выглядело опрятнее:

unsigned short ulBaud;
    unsigned char dummy_byte;

	/* Calculate the baud rate generator constant.
	SPBRG = ( (FOSC / Desired Baud Rate) / 4 ) - 1 */
	ulBaud = (unsigned short)(48000000l / ulWantedBaud);
	ulBaud /= ( unsigned short ) 4;
	ulBaud -= ( unsigned short ) 1;
    
    // IO pins setup
    TRISAbits.TRISA3 = 1;   // RX as input
    TRISAbits.TRISA2 = 0;   // TX as output

    // baudrate init
    BAUDCON1 = 0;           // reset unwanted bits
    BAUDCON1bits.BRG16 = 1; // 16 bit BRR
    BAUDCON1bits.RXDTP = 0; // normal polarity for direct shifter switch
    SPBRG1 = ulBaud;        // BR low byte
    SPBRGH1 = ulBaud>>8;    // BR high byte
    
    // SPP-Lite setup
    //RPINR0_1 &= 0xF0;             // write 0 to [3:0], RP3 to USART1_RX
    RPINR0_1bits.U1RXR = 0;
    //RPOR2_3 = (RPOR2_3&0xF0)|0x01;  // RP2 to USART1_TX
    RPOR2_3bits.RPO2R = 0x1;
    
    // TX serup
    TXSTA1 = 0;             // reset unwanted bits
    TXSTA1bits.TX9 = 0;     // 9th bit disable
    TXSTA1bits.TXEN = 1;    // transmitter enable
    TXSTA1bits.SYNC = 0;    // anync mode
    TXSTA1bits.BRGH = 1;    // high baud rate enable
    
    //RC setup
    RCSTA1 = 0;             // reset unwanted bits
    RCSTA1bits.SPEN = 1;    // UART enable
    RCSTA1bits.RX9 = 0;     // 9th bit disable
    RCSTA1bits.CREN = 1;    //continues receive mode
    
    // Interrupt setup
//  IPR1bits.RC1IP = 0;   //serLOW_PRIORITY;
//  PIE1bits.RC1IE = 1;
    
//	IPR1bits.TX1IP = 0;     //serLOW_PRIORITY;
//    PIE1bits.TX1IE = 1;

Ошибки я тоже тестирую:

while(1)
    {
        uart_send_string(line_at);
        //uart_send_data(line_at, 4);
        vTaskDelay(100);
        if (PIR1bits.RC1IF)
        {
            while(1)
            {
                Blink();
                vTaskDelay(500);
            }
        }
        if (RCSTA1bits.FERR || RCSTA1bits.OERR)
        {
            while(1)
            {
                Blink();
                vTaskDelay(50);
            }
        }
    }

В этом цикле постоянно отправляется AT\r\n, в ответ модем сыпет ОК. Обе линии я проверяю виртуальным компортом и в терратерме вижу это всё хорошо.

То есть такое ощущение складывается, как будто в UART вообще ничего не залетает.

Еще, я не уточнил ранее подключение, модем подключен к линиям RA3 - прием,  RA2 - передача в модем.

Изменено пользователем kan35

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, kan35 сказал:

Ошибки я тоже тестирую

А где их сброс? Надо передёргивать CREN.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Plain said:

А где их сброс? Надо передёргивать CREN.

Пока для упрощения я просто пытаюсь поймать хотя бы срабатывание. Вообще, изначально я прерывание сделал. Но оно не работало, и начал разбираться что происходит и такой простейший код написал. RX и TX тоже пробовал замыкать (модем выключал) - тоже ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, Plain said:

Ещё отсутствует ANSEL3=0.

О, спасибо, поймал байт!!! я про этот регистр и не знал, кстати на TX это не влияет почему-то. 

Всем огромнейшее спасибо за помощь, два дня потерял на поиски (думал, что в SPP что-то не так делаю), прежде чем спросить, и уже собирался перепаивать мк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 минут назад, kan35 сказал:

я про этот регистр и не знал, кстати на TX это не влияет почему-то. 

Не влияет потому, что TX настроен на выход, RX - на вход.
Выходы порта всегда работают в цифровом режиме, независимо от регистра ANSEL.
Входы порта работают либо в аналоговом, либо в цифровом режиме.
Режим работы входов задается в регистре ANSEL.

P.S. Не смотря на то, что TX используется как выход, его вход, тоже, нужно сделать цифровым: ANSEL2=0 .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проще закрепить это знание пониманием, что на вход КМОП инвертора можно подавать только два "цифровых" напряжения, потому что при аналоговом напряжении включаются оба его транзистора и он получает полное право выгореть от сквозного тока, и/или поджарить что-то рядом на кристалле, и в случае КМОП триггера Шмитта, который, наоборот, рассчитан на такие напряжения, лишь чуть лучше — создаваемая им существенная добавка к току питания МК изменяется нелинейно, а также есть ёмкостное влияние его выхода на вход.

Разумеется удобно, когда при сбросе выводы оказываются в аналоговом режиме и поэтому их можно никуда не разводить жёстко, но не в каждом первом МК аналоговые входы навешаны на все выводы, и начинающий народ периодически жалуется, что заявленный как нанопотребляющий МК совсем не такой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...