onewire
一、780EPM onewire 概述
780EPM 有 4 个 GPIO,分别是 onewire 0 - onewire, 分别对应 780EPM 的 GPIO2, GPIO3,GPIO7,GPIO28, 对应的模组管脚为 23 脚,54 脚,56 脚,78 脚。
这四个 onewire 共用的是一个 onewire 通道,所以 onewire id 都是 0。
如果从设备接到不同的 onewire 管脚的话, 也视为在一个 onewire 总线有多个从设备。
具体可以参考 780EPM 的管脚复用表: http://docs.openluat.com/air780epm/product/file/Air780EPM_GPIO_Table_20250406.xlsx
二、780EPM onewire API 说明
2.1 常量
无
2.2 API 函数列表和使用解释
2.2.1 onewire.init(id)
该函数用于 onewire 使用前的初始化。
参数说明:
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号.如果只有一条则随意填写 |
返回值
无
2.2.2 onewire.timing(id, is_tick, clk_div, tRSTL, tRSTH, tPDHIGH, tPDLOW, tSLOT, tStart, tLOW1, tRDV, tREC)
配置硬件单总线时序。
如果不调用这个函数配置时序的话,默认情况下是直接匹配 DS18B20。
参数说明
本函数的最后 9 个参数的详细说明参见这篇文章:
http://docs.openluat.com/embedded/interface/onewire/
的第 2.3.2 节,2.4.2 节,2.5.2 节。
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
is_tick | boolean | 只能是false |
clk_div | int | 本参数忽略,填0 即可 |
tRSTL | int | reset拉低总时间 |
tRSTH | int | reset释放总时间 |
tPDHIGH | int | reset释放到开始探测时间 |
tPDLOW | int | reset探测时间 |
tSLOT | int | 一个时隙的通信总有效时间 |
tStart | int | 通信start信号时间,一般就是开头拉低 |
tLOW1 | int | 主设备写逻辑 1 时的低电平持续时间 |
tRDV | int | 主设备读数据的有效时间 |
tREC | int | 通信结束,下一次通信时隙前 的恢复时间 |
返回值
无
例子
--配置单总线时序匹配DS18B20
onewire.timing(0, false, 0, 500, 500, 15, 240, 65, 1, 15, 15, 5)
2.2.3 onewire.reset(id, need_ack)
主机发起复位。
参数
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
need_ack | boolean | 是否需要检测应答信号,true需要检测,false不需要检测 |
返回值
boolean 类型,
返回检测到应答的结果。
或者无需检测返回 true;
如果需要检测的话,检测到应答成功返回 true,检测失败返回 false
例子
onewire.reset(0, true)
2.2.4 onewire.bit(id, send1bit)
发送 1 个 bit,或者接收 1 个 bit。
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
send1bit | int | 发送bit的电平:1高电平,0低电平,留空或者其他值,则是读1个bit |
返回值
如果是发送,则无返回;
如果是接收,则是接收到的电平。
例子
onewire.bit(0, 1) --发送1bit高电平
onewire.bit(0) --读取1bit数据
2.2.5 onewire.tx(id, data, is_msb, need_reset, need_ack)
主机发送多个字节的数据
参数
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
data | nt/string/zbuff | 需要发送的数据。如果是int,只能发送1个字节数据; 如果是zbuff,则是发送从开头到指针前的数据,如果指针是0则发送全部数据;如果是string,则发送整个字符串的数据。 |
is_msb | boolean | 是否需要先发送MSB,true是,false不是,默认情况下都是false |
need_reset | boolean | 是否需要先发送reset,true需要先reset,false不需要先reset |
need_ack | boolean | 是否需要检测应答信号,true需要检测,false不需要检测 |
返回值
检测到成功的应答返回 true,
检测应答失败返回 false;
无需检测返回 true
例子
--复位并检测ACK,接收到ACK后发送0x33
local succ = onewire.tx(0, 0x33, false, true, true)
--复位后发送0x33,无视从机是否ACK
local succ = onewire.tx(0, 0x33, false, true, false)
--直接发送0x33
local succ = onewire.tx(0, 0x33)
2.2.6 onewire.rx(id, len, cmd, buff, is_msb, need_reset, need_ack)
读取多个字节的数据
参数
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
len | int | 需要读取的字节数量 |
cmd | int | 在读取前发送命令,可以填nil不发送任何命令 |
data | zbuff | 接收数据缓存,接收前会清空整个缓存.如果填nil则输出字符串 |
is_msb | boolean | 是否需要先发送MSB,true是,false不是,默认情况下都是false |
need_reset | boolean | 是否需要先发送reset,true需要reset,false不需要 |
need_ack | boolean | 是否需要检测应答信号,true需要检测,false不需要 |
返回值
**返回值类型** | **解释** |
boolean | 检测到应答,或者无需检测返回true,失败或者参数错误返回false |
string | 如果data填nil,则接收数据从这里输出 |
例子
--先发送reset,检查ack信号,发送0x33,接收8个字节,这是DS18B20读ROM ID标准流程
local succ, rx_data = onewire.rx(0, 8)
--直接接收8个字节
local succ, rx_data = onewire.rx(0, 8, 0x33, buf, nil, true, true)
2.2.7 onewire.debug(id, onoff)
调试开关
参数
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号,如果只有一条则随意填写 |
onoff | boolean | true打开,false关闭 |
返回值
无
例子
onewire.debug(0, true)
2.2.8 onewire.deinit(id)
关闭单总线
参数
**名称** | **传入值类型** | **解释** |
id | int | 硬件单总线编号.如果只有一条则随意填写 |
返回值
无
例子
onewire.init(0) --关闭单总线
三、780EPM onewire 实际开发详细教程
780EPM 的实际开发教程,在如下链接:
http://docs.openluat.com/air780epm/luatos/app/driver/onewire/
如果你对 GPIO 已经非常熟悉,可以忽略如上教程。
如果你对 780EPM 的 GPIO 开发还比较陌生,阅读上面的教程,会让你快速建立 780EPM 的 GPIO 开发的技能。
(如下蓝色文字是对改进现有 GPIO 开发教程和 demo 代码的要求,需要合宙同事按照要求升级教程和 demo 案例,不用显示在对外的文档)
GPIO 教程的要求:
1, 读取 DS18B20 传感器的数据,onewire 总线只有一个传感器即可:
1.1 描述清楚 读取 onewire 总线的每个命令的含义;
1.2 解释清楚 AirSensor_DS18B20 的每个函数的含义。
四、780EPM onewire 的硬件电路设计说明
780EPM 的 GPIO 的电路设计说明,请参考如下链接:
https://docs.openluat.com/air780epm/luatos/hardware/design/onewire/
五、给新手的 GPIO 普及文档
如下内容,是给新手开发者阅读的。
如果你已经熟练掌握嵌入式开发,可以忽略下面的内容。