E71-433MS30芯片(CC1310无线模块 )mosbus协议通信(主机)

E71-433MS30芯片同E70,目前该芯片无自己的数据手册,应该是亿百特公司懒得出吧,不过可参考 E70 (433T30S)/ E70 (868T30S)/ E70 (915T30S) ,亿百特官网有,E70 系列是基于 TI 公司 CC1310 射频芯片的无线串口模块(UART),可工作在 431~446.5MHz 频段(默认 433MHz)、861~876.5MHz 频段(默认 868MHz)、
907~922.5MHz 频段(默认 915MHz),TTL 电平输出,3.3V 的 IO 口电压。等等等等可以自己去看数据手册。

自己动手实验这个板子还是不太好用,引脚间距太小,不好焊,我是焊在了万用板上,再从下面接线,如下:

E71-433MS30芯片(CC1310无线模块 )mosbus协议通信(主机)_第1张图片

E71-433MS30芯片(CC1310无线模块 )mosbus协议通信(主机)_第2张图片

然后根据数据手册中说的接发,将其接到单片机开发板上,注意不要接错

接下来通过三根控制线配置芯片,然后只用通过串口像芯片发送数据,注意格式就好,从机一样的配置,可直接收到发过去的信息然后通过串口又发给单片机。

下面为.h文件

#ifndef _modbus_
#define _modbus_


#include"stm32f10x_conf.h"

#define MODBUS_M1_1 GPIO_SetBits(GPIOB,GPIO_Pin_7);   //PB6 Êä³ö¸ß 
#define MODBUS_M1_0 GPIO_ResetBits(GPIOB,GPIO_Pin_7);  //PB6 Êä³öµÍ
#define MODBUS_M0_1 GPIO_SetBits(GPIOB,GPIO_Pin_6);        //PB.5 Êä³ö¸ß
#define MODBUS_M0_0 GPIO_ResetBits(GPIOB,GPIO_Pin_6);  //PB.5 Êä³öµÍ

typedef struct
{
  u8 myadd;  //±¾É豸µÄµØÖ·
    u8 rcbuf[100];  //ModbusµÄ½ÓÊÕ»º³åÇø
    u16 timout;  //ModbusµÄÊý¾Ý¶ÏÐøʱ¼ä
    u8 recount;   //Modbus¶Ë¿ÚÒѾ­ÊÕµ½µÄÊý¾Ý¸öÊý
    u8 timrun;  //modbus¶¨Ê±Æ÷ÊÇ·ñ¼°Ê±µÄ±ê¼Ç
    u8 reflag; //ÊÕµ½Ò»Ö¡Êý¾ÝµÄ±ê¼Ç
    u8 Sendbuf[100];  //Modbus·¢ËÍ»º³åÇø
    

}MODBUS;

extern MODBUS modbus;
void Modbus_Init();
void Modbus_Event();
void Modbus_Read(u8 addr,u8 re_addr,u8 re_len);
void Modbus_Write(u8 addr,u8 w_addr,u16 Wit_Msg);


#endif

下面为.c文件

#include
#include
#include
#include
#include

 

u8 lcd_show[100]={0};
MODBUS modbus;
extern u16 Reg[];

unsigned char temp;
int i;

/*
ÒòΪ²¨ÌØÂÊ9600
1λÊý¾ÝµÄʱ¼äΪ1000000us/9600bit/s=104us
Ò»¸ö×Ö½ÚΪ  104us*10λ=1040us
ËùÒÔmodbusÈ·¶¨Ò»¸öÊý¾ÝÖ¡Íê³ÉµÄʱ¼äλ1040us*3.5=3.64ms

*/

void Modbus_Init()
{
     GPIO_InitTypeDef  Mb_GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     //ʹÄÜPB,PE¶Ë¿ÚʱÖÓ
    
    
    
    
     Mb_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                 //LED0-->PB.5 ¶Ë¿ÚÅäÖÃ
     Mb_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //ÍÆÍìÊä³ö
     Mb_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO¿ÚËÙ¶ÈΪ50MHz
     GPIO_Init(GPIOB, &Mb_GPIO_InitStructure);                     //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.5
    // GPIO_ResetBits(GPIOB,GPIO_Pin_7);                         //PB.5 Êä³ö¸ß

     Mb_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                 //PB6 ¶Ë¿ÚÅäÖÃ, ÍÆÍìÊä³ö
   GPIO_Init(GPIOB, &Mb_GPIO_InitStructure);                       //ÍÆÍìÊä³ö £¬IO¿ÚËÙ¶ÈΪ50MHz
  // GPIO_SetBits(GPIOB,GPIO_Pin_6);                          //PB6 Êä³ö¸ß 
    
   MODBUS_M1_0;  //ģʽÅäÖÃ
     MODBUS_M0_1;

     modbus.myadd=1;  //±¾´Ó»úµØÖ·
     modbus.timrun=0;  //modbus¶¨Ê±Æ÷Í£Ö¹¼Æʱ
     Modbus_uart_init(9600);
}


void Modbus_Read(u8 addr,u8 re_addr,u8 re_len)  //Ö÷»úÒª¶ÁÈ¡±¾´Ó»úµÄ¼Ä´æÆ÷
{
    u16 i,j;
    u16 crc; 
    
    i=0;
    
    modbus.Sendbuf[i++]=0x00; //Ä¿±êµØÖ·
    modbus.Sendbuf[i++]=0x02; //
    modbus.Sendbuf[i++]=0x04; //ÐŵÀµØÖ·

    
    modbus.Sendbuf[i++]=addr; //±¾É豸µØÖ·
    modbus.Sendbuf[i++]=0x03; //¹¦ÄÜÂë
    
    
    //modbus.Sendbuf[i++]=byte/256;
    modbus.Sendbuf[i++]=re_addr;    //¼Ä´æÆ÷Ê×µØÖ·
    modbus.Sendbuf[i++]=re_len;    //¼Ä´æÆ÷ÊýÁ¿
    
    //crcУÑ飬ÏȲ»Ð£Ñé
    crc=usMBCRC16(&modbus.Sendbuf[3],i-3);
    modbus.Sendbuf[i++]=crc%256;
    modbus.Sendbuf[i++]=crc/256;
    
    for(j=0;j     {
      uart_send_byte(modbus.Sendbuf[j]);
    }
    
}

void Modbus_Write(u8 addr,u8 w_addr,u16 Wit_Msg)
{
  u16 i,j;
    u16 crc;
    u8 k;
    i=0;
    
    modbus.Sendbuf[i++]=0x00; //Ä¿±êµØÖ·
    modbus.Sendbuf[i++]=0x02; //
    modbus.Sendbuf[i++]=0x04; //ÐŵÀµØÖ·
    
    modbus.Sendbuf[i++]=addr; //±¾É豸µØÖ·
    modbus.Sendbuf[i++]=0x06; //¹¦ÄÜÂë
    
    
    //modbus.Sendbuf[i++]=byte/256;
    //modbus.Sendbuf[i++]=0x00;
    modbus.Sendbuf[i++]=w_addr;    //¼Ä´æÆ÷Ê×µØÖ·
    

    modbus.Sendbuf[i++]=Wit_Msg/256; 
    modbus.Sendbuf[i++]=Wit_Msg%256;
    
    
    crc=usMBCRC16(&modbus.Sendbuf[3],i-3);
    modbus.Sendbuf[i++]=crc%256;
  modbus.Sendbuf[i++]=crc/256;
    
    for(j=0;j     {
      uart_send_byte(modbus.Sendbuf[j]);
    }
}

unsigned char IntToHexChar(unsigned char c)
{
    if (c > 9)
    return (c + 55);
    else
    return (c + 0x30);
}

 

void Modbus_Event()
{
    u16 crc;
    u16 recrc;
    u8 k;
  if(modbus.reflag==0)
    {
      return ;
    } 
    crc=usMBCRC16(&modbus.rcbuf [3],modbus.recount-5);
  recrc=modbus.rcbuf[modbus.recount-1]*256+modbus.rcbuf[modbus.recount-2];
      
    if(crc==recrc)  //Êý¾Ý°ü·ûºÏУÑé¹æÔò
     {
        
         // for(k=0;k             // {
                // lcd_show[k]=modbus.rcbuf[k];
              // sprintf((char*)lcd_id,"%04X",modbus.rcbuf[k]);
         
    
        if(modbus.rcbuf[4]==0x03)
            {
            //LCD_ShowChar(30,130,lcd_show[k],16,0);
                LCD_ShowString(30,130,200,16,16,"Return ok");
            }
            for (i=0; i             {
                temp = modbus.rcbuf[i]&0xf0;
                lcd_show[2*i] = IntToHexChar(temp >> 4);
                temp = modbus.rcbuf[i]&0x0f;
                lcd_show[2*i+1] = IntToHexChar(temp);
            }
                LCD_ShowString(30,150,300,16,16,lcd_show); 
                
            // }
        /*********/
            
        // LCD_ShowString(30,130,200,16,16,lcd_show); 
         
         
     }
     
      modbus.recount=0;
        modbus.reflag=0;
}

 

你可能感兴趣的:(E71-433MS30芯片(CC1310无线模块 )mosbus协议通信(主机))