реклама на сайте
подробности

 
 
> Прием по USART
Jenya7
сообщение Aug 31 2018, 10:17
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Jenya7
сообщение Sep 7 2018, 08:22
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Sep 7 2018, 09:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Sep 7 2018, 15:22) *
Delay_ms(100);[/code]И слейв принимает исправно. Но если убираю задержку - Delay_ms(100); слейв принимает как попало "МMBE\r" , "MBЕE\r" , "\0BЕE\r". Как можно улучшить прием?

Так может у вас мастер(USART_SendBuf) сливает символы? - На последние биты последнего символа накладываются биты следующего символа. Хотя вроде "\r" нормально принимается.... или теряется вся предыдущая строка?
А у вас случайно не RS485 полудуплекс?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 7 2018, 09:22
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Sep 7 2018, 09:30
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Sep 7 2018, 16:22) *
Ставлю точку останова на стороне мастера - вижу четко уходит строка - никаких накладок. а если ставлю точку останова со стороны слейва, на строке usart2_rx_ready = 1; то вижу накладки.

На какое событие в передатчике вы ставите точку останова? Transmit data register empty или Transmission complete?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 7 2018, 09:49
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 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++;
  }
}

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 10:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016