|
Прием по USART |
|
|
|
Aug 31 2018, 10:17
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Камень STM32F303CB.Принимаю данные Код void USART2_IRQHandler(void) { if ((USART2->ISR & USART_ISR_RXNE) != RESET) { uint8_t chr = USART2->RDR;
if (chr == '\r') { usart2_rx_buf[usart2_rx_idx] = '\0'; usart2_rx_idx = 0; usart2_rx_ready = 1; } else { if(usart2_rx_idx < RX2_BUFFERSIZE) //no overflow { usart2_rx_buf[usart2_rx_idx] = chr; usart2_rx_idx++; } else usart2_rx_overflow = 1; } } } после рисета первый раз я попадаю в условие USART2->ISR & USART_ISR_RXNE - в регистре ISR я вижу RXNE = 1. И все - все последующте разы я не захожу в условие так как RXNE = 0. В документации написано что при приеме данных в USART2->RDR флаг взводиться RXNE = 1 а при чтении из USART2->RDR - флаг очищается RXNE =0. Что я делаю не так? Еще такая проблема - я все время захожу в USART2_IRQHandler - даже когда размыкаю провод RX - хотя у меня включено только одно прерывание - по принятию - Код USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART2_IRQn);
Сообщение отредактировал Jenya7 - Aug 31 2018, 11:58
|
|
|
|
|
 |
Ответов
|
Sep 7 2018, 08:22
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
я отладил прием Код void USART2_IRQHandler(void) { uint8_t chr; uint32_t sr = USART2->ISR; if (sr & USART_ISR_RXNE) { chr = (uint16_t)(USART2->RDR); if (chr == '\r') { usart2_rx_buf[usart2_rx_idx] = '\0'; usart2_rx_idx = 0; usart2_rx_ready = 1; } else { if(usart2_rx_idx < RX2_BUFFERSIZE) //no overflow { usart2_rx_buf[usart2_rx_idx] = chr; usart2_rx_idx++; } else usart2_rx_overflow = 1; } } USART2->ICR = (uint16_t)~USART_FLAG_RXNE; } Проблема такая. Мастер посылает Код USART_SendBuf(USART2, "MBE\r", 4);
Delay_ms(100); И слейв принимает исправно. Но если убираю задержку - Delay_ms(100); слейв принимает как попало "МMBE\r" , "MBЕE\r" , "\0BЕE\r". Как можно улучшить прием? 10 мили - Delay_ms(10) - тоже работает нормально. меньше - ломается. нет Delay_ms(10) - тоже ломается.
Сообщение отредактировал Jenya7 - Sep 7 2018, 08:58
|
|
|
|
|
Sep 7 2018, 09:22
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(HardEgor @ Sep 7 2018, 15:10)  Так может у вас мастер(USART_SendBuf) сливает символы? - На последние биты последнего символа накладываются биты следующего символа. Хотя вроде "\r" нормально принимается.... или теряется вся предыдущая строка? А у вас случайно не RS485 полудуплекс? Я для отладки подключил напрямую пины MASTER_USART2_TX - SLAVE_USART2_RX MASTER_USART2_RX - SLAVE_USART2_TX Ставлю точку останова на стороне мастера - вижу четко уходит строка - никаких накладок. а если ставлю точку останова со стороны слейва, на строке usart2_rx_ready = 1; то вижу накладки. поставил скоп на MASTER_USART2_TX - выходящий пакет довольно красивый.
Сообщение отредактировал Jenya7 - Sep 7 2018, 09:32
|
|
|
|
|
Sep 7 2018, 09:49
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(HardEgor @ Sep 7 2018, 15:30)  На какое событие в передатчике вы ставите точку останова? Transmit data register empty или Transmission complete? передатчик работает по Transmission complete Код void USART_SendBuf(USART_TypeDef *USARTx, uint8_t *data, uint32_t size) { while (size--) { uint32_t timeout = USART_TIMEOUT; // wait until data register is empty while( !(USARTx->ISR & USART_FLAG_TC) ) {if(!timeout--) break; } USARTx->TDR = *data++; } }
|
|
|
|
Сообщений в этой теме
Jenya7 Прием по USART Aug 31 2018, 10:17 x893 Начните с примеров. Aug 31 2018, 10:31 Jenya7 Цитата(x893 @ Aug 31 2018, 15:31) Начните... Aug 31 2018, 10:33  x893 Цитата(Jenya7 @ Aug 31 2018, 13:33) скача... Aug 31 2018, 11:46   Jenya7 Цитата(x893 @ Aug 31 2018, 16:46) Тогда н... Aug 31 2018, 11:54    mcheb Цитата(Jenya7 @ Aug 31 2018, 15:54) мне и... Sep 1 2018, 04:05     Arlleex Цитата(mcheb @ Sep 1 2018, 08:05) Чтобы н... Sep 1 2018, 12:16 x893 Смысл простой - надо научиться самому искать ответ... Aug 31 2018, 12:19 Сергей Борщ QUOTE (Jenya7 @ Aug 31 2018, 13:17) Еще т... Aug 31 2018, 13:43     HardEgor Цитата(Jenya7 @ Sep 7 2018, 16:49) переда... Sep 7 2018, 13:14 Сергей Борщ QUOTE (Jenya7 @ Sep 7 2018, 11:22) 10 мил... Sep 7 2018, 14:39  jcxz Цитата(Сергей Борщ @ Sep 7 2018, 17:39) П... Sep 7 2018, 15:22  Jenya7 Цитата(Сергей Борщ @ Sep 7 2018, 20:39) П... Sep 8 2018, 14:48   Arlleex Цитата(Jenya7 @ Sep 8 2018, 17:48) эта ст... Sep 8 2018, 16:31   Сергей Борщ QUOTE (Jenya7 @ Sep 8 2018, 17:48) эта ст... Sep 8 2018, 18:32    Jenya7 Цитата(Сергей Борщ @ Sep 9 2018, 00:32) Т... Sep 9 2018, 05:04     Сергей Борщ QUOTE (Jenya7 @ Sep 9 2018, 08:04) если з... Sep 9 2018, 06:15      Jenya7 Цитата(Сергей Борщ @ Sep 9 2018, 12:15) У... Sep 9 2018, 07:21       Сергей Борщ QUOTE (Jenya7 @ Sep 9 2018, 10:21) У меня... Sep 9 2018, 08:20       Arlleex Цитата(Jenya7 @ Sep 9 2018, 10:21) У меня... Sep 9 2018, 09:59        Jenya7 Цитата(Arlleex @ Sep 9 2018, 15:59) 4 - э... Sep 9 2018, 10:08         Arlleex Цитата(Jenya7 @ Sep 9 2018, 13:08) а что ... Sep 9 2018, 12:27          Jenya7 Цитата(Arlleex @ Sep 9 2018, 18:27) А, не... Sep 9 2018, 12:49           Arlleex Цитата(Jenya7 @ Sep 9 2018, 15:49) USART_... Sep 9 2018, 12:57            Jenya7 Цитата(Arlleex @ Sep 9 2018, 18:57) Чему ... Sep 9 2018, 13:17 Сергей Борщ QUOTE (Jenya7 @ Sep 9 2018, 15:49) кстати... Sep 9 2018, 14:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|