kan35 0 May 21 Posted May 21 · Report post Уважаемые коллеги, столкнулся с такой простой задачей и в силу того, что я новичок - не могу понять в чем проблема. К порту 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 на вход. Или что то не доделал, а что?.. С примерами в интернете довольно сложно по этому чипу... Заранее спасибо за подсказки! Quote Share this post Link to post Share on other sites More sharing options...
Plain 70 May 22 Posted May 22 · Report post Цитата 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. Quote Share this post Link to post Share on other sites More sharing options...
siargy 2 May 22 Posted May 22 · Report post неплохо бы еще и бит ошибки проверить 1 Quote Share this post Link to post Share on other sites More sharing options...
kan35 0 May 22 Posted May 22 (edited) · Report post Написал комментарии к инициализационному коду, чтобы выглядело опрятнее: 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 - передача в модем. Edited May 22 by kan35 Quote Share this post Link to post Share on other sites More sharing options...
Plain 70 May 22 Posted May 22 · Report post 16 минут назад, kan35 сказал: Ошибки я тоже тестирую А где их сброс? Надо передёргивать CREN. Quote Share this post Link to post Share on other sites More sharing options...
kan35 0 May 22 Posted May 22 · Report post 2 minutes ago, Plain said: А где их сброс? Надо передёргивать CREN. Пока для упрощения я просто пытаюсь поймать хотя бы срабатывание. Вообще, изначально я прерывание сделал. Но оно не работало, и начал разбираться что происходит и такой простейший код написал. RX и TX тоже пробовал замыкать (модем выключал) - тоже ничего. Quote Share this post Link to post Share on other sites More sharing options...
Plain 70 May 22 Posted May 22 · Report post Ещё отсутствует ANSEL3=0. 1 Quote Share this post Link to post Share on other sites More sharing options...
kan35 0 May 22 Posted May 22 · Report post 17 minutes ago, Plain said: Ещё отсутствует ANSEL3=0. О, спасибо, поймал байт!!! я про этот регистр и не знал, кстати на TX это не влияет почему-то. Всем огромнейшее спасибо за помощь, два дня потерял на поиски (думал, что в SPP что-то не так делаю), прежде чем спросить, и уже собирался перепаивать мк. Quote Share this post Link to post Share on other sites More sharing options...
quark 28 May 22 Posted May 22 · Report post 46 минут назад, kan35 сказал: я про этот регистр и не знал, кстати на TX это не влияет почему-то. Не влияет потому, что TX настроен на выход, RX - на вход. Выходы порта всегда работают в цифровом режиме, независимо от регистра ANSEL. Входы порта работают либо в аналоговом, либо в цифровом режиме. Режим работы входов задается в регистре ANSEL. P.S. Не смотря на то, что TX используется как выход, его вход, тоже, нужно сделать цифровым: ANSEL2=0 . 1 Quote Share this post Link to post Share on other sites More sharing options...
Plain 70 May 22 Posted May 22 · Report post Проще закрепить это знание пониманием, что на вход КМОП инвертора можно подавать только два "цифровых" напряжения, потому что при аналоговом напряжении включаются оба его транзистора и он получает полное право выгореть от сквозного тока, и/или поджарить что-то рядом на кристалле, и в случае КМОП триггера Шмитта, который, наоборот, рассчитан на такие напряжения, лишь чуть лучше — создаваемая им существенная добавка к току питания МК изменяется нелинейно, а также есть ёмкостное влияние его выхода на вход. Разумеется удобно, когда при сбросе выводы оказываются в аналоговом режиме и поэтому их можно никуда не разводить жёстко, но не в каждом первом МК аналоговые входы навешаны на все выводы, и начинающий народ периодически жалуется, что заявленный как нанопотребляющий МК совсем не такой. 1 Quote Share this post Link to post Share on other sites More sharing options...