|
UART2 на STM32F100C4 сплошные глюки :') |
|
|
|
Aug 28 2012, 07:50
|
Участник

Группа: Участник
Сообщений: 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; //Прерывание по завершении передачи то уже ничего не принимает ... похоже висит. посоветуйте, что проверить? как ещё настроить? осциллографом смотрел, битики при передаче бегут  до ST485 доходят
|
|
|
|
|
Aug 28 2012, 08:26
|
Группа: Новичок
Сообщений: 4
Регистрация: 13-08-12
Пользователь №: 73 111

|
Попробуйте настроить UART через стандартную stm'овскую либу.
|
|
|
|
|
Aug 28 2012, 13:31
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Вы там случаем контролем четности не балуетесь? А тож смотрите, если он включен, то данных будет 7 бит, а восьмой бит четности.
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Aug 28 2012, 13:49
|
Участник

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

|
Цитата(PoReX @ Aug 28 2012, 17:31)  Вы там случаем контролем четности не балуетесь? А тож смотрите, если он включен, то данных будет 7 бит, а восьмой бит четности.  нет не балуюсь, не дошёл ещё до чётности, но Вы правы, на это надо обратить внимание. сегодня вечером займусь
|
|
|
|
|
Aug 29 2012, 05:28
|
Участник

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

|
Ну что же помоему до меня дошло я тактирую от внутреннего генератора 8 МГц. похоже отсуда и все глюки!!! как считает общественность? у меня стоит на макетке 32кГц внешний кварц Можно ли им обойтись?
|
|
|
|
|
Aug 29 2012, 08:32
|
Участник

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

|
Цитата(scifi @ Aug 29 2012, 08:42)  Тактирую от него же, глюков нет. Цитата(scifi @ Aug 29 2012, 08:42)  Кстати, это несложно проверить осциллографом: измерьте частоту следования битов. ... хорошо измерю ... Цитата(spectral1989 @ Aug 29 2012, 09:03)  какой терминал и все ли там правильно стоит? baudrate, stop bits, data bits, parity .. Терминал проверенный и стоит там всё правильно! неужели проблема в железе ... может у кого найдётся рабочий пример UARTа на stm32F100C4 ? не важно на прерываниях или без ..
Сообщение отредактировал Bob176 - Aug 29 2012, 08:35
|
|
|
|
|
Aug 29 2012, 11:59
|
Участник

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

|
Цитата(scifi @ Aug 29 2012, 12:16)  Пожалуйста: спасибо за пример, Код USART_CR3 = 8; /* select half duplex */ может быть в этом проблема ? ... вечером попробую
Сообщение отредактировал Bob176 - Aug 29 2012, 12:02
|
|
|
|
|
Aug 29 2012, 13:21
|
Участник

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

|
Цитата(scifi @ Aug 29 2012, 15:33)  У меня используется полудуплексный режим. Вам он едва ли понадобится. скорее наоборот полудуплексный режим я и использую и на мой взгляд он применяется чаще. А бездумное копирование кода - всегда не комильфо
|
|
|
|
|
Aug 29 2012, 13:40
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(ViKo @ Aug 29 2012, 16:50)  У вас в коде есть строчка (void)USART_DR; Как это работает? Прочитать регистр и выкинуть результат. Можно просто "USART_DR;", но приведение к void нагляднее. Где-то читал статейку, где это разжёвано. Если найду, приложу ссылку. Читал стандарт C99 - да, всё путём, так и должно работать, хотя кому-то покажется странным. Update: Вот интересная статья на эту тему. Краткое содержание: по стандарту Си код должен работать, но на практике он работает не со всеми компиляторами. По стандарту Си++ - вообще какой-то туман, и поведение компиляторов различается ещё сильнее. Получается, что если рассчитывать не на сферический компилятор в вакууме, которые следует стандарту до последней запятой, а на обычные глючные компиляторы, то лучше использовать более развёрнутую конструкцию с присвоением значения временной переменной.
|
|
|
|
|
Aug 29 2012, 14:39
|

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

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

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

|
Цитата(SSerge @ Aug 28 2012, 12:49)  Зря Вы в обработчике прерываний USART_IT_RXNE используете, эти ..... его очень оригинально определили. И он нифига не совпадает ни с USART_SR_RXNE ни с USART_FLAG_RXNE. спасибо, SSerge теперь не зависает, хотя передача пока так и не работает .. разбираюсь дальше... ну вот  уже лучше!!! данные передаются только ..... как и прежде передаю 1 - принимаю 129 (0х81) передаю 2 - принимаю 130 (0х82) передаю 3 - принимаю 131 (0х83) ... при передаче передаю несколько байт значения 129 а принимает терминал то как 129 (0x81), то как 1 (0x80) !!! что подскажете?
Сообщение отредактировал Bob176 - Aug 29 2012, 21:07
|
|
|
|
|
Aug 29 2012, 23:02
|
Местный
  
Группа: Участник
Сообщений: 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)
Сообщение отредактировал vlad_new - Aug 29 2012, 23:39
|
|
|
|
|
Sep 17 2012, 18:59
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 18 2012, 10:06
|
Участник

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

|
Цитата(_Pasha @ Sep 17 2012, 23:06)  импульс, коорый воспринимается как старт-бит? это одиночная посылка Цитата(_Pasha @ Sep 17 2012, 23:06)  что у Вас за схема по RS-у ? оптопары, управление потоком через транзистор инвертируется.
|
|
|
|
|
Sep 18 2012, 10:39
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(Bob176 @ Sep 17 2012, 22:59)  может кто чего подскажет? где копать? а на чем без кода гадать?
|
|
|
|
|
Sep 18 2012, 11:05
|
Участник

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

|
Цитата(DmitryM @ Sep 18 2012, 14:16)  А скорострельность оптопары?? Чтобы 115200 проходило нужно тщательно отбирать оптопары. Типовое время отклика 18-20мкс, а это уже соизмеримо с длительностью импульса на 115200. оптопары скорострельные H11L1 Цитата а на чем без кода гадать? мне идея нужна...
|
|
|
|
|
Sep 18 2012, 11:34
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(Bob176 @ Sep 18 2012, 15:05)  мне идея нужна... Ну, не хотите по существу, я тоже в абстракцию уйду  Идея проста - написание своих велосипедов без достаточно вдумчивого чтения манов чревато глюками и потерянным временем
|
|
|
|
|
Sep 18 2012, 12:20
|
Участник

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

|
Цитата(MBR @ Sep 18 2012, 15:34)  Ну, не хотите по существу, я тоже в абстракцию уйду  Идея проста - написание своих велосипедов без достаточно вдумчивого чтения манов чревато глюками и потерянным временем  уважаемый MBR вы считаете проблема в коде? в инициализации? в прерывании? в начале поста я выкладывал исходники.. особенно в них ничего не поменялось... данные принимаются верно, значит скорость задана правильно, на низкой частоте все работает корректно... что может привести к тому, что на высокой частоте передаётся ещё один байт мне пока не понятно ... , вот и интересуюсь, может кто уже сталкивался с такой проблемой... или натолкнёт идейкой на решение ..
|
|
|
|
|
Sep 18 2012, 12:56
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(Bob176 @ Sep 18 2012, 16:20)  в начале поста я выкладывал исходники.. особенно в них ничего не поменялось... Там была ссылка на нерабочий вариант. scifi, скорее всего, прав насчет полудуплекса. Правильная логика отправки должна быть следующая: разрешаем TXE, делаем отправку. После отправки последнего байта в обработчике запрещаем TXE, разрешаем TC. И только когда снова придем в обработчик TC - запрещаем TC и трансмиттер. Но Ваша лень сделать копипасту превращает это лишь в предположения. Я могу дать ссылку на мой рабочий исходник с полудуплексом для F2 - там разница лишь в установке baud rate, при передаче данных регистры те же.
|
|
|
|
|
Sep 18 2012, 16:44
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Bob176 @ Sep 18 2012, 15:05)  оптопары скорострельные H11L1 Очень скорострельные 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, что остается в остатке? Осциллограф и еще раз осциллограф.
|
|
|
|
|
Sep 19 2012, 11:12
|
Участник

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

|
Цитата(scifi @ Sep 18 2012, 16:44)  Есть идейка: потыкайте осциллографом вашу схему. К тому же вы упоминали про полудуплекс: вдруг при переключении режима приём-передача на линии образуется выброс? Ну и вообще полезно убедиться, что проблема не в железе, прежде чем нырять в софт. Да, scifi, хорошо бы посмотреть осциллографом, да у меня дома древний, аналоговый... сложно им что то увидеть, да и JTAGA на плате нет и отладчик Keilа этот проц не поддерживает ... вот и мучаюсь... про полудуплекс ... полудуплекс - подразумевает передачу данных и приём в разные моменты времени и раньше я думал, что что у меня именно такой случай, а оказалось нет ... полный дуплекс  . В данном случае полудуплекс получится при передаче и приёме по одному проводу и разделении во времени..., а я всёж использую 2 провода, хотя и преобразую потом в RS-485 да, в железе может быть проблема, полностью согласен.. надеюсь сегодня вечером доберусь до платы и продолжу эксперименты Цитата Очень скорострельные biggrin.gif DmitryM а Вы что применяете? ..... хотя, я думаю оптопары справляются, ведь данные не искажаются, а появляется ещё один байт ...
Сообщение отредактировал Bob176 - Sep 19 2012, 11:16
|
|
|
|
|
Sep 19 2012, 13:19
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Bob176 @ Sep 19 2012, 15:12)  В данном случае полудуплекс получится при передаче и приёме по одному проводу и разделении во времени..., а я всёж использую 2 провода, хотя и преобразую потом в RS-485 А в RS485 у Вас сколько проводов? Вы ж управляете включением-выключением приемника/передатчика RS485, вот Вам и полудуплекс. Кстати, не забыли, что у многих приемопередатчиков RS485 выход приемника переходит в Z-состояние. Там хоть подтяжка есть? или болтается в воздухе? Цитата DmitryM а Вы что применяете? ..... хотя, я думаю оптопары справляются, ведь данные не искажаются, а появляется ещё один байт ... ADUM1201, например.
|
|
|
|
|
Sep 19 2012, 16:15
|
Участник

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

|
Цитата(DmitryM @ Sep 19 2012, 17:19)  А в RS485 у Вас сколько проводов? Вы ж управляете включением-выключением приемника/передатчика RS485, вот Вам и полудуплекс. DmitryM, я раньше тоже так думал, но в применении к данному случаю, полудуплекс - если и приём и передача ведутся по одному проводу Тх ! на выходе приемника подтяжка есть. ADUM1201 - уж больно дорогое решение
Сообщение отредактировал Bob176 - Sep 19 2012, 16:18
|
|
|
|
|
Sep 19 2012, 17:46
|
Участник

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

|
ну всё, разобрался! передавал один лишний байт, была ошибка в программе ... а прерывание всё честно отрабатывало теперь всё ок!!! DmitryM , scifi и всем спасибо !!!
Сообщение отредактировал Bob176 - Sep 19 2012, 18:20
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|