Интерфейс STM32F4 с RS485 - PullRequest
       60

Интерфейс STM32F4 с RS485

0 голосов
/ 07 декабря 2018

Я пытаюсь прочитать данные со счетчика с помощью преобразователя RS485 в TTL в STM32f407VG .Мой идентификатор ведомого устройства - 121, скорость передачи - 9600. Я хочу прочитать holdingRegisters и InputRegisters.

Я пытаюсь использовать этот порт FreeMODBUS RTU для библиотеки STM32 HAL .

Я подключил свой вывод DI к PA_2(Tx), R0 вывод к PA_3(Rx), DE&RE вывод к GND.Но я не получаю никаких данных.

Это мой код:

#include "stm32f4xx_hal.h"
#include "cmsis_os.h"

#include "mb.h"
#include "mbport.h"

#define REG_INPUT_START 30005
#define REG_INPUT_NREGS 8

static USHORT usRegInputStart = REG_INPUT_START;
static USHORT usRegInputBuf[REG_INPUT_NREGS];

 void ModbusRTUTask(void const * argument)  
 { 
    /* ABCDEF */
   usRegInputBuf[0] = 11;
    usRegInputBuf[1] = 22;
    usRegInputBuf[2] = 33;
    usRegInputBuf[3] = 44;
    usRegInputBuf[4] = 55;
    usRegInputBuf[5] = 66;
    usRegInputBuf[6] = 77;
    usRegInputBuf[7] = 88;  

  eMBErrorCode eStatus = eMBInit( MB_RTU, 121, 3, 9600, MB_PAR_NONE );
  eStatus = eMBEnable();


while(1) {
    eMBPoll();           
  }
 }

eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
eMBErrorCode    eStatus = MB_ENOERR;
int             iRegIndex;

if( ( usAddress >= REG_INPUT_START )
   && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
{
   iRegIndex = ( int )( usAddress - usRegInputStart );
   while( usNRegs > 0 )
            {
      *pucRegBuffer++ =
         ( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
     *pucRegBuffer++ =
        ( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
       iRegIndex++;
       usNRegs--;
    }

        HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
    }
    else
    {
         HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin);
    eStatus = MB_ENOREG;            
    }

    return eStatus;
    }

    eMBErrorCode
    eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
             eMBRegisterMode eMode )
    {
    return MB_ENOREG;
     }


    eMBErrorCode
    eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,
           eMBRegisterMode eMode )
    {
    return MB_ENOREG;
    }

      eMBErrorCode
       eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT 
        usNDiscrete)
       {
       return MB_ENOREG;
      }

Почему эти переменные?

usRegInputBuf[0] = 11;
usRegInputBuf[1] = 22;
usRegInputBuf[2] = 33;
usRegInputBuf[3] = 44;
usRegInputBuf[4] = 55;
usRegInputBuf[5] = 66;
usRegInputBuf[6] = 77;
usRegInputBuf[7] = 88;  

Какие изменения мне нужно внести?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

DE&RE pin to GND

Выводы DE и RE используются для включения и отключения входа и выхода преобразованного.Вам следует:

  • установить DE = 1 и RE = 0 при передаче
  • установить DE = 0 и RE = 1 при получении
  • (дополнительно) установить DE =0 и RE = 0, когда устройство не используется (это зависит от приемопередатчика, но обычно установка обоих на низкий уровень экономит много энергии)

Перед отправкой каждого символа через rs485 необходимо установитьDE = 1, RE = 0, затем введите символ, затем вернитесь в режим приема и затем получите данные.

Внимательно осмотрите паспорт приемопередатчика.Если вы используете, напр. MAX485 (но на самом деле они все одинаковы), вы видите на странице 7:

enter image description here

Подробнее о трехлогику состояния можно найти напр.на вики .

Если для RE задано значение GND, ворота никогда не откроются, поэтому вы всегда будете иметь высокий импеданс на выводе RO и никогда не будете получать никаких данных.С другой стороны, вы никогда не будете отправлять какие-либо данные, потому что DE будет низким, и я считаю, что вам нужно отправить что-то на счетчик до того, как он начнет передачу.

Вы должны подключить UART TX к DI, UART RX кRO.В вашем случае и если преобразователь инвертирует один из выводов RE / DE (обычно RE инвертируется, как указано выше), вы можете подключить оба к одному и тому же выводу.

0 голосов
/ 10 декабря 2018

Код Github не совсем понятен, я бы посоветовал вам следовать упомянутой процедуре связи UART здесь

  1. Сначала проверьте с помощью последовательного терминала, если вы можете общаться с помощью UARTс платой stm32f4x.
  2. Используйте протокол связи Modbus для реализации логики чтения регистров.
...