树莓派4B学习笔记——IO通信篇(1-Wire)
文章目录单总线协议简介树莓派4BDHT111-Wire协议DHT11简介接口定义数据格式通信流程硬件连接开启树莓派1-Wire接口编程实现利用单总线与DS18B20通信获取温度总结树莓派4B入门学习笔记汇总单总线协议简介1-wire 单总线是Maxim 全资子公司Dallas 的一项专有技术。与目前多数标准串行数据通信方式如SPI/I2C/MICROWIRE 不同它采用单根信号线既传输时钟又传输数据而且数据传输是双向的。它具有节省I/O 口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。1单总线的数据传输速率一般为163Kbit/s最大可达142 Kbit/s通常情况下采用100Kbit/s以下的速率传输数据1-Wire线端口为漏极开路构或三态门的端口因此一般需要加上拉电阻Rp通常选用5K~10KΩ。有关单总线的详细介绍参考此文。参加蓝桥杯或者通单片机使用DS18B20的同学肯定是比较熟悉这个协议的在获取温度的过程中使用的步骤是先初始化然后写命令然后再初始化读命令获取温度。整个单总线的通信步骤初始化1-wire器件、识别1-wire器件和交换数据。由于它们是主从结构只有主机呼叫从机时从机才能应答因此主机访问1-wire器件都必须严格遵循单总线命令序列即1.初始化、2.ROM、3.命令功能命令。今天使用的DHT11他只是采用单总线数据格式具体的命令序列与DS18B20这些严格遵循初始化、ROM、命令功能命令三部曲的器件有所不同。DHT11只是采用单总线的通信步骤初始化1-wire器件、识别1-wire器件和交换数据。树莓派4BDHT111-Wire协议DHT11简介接口定义数据格式DATA脚 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据8bit校验和数据传送正确时校验和数据等于“ 8bit 湿度整数数据 8bit 湿度小数数据8bi 温度整数数据 8bit 温度小数数据 ”所得结果的末8位。通信流程1.总线初始化拉低总线时长不小于18ms,然后释放总线回到高电平2.DHT11应答DHT11应答将总线拉低3.输出数据帧一次完整的数据传输为40bit,高位先出。数据帧格式:通讯时序图硬件连接树莓派DHT115Vvcc7号引脚(板载编码)DATAGNDGND开启树莓派1-Wire接口此步骤和之前SPI、I2C操作一样不再贴图为了保险起见建议开启口重启一下树莓派 sudo reboot。编程实现由于DHT11的读取相对简单就是按照时序控制IO口的输入输出即可。代码来自此文。笔者只是简单的根据时序图添加了注释打开Geany,输入以下代码// An highlighted block////mydht11.c//#includewiringPi.h#includestdio.h#includestdlib.htypedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;#defineHIGH_TIME32int pinNumber7;//use gpio1 to read data(wPi编码)uint32 databuf;//读取传感器的值uint8readSensorData(void){uint8 crc;uint8 i;pinMode(pinNumber,OUTPUT);// 设置引脚为输出模式用来控制总线电平digitalWrite(pinNumber,0);// 拉低总线开始信号delay(25);//起始信号要求为不少于18ms的低电平,这里作者使用了25msdigitalWrite(pinNumber,1);// 主机释放总线总线恢复高电平pinMode(pinNumber,INPUT);// 将引脚设置为输入模式方便检测从机的应答信号pullUpDnControl(pinNumber,PUD_UP);//设置为上拉输入。delayMicroseconds(27);if(digitalRead(pinNumber)0)//检测总线有没有被从机拉低如果拉低就说明从机应答了。{while(!digitalRead(pinNumber));//等待从机数据传输的标志拉高电平for(i0;i32;i)//读取32为温湿度数据{while(digitalRead(pinNumber));//data clock startwhile(!digitalRead(pinNumber));//data startdelayMicroseconds(HIGH_TIME);databuf*2;//进位相当于位运算中的左移一位。if(digitalRead(pinNumber)1)//1{databuf;}}for(i0;i8;i)//采集八位校验位数据{while(digitalRead(pinNumber));//data clock startwhile(!digitalRead(pinNumber));//data startdelayMicroseconds(HIGH_TIME);crc*2;if(digitalRead(pinNumber)1)//1{crc;}}return1;}else{return0;}}intmain(void){printf(Use GPIO1 to read data!\n);if(-1wiringPiSetup()){printf(Setup wiringPi failed!);return1;}pinMode(pinNumber,OUTPUT);// set mode to outputdigitalWrite(pinNumber,1);// output a high levelprintf(Enter OS-------\n);while(1){pinMode(pinNumber,OUTPUT);// set mode to outputdigitalWrite(pinNumber,1);// output a high leveldelay(3000);if(readSensorData()){printf(Congratulations ! Sensor data read ok!\n);printf(RH:%d.%d\n,(databuf24)0xff,(databuf16)0xff);printf(TMP:%d.%d\n,(databuf8)0xff,databuf0xff);databuf0;}else{printf(Sorry! Sensor dosent ans!\n);databuf0;}}return0;}效果如下利用单总线与DS18B20通信获取温度由于大佬们早已制作了DS18B20的读取文件因此在利用DS18B20获取温度时只需调用文件接口即可获得温度信息也不需要想STM32和其他单片那样去对着时序图一点一点的初始化写数据/指令读数据了。c语言实现详细步骤参考此文Python参考此文。总结有关单总线的使用就记录到此有不妥之处欢迎批评指正。树莓派4B入门学习笔记汇总树莓派4B学习笔记——系统烧录及初次开机树莓派4B学习笔记——点亮你的LED树莓派4B学习笔记——IO输入检测树莓派4B学习笔记——IO通信篇I2C树莓派4B学习笔记——IO通信篇SPI树莓派4B学习笔记——IO通信篇1-Wire树莓派4B学习笔记——IO通信篇UARTWire单总线的基本原理↩︎
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2500486.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!