跳转至

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 普及文档

如下内容,是给新手开发者阅读的。

如果你已经熟练掌握嵌入式开发,可以忽略下面的内容。

http://docs.openluat.com/embedded/interface/onewire/