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

 
 
> UART2 на STM32F100C4 сплошные глюки :')
Bob176
сообщение Aug 28 2012, 07:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870




Не могу понять в чём дело.. процессор STM32F100C4 инициализирую при помощи файла STM32_Init.c
пытаюсь принять и передать байты по прерываниям...

принимать удаётся, только все принятые данные почему то смещены на 0х80
т.е. если передается
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.

а вот передать через прерывание вообще не получается...
точнее .. если не через прерывания, то байт передаётся.. правда данные искажены..
если ставлю галочку в мастере TXE Interrupt Enable , по вообще всё виснет

помогите разобраться



инициализирую теперь так:
Код
                    void USART_configuration(void)
{
  //Включение тактирования
  RCC->APB2ENR |=   RCC_APB2ENR_IOPAEN;                //Тактирование GPIO
  RCC->APB2ENR |=   RCC_APB2ENR_AFIOEN;                //Тактирование альтернативных функций GPIO
  RCC->APB1ENR |=   RCC_APB1ENR_USART2EN;              //Тактирование USART2
  //Конфигурирование PORTA.2 для TX; PORTA.3 для RX
      GPIOA->CRL   &= ~(0xFFUL  << 8);                      // Clear PA2, PA3
      GPIOA->CRL   |=  (0x0BUL  << 8);                      // USART2 Tx (PA2)  alternate output push-pull
      GPIOA->CRL   |=  (0x04UL  << 12);                     // USART2 Rx (PA3)  input floating

  //Задание режима работы
  USART2->BRR   =   0x0341;                            //Cкорость обмена 9600 бод
  USART2->CR1  &=  ~USART_CR1_M;                       //8 бит данных
  USART2->CR2  &=  ~USART_CR2_STOP;                    //Предочистка числа стоп-битов
  USART2->CR2  |=   USART_CR2_STOP_0;                  //Количество стоп-битов: 2
  //Управление работой
  USART2->CR1  |=   USART_CR1_UE;                      //Включение модуля USART2
  USART2->CR1  |=   USART_CR1_TE;                      //Включение передатчика
  USART2->CR1  |=   USART_CR1_RE;                      //Включение приемника
  //Разрешить прерывания
  //NVIC_EnableIRQ (USART2_IRQn);                        //Прерывания USART2
  // USART2->CR1  |= USART_CR1_TCIE;                      //Прерывание по завершении передачи
  USART2->CR1  |= USART_CR1_RXNEIE;                    //Прерывание по завершении приема
NVIC->ISER[1]  = (1 << (USART2_IRQn & 0x1F));   // enable interrupt

  USART_ITConfig(USART2, USART_IT_TC, DISABLE);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);


прерывание

Код
           void USART2_IRQHandler(void)
{                  
  volatile unsigned int IIR;
    
       IIR = USART2->SR;

if(IIR & USART_IT_RXNE)  
   {
   USART2->SR &= ~USART_IT_RXNE;              // clear interrupt
    
        if(usart2.rxcnt>(BUF_SZ-2))    usart2.rxcnt=0;
              
    usart2.buffer[usart2.rxcnt++] =  USART_ReceiveData (USART2);

                  
        usart2.delay=0;

if(usart2.rxcnt>7)usart2.rxgap=1;       // принял всю посылку
    }


ф-я маin

Код
stm32_Init ();       // STM32 setup

USART_configuration();
while (1)
  {      
    if(usart2.rxgap==1)                        
      {        
        //   if (usart2.buffer[0]==129)
          // {      
                GPIOB->BSRR = GPIO_Pin_1; // передача        
    
//       rx_Data=usart2.buffer[1];


        //USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
        // USART_ITConfig(USART2, USART_IT_TC, ENABLE);
            Delay(100);
    
            USART_SendData(USART2, 1);

               
       usart2.rxcnt=0;
       usart2.rxtimer=0;
       usart2.delay=0;
       usart2.rxgap=0;
   GPIOB->BRR = GPIO_Pin_1;
      }


приём остался таким же
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.

а при передаче байта отправляется мусор !!!

и тоже если в конфигурации разрешить
USART2->CR1 |= USART_CR1_TCIE; //Прерывание по завершении передачи
то уже ничего не принимает ... похоже висит.


посоветуйте, что проверить? как ещё настроить?

осциллографом смотрел, битики при передаче бегут rolleyes.gif до ST485 доходят crying.gif
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
scifi
сообщение Aug 29 2012, 13:40
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Aug 29 2012, 16:50) *
У вас в коде есть строчка
(void)USART_DR;
Как это работает?

Прочитать регистр и выкинуть результат. Можно просто "USART_DR;", но приведение к void нагляднее. Где-то читал статейку, где это разжёвано. Если найду, приложу ссылку. Читал стандарт C99 - да, всё путём, так и должно работать, хотя кому-то покажется странным.

Update:
Вот интересная статья на эту тему. Краткое содержание: по стандарту Си код должен работать, но на практике он работает не со всеми компиляторами. По стандарту Си++ - вообще какой-то туман, и поведение компиляторов различается ещё сильнее.
Получается, что если рассчитывать не на сферический компилятор в вакууме, которые следует стандарту до последней запятой, а на обычные глючные компиляторы, то лучше использовать более развёрнутую конструкцию с присвоением значения временной переменной.
Go to the top of the page
 
+Quote Post
sidy
сообщение Aug 29 2012, 14:20
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Т.е. если Вы находитесь в режиме передачи, но что-то приняли то таким образом очищаете принятые данные?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2012, 14:26
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(sidy @ Aug 29 2012, 18:20) *
Т.е. если Вы находитесь в режиме передачи, но что-то приняли то таким образом очищаете принятые данные?

В коде это видно: если в приёмном буфере нет места, то выбросить принятый байт. Это нештатная ситуация.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2012, 14:39
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Aug 29 2012, 16:40) *
Краткое содержание: по стандарту Си код должен работать, но на практике он работает не со всеми компиляторами. По стандарту Си++ - вообще какой-то туман, и поведение компиляторов различается ещё сильнее.
Получается, что если рассчитывать не на сферический компилятор в вакууме, которые следует стандарту до последней запятой, а на обычные глючные компиляторы, то лучше использовать более развёрнутую конструкцию с присвоением значения временной переменной.

Спасибо. В-общем, "Не надо, как лучше. Надо, как положено." (с)
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 29 2012, 21:05
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(SSerge @ Aug 28 2012, 12:49) *
Зря Вы в обработчике прерываний USART_IT_RXNE используете, эти ..... его очень оригинально определили.
И он нифига не совпадает ни с USART_SR_RXNE ни с USART_FLAG_RXNE.


спасибо, SSerge теперь не зависает, хотя передача пока так и не работает crying.gif

.. разбираюсь дальше...


ну вот laughing.gif уже лучше!!!

данные передаются только ..... как и прежде

передаю 1 - принимаю 129 (0х81)
передаю 2 - принимаю 130 (0х82)
передаю 3 - принимаю 131 (0х83)
...

при передаче
передаю несколько байт значения 129 а принимает терминал то как 129 (0x81), то как 1 (0x80) !!!

что подскажете?

Сообщение отредактировал Bob176 - Aug 29 2012, 21:07
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Aug 29 2012, 23:02
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата(Bob176 @ Aug 30 2012, 01:05) *
данные передаются только ..... как и прежде

передаю 1 - принимаю 129 (0х81)
передаю 2 - принимаю 130 (0х82)
передаю 3 - принимаю 131 (0х83)
...

при передаче
передаю несколько байт значения 129 а принимает терминал то как 129 (0x81), то как 1 (0x80) !!!

что подскажете?


USART2->CR2 |= USART_CR2_STOP_0; //Количество стоп-битов: 2
Как то странно выглядет. Может все же ..._STOP_2 ?
Хотя в ST-эшной библиотеке на F0 все еще прикольней выглядет:
#define USART_StopBits_2 ((uint32_t)USART_CR2_STOP_1)
sm.gif



Сообщение отредактировал vlad_new - Aug 29 2012, 23:39
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 30 2012, 06:36
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(vlad_new @ Aug 30 2012, 02:02) *
#define USART_StopBits_2 ((uint32_t)USART_CR2_STOP_1)

biggrin.gif biggrin.gif biggrin.gif

вечером проверю, хотя... думаю дело не в этом. Надо посмотреть подтяжку у TX & RX
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 30 2012, 18:18
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870




мнда... и всё же паритет!!! rolleyes.gif


всем спасибо bb-offtopic.gif



Сообщение отредактировал Bob176 - Aug 30 2012, 18:19
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 17 2012, 18:59
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



ещё одна проблемка нарисовалась...

до скорости обмена 9600 всё работает хорошо. и принимаю и передаю как надо, а вот если увеличиваю скорость обмена, то принимается всё корректно, а при передаче передаётся ещё один ненужный байт!

скорость 9600
Send: 01-04-00-01-00-01-60-0A (8 bytes)
Recv: 01-04-02-65-64-93-8B (7 bytes)
Error: NONE; Data = 65-64; Time: 46

скорость 19200
Send: 01-04-00-01-00-01-60-0A (8 bytes)
Recv: 01-04-02-65-64-93-8B-FF (8 bytes)
Error: CRC+LENGTH; Data = NOT DETECTED; Time: 46

может кто чего подскажет? где копать?

Сообщение отредактировал Bob176 - Sep 17 2012, 19:00
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 17 2012, 19:04
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Bob176 @ Sep 17 2012, 21:59) *
где копать?
В программе. 115200, 9600, 57600 - полет нормальный.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 17 2012, 19:06
Сообщение #26


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Bob176 @ Sep 17 2012, 21:59) *
до скорости обмена 9600 всё работает хорошо

импульс, коорый воспринимается как старт-бит?
А что у Вас за схема по RS-у ?
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 18 2012, 10:06
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(_Pasha @ Sep 17 2012, 23:06) *
импульс, коорый воспринимается как старт-бит?

это одиночная посылка

Цитата(_Pasha @ Sep 17 2012, 23:06) *
что у Вас за схема по RS-у ?


оптопары, управление потоком через транзистор инвертируется.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 18 2012, 10:16
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Bob176 @ Sep 18 2012, 14:06) *
оптопары, управление потоком через транзистор инвертируется.

А скорострельность оптопары?? Чтобы 115200 проходило нужно тщательно отбирать оптопары. Типовое время отклика 18-20мкс, а это уже соизмеримо с длительностью импульса на 115200.
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 18 2012, 10:39
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(Bob176 @ Sep 17 2012, 22:59) *
может кто чего подскажет? где копать?

а на чем без кода гадать?
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 18 2012, 11:05
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(DmitryM @ Sep 18 2012, 14:16) *
А скорострельность оптопары?? Чтобы 115200 проходило нужно тщательно отбирать оптопары. Типовое время отклика 18-20мкс, а это уже соизмеримо с длительностью импульса на 115200.

оптопары скорострельные H11L1

Цитата
а на чем без кода гадать?

мне идея нужна...

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 00:23
Рейтинг@Mail.ru


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