PM2.5 Modbus IIC
发布时间:2017-10-17 16:26:44
发布时间:2017-10-17 16:26:44
JP1为串口调试接口;JP2为IIC接口(需外部上拉);JP3为PD4NS传感器接口,可用间距为2.54的4PIN座子接到2345位置。
一、标准modbus RTU协议说明
1、串口设置
波特率9600,无校验,数据位8,停止位1。
万能通讯命令16进制:00 03 00 00 00 01 85 DB (不清楚设备地址可用此找回)
2、接口说明
可直接使用串口线的5V供电进行调试,若不使用串口线电源,请接入GND(地\电源负极),TX(模组串口发对应串口线收),RX(模组串口收对应串口线发)对应接口。调试不通请交换串口线再试。
3、寄存器描述
4、CRC16校验计算函数(请确认单片机大端编程还是小端)
/******************函数CRC_16()*********大端
返回short int
参数 data【】数组、len数组长度
例子:datax【8】={01, 03, 00, 00, 00, 01, 00, 00}16进制
unsigned short int x=CRC_16(datax,6);
得到x=0x840a;
***************************************************/
unsigned short int CRC_16(unsigned char *data,int len)
{
unsigned char *buf;
unsigned short int * CRC;
unsigned short int crch,crcl;
short int i;
short int j;
char err;
buf= & data[len];
CRC=(unsigned short int *)buf;
buf[0]=0xff;
buf[1]=0xff;
for(i=0;i
{
buf[0]=buf[0]^data[i];
for(j=0;j<8;j++)
{
err=buf[0]&1;
*CRC=*CRC/2;
if(err) *CRC=*CRC^0xa001;
}
}
crch=*CRC>>8;
crcl=*CRC<<8;
*CRC=crch+crcl;
return(*CRC);
}
/******************函数CRC_16()*********小端
返回short int
参数 data【】数组、len数组长度
例子:datax【8】={01, 03, 00, 00, 00, 01, 00, 00}16进制
unsigned short int x=CRC_16(datax,6);
得到x=0x840a;
***************************************************/
unsigned short int CRC_16(unsigned char *data,int len)
{
unsigned char *buf;
unsigned short int * CRC;
unsigned short int crch,crcl;
uchar p;
uchar j;
char err;
buf= & data[len];
CRC=(unsigned short int *)buf;
buf[0]=0xff;//lsb
buf[1]=0xff;//msb
for(p=0;p
{
buf[1]=buf[1]^data[p];
for(j=0;j<8;j++)
{
err=buf[1]&1;
*CRC=*CRC/2;
if(err) *CRC=*CRC^0xa001;
}
}
crch=*CRC>>8;
crcl=*CRC<<8;
*CRC=crch+crcl;
return(*CRC);
}
二、IIC接口说明
1、注意事项
IIC接口需要接10k上拉电阻;
默认设备地址为0x50;若需修改请参考Modbus协议说明;
数据格式0x0B PM高位 PM低位 0x0B 0x00 0x00 ……
请用IICdata【0】和IICdata【3】来保证数据准确;
2、读取例程:
Uchar IICdata【7】;
void pm2_Read(void)
{
Unsigned char i;
Start(); //发送开始条件
IIC_ Write (0x51); //发送地址+读
if(I2C_Get_Ack()) //等待ACK
{
Stop(); //无ACK则停止
return;
}
//进入数据收取
for(i=0;i<8;i++) //收取8位数据
{
Delay_us(2);
IIC_read(&IICdata [i]);
if(i<7) //倒数一位停止发送ACK(注意这里很重要)
I2C_Send_Ack(); //收到数据发送ACK
}
Stop(); //停止条件
}