SDI12协议---单线GPIO

SDI12协议:SDI-12 Serial Digital Interface 即串行数字接口,是一种基于微处理器的智能化传感器系统。 SDI-12通讯标准是由美国水文组织提出的的一种串行数据通讯接口协议,在SDI-12协会支持下,近年来欧美国家在环境监测中加以推广使用。 此技术广泛应用在工农业多参数测控、江河湖海的水文和气象等地球环境监测、养殖和食品生产中,可以远距离传送数据。

关键词三根线、发送负逻辑。

注意点:如果用单总线协议,需要确认串口是否支持电平反转。

一、唤醒

1、拉高12ms

 2、send_break,8.3ms

二、发送

        如果你的单总线不支持时钟反极性,(即起始位和数据、停止位都要反着来那请用单总线来模拟吧),如果是RTOS没法精确定时,则需要电路上调整。

        这里以截取0D! 命令下的回复为例子

2.1串口接收和回复

发送0D!,回复”0+1680“,其他命令可自行看手册        SDI-12_version-1_4-Jan-10-2019

SDI12协议---单线GPIO_第1张图片

 发送的数据如下

SDI12协议---单线GPIO_第2张图片

 发送的单字节代码如下(其他的按One-Wire协议自行调整):

起始位跟库函数的是相反的极性。

void SDI_ByteSend(uint8_t val)
{
    uint8_t i= 0;
    GPIO_SetBits(GPIOB, GPIO_PIN_10);	//一个起始位
    delay_us(delayTime);//0.83ms			
    for(i = 0; i < 8; i++)	//八个数据位
    {
    	if(val & 0x01)
    	GPIO_ResetBits(GPIOB, GPIO_PIN_10);//0.83ms
	    else
	    GPIO_SetBits(GPIOB, GPIO_PIN_10);
	    delay_us(delayTime);//0.83ms
	    val >>= 1;
    }
	GPIO_ResetBits(GPIOB, GPIO_PIN_10);	//一个停止位
	delay_us(delayTime);//0.83ms
}

你可能感兴趣的:(开发语言,c语言,嵌入式硬件,单片机)