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

 
 
 
Reply to this topicStart new topic
> STM32F103 проблемы с контролем четности USART, I need help
sidy
сообщение Aug 31 2018, 13:05
Сообщение #1


Местный
***

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



Добрый день.

Потребовалось использовать контроль четности в USART (STM32f103) и возникла проблема. При отсутствии контроля четности прием идет правильно. Например посылка:
01 04 00 41 00 01 224 02
принимается должным образом.
При включении контроля четности, например odd принимаю ту же самую посылка следующим образом:
01 04 256 41 256 01 224 02
Т.е. вместо 0 принимается 256

Вот код инициализации USART:
RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
USART1->CR1=USART1->CR2=USART1->CR3=0;
USART1->BRR=CPU_CLOCK/BAUD_RATE;
USART1->CR1|=USART_CR1_M;
USART1->CR1|=USART_CR1_PCE;
USART1->CR1|=USART_CR1_PS;
USART1->CR1|=USART_CR1_TE;
USART1->CR1|=USART_CR1_RE;
USART1->CR1|=USART_CR1_TCIE;
USART1->CR1|=USART_CR1_RXNEIE;

Подскажите в чем может быть дело.

Сообщение отредактировал sidy - Aug 31 2018, 13:19
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 31 2018, 13:10
Сообщение #2


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

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



256 не влазит в 8-битовый байт. rolleyes.gif Дело в интерпретации числа 0x100.
Go to the top of the page
 
+Quote Post
sidy
сообщение Aug 31 2018, 13:17
Сообщение #3


Местный
***

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




Еще забыл добавить при контроле четности Even, посылка будет выглядеть так:
257 260 00 297 257 480 258
т.е. как-будто к каждому числу прибавили 256

Цитата(ViKo @ Aug 31 2018, 16:10) *
256 не влазит в 8-битовый байт. rolleyes.gif Дело в интерпретации числа 0x100.


т.е. нужно дополнительно преобразовывать значения в зависимости от того какой контроль четности используется?

Сообщение отредактировал sidy - Aug 31 2018, 13:19
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 31 2018, 13:23
Сообщение #4


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

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Четность + данные = 9 бит
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 31 2018, 18:13
Сообщение #5


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

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



Цитата(sidy @ Aug 31 2018, 16:17) *
т.е. нужно дополнительно преобразовывать значения в зависимости от того какой контроль четности используется?

Так сразу интерпретируйте как 8-битов.
Go to the top of the page
 
+Quote Post
sidy
сообщение Aug 31 2018, 18:16
Сообщение #6


Местный
***

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



Цитата(ViKo @ Aug 31 2018, 21:13) *
Так сразу интерпретируйте как 8-битов.

Маску наложить? Думаю пройдет такой вариант.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 31 2018, 18:19
Сообщение #7


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

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



Цитата(sidy @ Aug 31 2018, 21:16) *
Маску наложить? Думаю пройдет такой вариант.

Настройки изучите в Referense Manual.
Go to the top of the page
 
+Quote Post
sidy
сообщение Sep 3 2018, 05:54
Сообщение #8


Местный
***

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



Цитата(ViKo @ Aug 31 2018, 21:19) *
Настройки изучите в Referense Manual.

Вы имеет ввиду бит USART_CR1_M?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 3 2018, 06:51
Сообщение #9


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

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



Цитата(sidy @ Sep 3 2018, 08:54) *
Вы имеет ввиду бит USART_CR1_M?

Ага, наверное, его. У меня передаются и принимаются 8-битовые байты. Четность не использую, два стопа делал. Никаких масок.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 17 2018, 10:39
Сообщение #10


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



код из прерывания UART'а:

Код
    uint32_t status = uart_hw->SR;

    // receiver not empty
    if (USART_SR_RXNE & status)
    {
        uint16_t data = uart_hw->DR;
        if (parity_en)        // "срезать" бит чётности
            data &= 0xFF;


parity_en - флажок из настроек драйвера (он многофункциональный).


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 12:22
Рейтинг@Mail.ru


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