MSP430的485通信

一、MAX3485芯片使用方法

1、RS232接口只能实现点对点的通信方式,但这种方式不能实现联网功能,便出现了RS485解决了这个问题。RS485采用差分信号负逻辑,+2V~+6V表示“1”,- 6V~- 2V表示“0”。双机通信时只需A-A,B-B连接。
2、硬件电路一般采用SN65176等RS485电平转换芯片。与MCU相连时有三个引脚:DE(RE同DE连在一起),DI(接受引脚),RO(发送引脚)。MCU发送一帧信号时,要先使能DE=1;接收信号前要先使能DE=0(即RE=0)。
在这里插入图片描述
MAX3483, MAX3485, MAX3486, MAX3488, MAX3490以及MAX3491是用于RS-485与RS-422通信的3.3V,低功耗收发器,每个器件中都具有一个驱动器和一个接收器。MAX3483和MAX3488具有限摆率驱动器,可以减小EMI,并降低由不恰当的终端匹配电缆引起的反射,实现最高250kbps的无差错数据传输。MAX3486的驱动器摆率部分受限,可以实现最高2.5Mbps的传输速率。MAX3485,MAX3490和MAX3491则可以实现最高10Mbps的传输速率。
驱动器具有短路电流限制,并可以通过热关断电路将驱动器输出置为高阻状态,防止过度的功率损耗。接收器输入具有失效保护特性,当输入开路时,可以确保逻辑高电平输出。
使用MAX3488, MAX3490和MAX3491可以实现全双工通信,而MAX3483,MAX3485与MAX3486则为半双工应用设计。
————————————————
版权声明:本文为CSDN博主「尹泽宇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接

二、MSP430的485通信程序(接收字符串指令)

/**************************************************************
程序功能:通过RS485端口一次一次地收发数据
测试说明:用示波器观察RS485端口A、B信号线
上的波形或者用RS485接收器接收发回
的字符,在串口助手上显示。
***************************************************************/

#include 
#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态 
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态
typedef unsigned char uchar;

unsigned char string[8] ;
uchar RX_flag;

void Set_UART1(void);
void PutString0(uchar *ptr);
void Send1Char(uchar sendchar);
void PutString(uchar *ptr);
/****************主函数****************/
void main(void)
{
    unsigned int i; 
    WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
    P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
    DRE_out;
    RE;
    Set_UART1();
    _EINT();
    while (1)
    {    
      while( IFG2 & URXIFG1 );     //等待收到test命令字符
      if(RX_flag==1)  
         {  
             RX_flag=0;
             if(string[1]=='a')
             {
               DE;   
               for(i=0;i<3200;i++);
               PutString0("a11.5522.33e ");
               Send1Char('\n');
               for(i=0;i<3200;i++);
               RE;
               //LPM3;
             }
         }    
      }
}
/*******************************************
函数名称:Set_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Set_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口    
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x03;                             //波特率9600
    UBR11 = 0x00;
    UMCTL1 = 0x4a;                            //调整
    UCTL1 &= ~SWRST;                          //初始化UART状态机 
    IE2 |= URXIE1 ;            // 中断允许寄存器设置,接收中断允许
}

//串口接收中断,接收字符串指令.
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
   static uchar rxcount = 0;
    // LPM3_EXIT;
     if(RXBUF1 == 'e')
     {
       RX_flag =1;
       rxcount = 0;  
     }
     else
     {
       string[rxcount++] = RXBUF1;
     }   
}
/*******************************************
函数名称:Send1Char
功    能:向PC机发送一个字符
参    数:sendchar--要发送的字符
返回值  :无
********************************************/
void Send1Char(uchar sendchar)
{
      while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空         
      TXBUF1 = sendchar; 
}
/*******************************************
函数名称:PutSting
功    能:向PC机发送字符串并换行指令
参    数:ptr--指向发送字符串的指针
返回值  :无
********************************************/
void PutString(uchar *ptr)
{
      while(*ptr != '\0')
      {
            Send1Char(*ptr++);                     // 发送数据
      }
      while (!(IFG2 & UTXIFG1));
      TXBUF1 = '\n';                              //发送换行指令
}
/*******************************************
函数名称:PutSting0
功    能:向PC机发送字符串,无换行
参    数:ptr--指向发送字符串的指针
返回值  :无
********************************************/
void PutString0(uchar *ptr)
{
      while(*ptr != '\0')
      {
            Send1Char(*ptr++);                     // 发送数据
      }
}

关键字: MSP430 485通信 字符串指令
原文链接

三、485+MODBUS

MODBUS为应用层协议。由于485通信只是单工通信(差分传输),故为了实现半双工通信(USART为半双工),所以需要主、从双方所约定的“通用法则”来进行半双工的数据通信。我的理解如果把485物理层比喻为数据传输的公路,则MODBUS就为交通规则。
当然,485不仅可以采用MODBUS协议传输,也可以采用TCP/IP 协议传输。
————————————————
版权声明:本文为CSDN博主「米亚拉斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接

四、Modbus通讯协议——RTU

Modbus协议定义的寄存器地址 是5位十进制地址,即:
线圈(DO)地址:00000~09999
触点(DI)地址:10000~19999
输入寄存器(AI)地址:30000~39999
输出寄存器(AO)地址:40000~49999
由于上述各类地址是唯一对应的,因此有些资料就以其第一个数字区分各类地址,即:0x代表线圈(DO)类地址,1x代表触点(DI)类地址、 3x代表输入寄存器(AI)类地址、4x代表输出寄存器(AO)类地址。
在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。

modbus有四种数据,DI、DO、AI、AO
DI: 数字输入,离散输入,一个地址一个数据位,用户只能读取它的状态,不能修改。比如面板上的按键、开关状态,电机的故障状态。
DO: 数字输出,线圈输出,一个地址一个数据位,用户可以置位、复位,可以回读状态,比如继电器输出,电机的启停控制信号。
AI: 模拟输入,输入寄存器,一个地址16位数据,用户只能读,不能修改,比如一个电压值的读数。
AO: 模拟输出,保持寄存器,一个地址16位数据,用户可以写,也可以回读,比如一个控制变频器的电流值。

无论这些东西被叫做什么名字,其内容不外乎这几种,输入的信号用户只能看不能改,输出的信号用户控制,并可以回读。离散的数据只有一位,模拟的数据有16位。

Modbus-RTU模式是指当控制器设为在Modbus网络上以RTU(远程终端模式)模式通信,在消息中的每个8Bit包含两个4Bit的十六进制字符。
简书·原文链接

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值