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 口电压。等等等等可以自己去看数据手册。
自己动手实验这个板子还是不太好用,引脚间距太小,不好焊,我是焊在了万用板上,再从下面接线,如下:
然后根据数据手册中说的接发,将其接到单片机开发板上,注意不要接错
接下来通过三根控制线配置芯片,然后只用通过串口像芯片发送数据,注意格式就好,从机一样的配置,可直接收到发过去的信息然后通过串口又发给单片机。
下面为.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<modbus.h>
#include<uart_modbus.h>
#include<mbcrc.h>
#include<lcd.h>
#include<stdio.h>
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<i;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<i;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<modbus.recount;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<modbus.recount; 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;
}