单片机各类通信协议
——来自于bilbil金善愚老
一、1-wire单总线
概述: 采用单根信号线既传输时钟又传输数据且数据传输是双向的。(单总线器件芯片有编制唯一的序列号(芯片通信地址))
适用范围 :单个主机系统,能够控制一个或多个从机设备。当只有一个从机设备位于总线上时,系统可按照单节点系统操作;而当多个从机位于总线上时,系统按照多节点系统操作。通信时序要求严格,看情况需不需要关闭中断,传输模式通常16.3kb/s,超速达142kb/s,传输速度较慢,只能用于传输速度要求不高的场合,一般用于100kb/s以下速率的系统。
多个单总线芯片通信区分哪个芯片:
芯片家族码可去查固定的。
单总线的基本操作:
(DS18b20为例)其他芯片单总线底层都一样
单总线时序:
1.复位
程序:
( !DS18b20含义为当DS10B20 == 0时成立)ack为0时说明有单总线芯片,1时没有
2.写一位操作
一般来说程序会直接写8位,也就是一个字节
程序:
DS18b20传输数据时,低位在前,高位在后.循环tmp用0x01(左移1位);若是高位在前,低位在后,用0x80(右移1位).
按照时序图,需判断数据的每一位是写1 还是写0,间隙为2us。If判断就是写1还是写0
3.读一位操作
主机拉低2us,后可以主动释放总线(也可以不释放,安全起见释放),从机的数据若是0则会拉低,若是1则会拉高。 从机会把数据放在总线上让主机读取.
程序:
Unsigned char ReadOneWire()
{ unsigned char dat;
}
——以上代码均为单总线底层通信协议
以下以DS18b20温度传感器芯片为例,通信读取温度
一般对单总线的器件进行读写操作时,一般分为3步:
- 初始化 总线,判断有无单总线器件,返回0 有 /1 无
- 发Rom指令 (区分与哪个芯片通信,若只有一个器件,可发跳过Rom命令)(若总线上有多个芯片,则匹配Rom指令法,搜索寻找法)
- 发送控制字节命令(读或写操作)
注意 :每次执行读或写操作,都要进行以上3步!!!不遵守则无法通信
程序基于蓝桥杯stc15单片机和2023年官方提供的单总线底层驱动代码
float rd_temperature_f(void)
{
unsigned int temp=0;
float temperature=0;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44); //
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE); //
low = Read_DS18B20(); //
high = Read_DS18B20(); //
temp = (high&0x0f);
temp <<= 8;
temp |= low;
temperature = temp*0.0625;
return temperature;
}