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

 
 
> 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
Ответов (30 - 38)
MBR
сообщение Sep 18 2012, 11:34
Сообщение #31


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

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



Цитата(Bob176 @ Sep 18 2012, 15:05) *
мне идея нужна...

Ну, не хотите по существу, я тоже в абстракцию уйду sm.gif Идея проста - написание своих велосипедов без достаточно вдумчивого чтения манов чревато глюками и потерянным временем sm.gif
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 18 2012, 12:20
Сообщение #32


Участник
*

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



Цитата(MBR @ Sep 18 2012, 15:34) *
Ну, не хотите по существу, я тоже в абстракцию уйду sm.gif Идея проста - написание своих велосипедов без достаточно вдумчивого чтения манов чревато глюками и потерянным временем sm.gif

уважаемый MBR вы считаете проблема в коде? в инициализации? в прерывании? в начале поста я выкладывал исходники.. особенно в них ничего не поменялось... данные принимаются верно, значит скорость задана правильно, на низкой частоте все работает корректно... что может привести к тому, что на высокой частоте передаётся ещё один байт мне пока не понятно ... , вот и интересуюсь, может кто уже сталкивался с такой проблемой... или натолкнёт идейкой на решение ..
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 18 2012, 12:44
Сообщение #33


Гуру
******

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



Цитата(Bob176 @ Sep 18 2012, 16:20) *
или натолкнёт идейкой на решение ..

Есть идейка: потыкайте осциллографом вашу схему. К тому же вы упоминали про полудуплекс: вдруг при переключении режима приём-передача на линии образуется выброс? Ну и вообще полезно убедиться, что проблема не в железе, прежде чем нырять в софт.
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 18 2012, 12:56
Сообщение #34


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

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



Цитата(Bob176 @ Sep 18 2012, 16:20) *
в начале поста я выкладывал исходники.. особенно в них ничего не поменялось...

Там была ссылка на нерабочий вариант.

scifi, скорее всего, прав насчет полудуплекса. Правильная логика отправки должна быть следующая: разрешаем TXE, делаем отправку. После отправки последнего байта в обработчике запрещаем TXE, разрешаем TC. И только когда снова придем в обработчик TC - запрещаем TC и трансмиттер.

Но Ваша лень сделать копипасту превращает это лишь в предположения. Я могу дать ссылку на мой рабочий исходник с полудуплексом для F2 - там разница лишь в установке baud rate, при передаче данных регистры те же.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 18 2012, 16:44
Сообщение #35


Знающий
****

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



Цитата(Bob176 @ Sep 18 2012, 15:05) *
оптопары скорострельные H11L1

Очень скорострельные biggrin.gif
Turn–On Time 1,2 (max 4) us
Turn–Off Time 1,2 (max 4) us
when RL = 270R If=1,2mA

А теперь посчитаем грубо 1/115200=8,68us, что остается в остатке?
Осциллограф и еще раз осциллограф.
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 19 2012, 11:12
Сообщение #36


Участник
*

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



Цитата(scifi @ Sep 18 2012, 16:44) *
Есть идейка: потыкайте осциллографом вашу схему. К тому же вы упоминали про полудуплекс: вдруг при переключении режима приём-передача на линии образуется выброс? Ну и вообще полезно убедиться, что проблема не в железе, прежде чем нырять в софт.


Да, scifi, хорошо бы посмотреть осциллографом, да у меня дома древний, аналоговый... сложно им что то увидеть, да и JTAGA на плате нет и отладчик Keilа этот проц не поддерживает ... вот и мучаюсь... rolleyes.gif

про полудуплекс ... полудуплекс - подразумевает передачу данных и приём в разные моменты времени и раньше я думал, что что у меня именно такой случай, а оказалось нет ... полный дуплекс smile3046.gif . В данном случае полудуплекс получится при передаче и приёме по одному проводу и разделении во времени..., а я всёж использую 2 провода, хотя и преобразую потом в RS-485

да, в железе может быть проблема, полностью согласен.. надеюсь сегодня вечером доберусь до платы и продолжу эксперименты biggrin.gif

Цитата
Очень скорострельные biggrin.gif

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

Сообщение отредактировал Bob176 - Sep 19 2012, 11:16
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Sep 19 2012, 13:19
Сообщение #37


Знающий
****

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



Цитата(Bob176 @ Sep 19 2012, 15:12) *
В данном случае полудуплекс получится при передаче и приёме по одному проводу и разделении во времени..., а я всёж использую 2 провода, хотя и преобразую потом в RS-485

А в RS485 у Вас сколько проводов? Вы ж управляете включением-выключением приемника/передатчика RS485, вот Вам и полудуплекс.
Кстати, не забыли, что у многих приемопередатчиков RS485 выход приемника переходит в Z-состояние. Там хоть подтяжка есть? или болтается в воздухе?
Цитата
DmitryM а Вы что применяете?
..... хотя, я думаю оптопары справляются, ведь данные не искажаются, а появляется ещё один байт ...

ADUM1201, например.
Go to the top of the page
 
+Quote Post
Bob176
сообщение Sep 19 2012, 16:15
Сообщение #38


Участник
*

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



Цитата(DmitryM @ Sep 19 2012, 17:19) *
А в RS485 у Вас сколько проводов? Вы ж управляете включением-выключением приемника/передатчика RS485, вот Вам и полудуплекс.


DmitryM, я раньше тоже так думал, но в применении к данному случаю, полудуплекс - если и приём и передача ведутся по одному проводу Тх !

на выходе приемника подтяжка есть.

ADUM1201 - уж больно дорогое решение

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


Участник
*

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



ну всё, разобрался! laughing.gif

передавал один лишний байт, была ошибка в программе ... а прерывание всё честно отрабатывало

теперь всё ок!!!

DmitryM , scifi и всем спасибо !!!

Сообщение отредактировал Bob176 - Sep 19 2012, 18:20
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 Текстовая версия Сейчас: 27th July 2025 - 07:27
Рейтинг@Mail.ru


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