Перейти к содержанию
    

STM32F103 проблемы с контролем четности USART

Добрый день.

 

Потребовалось использовать контроль четности в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

256 не влазит в 8-битовый байт. :rolleyes: Дело в интерпретации числа 0x100.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Еще забыл добавить при контроле четности Even, посылка будет выглядеть так:

257 260 00 297 257 480 258

т.е. как-будто к каждому числу прибавили 256

 

256 не влазит в 8-битовый байт. :rolleyes: Дело в интерпретации числа 0x100.

 

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

Изменено пользователем sidy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Так сразу интерпретируйте как 8-битов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маску наложить? Думаю пройдет такой вариант.

Настройки изучите в Referense Manual.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы имеет ввиду бит USART_CR1_M?

Ага, наверное, его. У меня передаются и принимаются 8-битовые байты. Четность не использую, два стопа делал. Никаких масок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код из прерывания 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 - флажок из настроек драйвера (он многофункциональный).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...