Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пт ноя 18, 2011 19:02:28

Приветствую всех!
Подскажите пожалуйста по следующему вопросу:
Передаю байт ПК -> 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 в статус-регистре юсарта, что уже дожно повлечь за собой очередное прерывание, но я не наблюдаю его. Где накосячил?

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

Вт ноя 22, 2011 14:12:51

http://we.easyelectronics.ru/STM32/stm3 ... s-rtu.html

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

Вт ноя 22, 2011 14:24:08

GYUR22 писал(а):http://we.easyelectronics.ru/STM32/stm32-rs-485-modbus-rtu.html


Я видел этот пример, но делал на следующем примере от этого автора: "STM32 usart на прерываниях на примере RS485"
Т.К на прерываниях оно как бы правильнее что-ли.

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

Чт ноя 24, 2011 01:24:32

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

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

Вт ноя 29, 2011 21:42:16

используйте драйвер rs485 на 3вольта например sp3485

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

Вт ноя 29, 2011 22:41:43

GYUR22 писал(а):используйте драйвер rs485 на 3вольта например sp3485


Используется ST3485...

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

Чт дек 01, 2011 17:16:35

Проще так - на коротких линиях и мелких скоростях терминаторы не нужны
6 ногу к + через 4k7 -10k
7 ногу к - (земле) через 4k7 -10k
и защита по 56ом
посмотрите на платку там видно

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

Чт дек 27, 2012 06:09:01

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