STM32 USART-RS485 передача пакета данных

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Сообщение masterpc »

Приветствую всех!
Подскажите пожалуйста по следующему вопросу:
Передаю байт ПК -> STM32, по схеме ПК->USB/RS485 - драйвер RS485/проц. Отсылаю обратно, все отлично. Хочу передать два и более байт, не выходит ничего, получаю в результате либо один непонятный байт, либо ничего вообще. Терминалка COM Port Toolkit.

Привожу код:

Основной цикл:

Код: Выделить всё

int main(void)
{ 
HardwareInit();

while(1)
   {
       if(rx)
        {
               rx=0;
               tx_end=0;
               USART1->CR1 &= ~USART_CR1_RXNEIE;
            USART1->CR1 |=  USART_CR1_TCIE; 
               RS485_TR;  //переключаем на передачу
               USART1->DR = temp;
        }

         if(tx_end)
         {
                tx_end=0;
                RS485_RS;  //переключаем на прием
                USART1->CR1 |=  USART_CR1_RXNEIE;
        USART1->CR1 &= ~USART_CR1_TCIE; 
         } 
   }

}
Инициализация USART и прерываний:

Код: Выделить всё

 /***** Инициализация USART1   *****/
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;    // enable clock for USART1
   RCC->APB2ENR|= RCC_APB2ENR_AFIOEN;   //Alternate Function I/O clock enable 
     
   // 32,768 МГц/16*9600 => 213.33..
   //USART1->BRR = (213 << 4) + 5;    
   // 32,768 МГц/16*115200 => 17.7..
   USART1->BRR = (17 << 4) + 12;
   USART1->CR1 |= USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE;   //USART Enable; RXNE Interrupt Enable; Transmitter Enable; Receiver Enable
   //USART1->CR2  no init, 1 stopbit by default
   //USART1->CR3 |= USART_CR3_EIE;  //Error Interrupt Enable
   USART1->DR = 0x00;       //очищаем регистр данных 
   RS485_RS;      //переключаем драйвер RS485 на прием
   /********************************/

   /** раздача приоритетов прерываний **/
   __enable_irq();                  // глобальное включение прерывания
   NVIC_EnableIRQ(USART1_IRQn);         // прерывание по USART
   NVIC_SetPriority(USART1_IRQn, 0);    // поумолчанию приоритет 0, самый высокий
   NVIC_EnableIRQ(TIM2_IRQn);         // прерывание по таймеру2
   NVIC_SetPriority(TIM2_IRQn, 1);    // приоритет  после UART        
   /************************************/

   
Прерывание:

Код: Выделить всё

void USART1_IRQHandler (void)
{
//Receive Data register not empty interrupt
   if(USART1->SR & USART_SR_RXNE){
                rx=1;                                  
                USART1->SR&=~USART_SR_RXNE; 
         temp=USART1->DR;                                
           }
     //Transmission complete interrupt
   if(USART1->SR & USART_SR_TC){
                 USART1->SR &= ~USART_SR_TC;
                 tx_end=1;
             } 
   
}
Если иду в обход RS-485, подключаю мост USB-UART, то идет прием-передача нормально, за исключением одного момента: при передаче 16 байт с ПК:00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF получаю ответ с пропущенным 10-м либо, иногда, 11-м байтом. Сейчас основная цель - запустить RS-485.
Заранее благодарен за любую помощь!!!


ЗЫ
прием более одного байта сопровождается выставлением флага ORE в статус-регистре юсарта, что уже дожно повлечь за собой очередное прерывание, но я не наблюдаю его. Где накосячил?
Реклама
Родился
Сообщения: 13
Зарегистрирован: Сб июл 31, 2010 15:03:31

Сообщение GYUR22 »

Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Сообщение masterpc »

GYUR22 писал(а):http://we.easyelectronics.ru/STM32/stm32-rs-485-modbus-rtu.html
Я видел этот пример, но делал на следующем примере от этого автора: "STM32 usart на прерываниях на примере RS485"
Т.К на прерываниях оно как бы правильнее что-ли.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Сообщение masterpc »

Причина нашлась: при передаче более двух байт смещение в линии RS-485 уменьшается, с чего бы это?
С одной стороны дравер с подтяжкой на +5В, с другой подтяжка на +3,3В резисторы на смещение 1,1кОм и 680Ом соответственно. Терминаторы по 220Ом. Как правильно рассчитывать смещение при разных подтяжках в драйверах?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 13
Зарегистрирован: Сб июл 31, 2010 15:03:31

Сообщение GYUR22 »

используйте драйвер rs485 на 3вольта например sp3485
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Сообщение masterpc »

GYUR22 писал(а):используйте драйвер rs485 на 3вольта например sp3485
Используется ST3485...
Реклама
Родился
Сообщения: 13
Зарегистрирован: Сб июл 31, 2010 15:03:31

Сообщение GYUR22 »

Проще так - на коротких линиях и мелких скоростях терминаторы не нужны
6 ногу к + через 4k7 -10k
7 ногу к - (земле) через 4k7 -10k
и защита по 56ом
посмотрите на платку там видно
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Сообщение Ruslan-maniak »

Вопрос снят.
Ответить

Вернуться в «ARM»