9146|16

1万

帖子

24

TA的资源

版主

楼主
 

[ESP8266]I2C [复制链接]

 
 
class I2C

I2C 是设备之间的两线通信协议。在物理层它只需要两个信号线: SCL 和 SDA,分别是时钟和数据线。

I2C 对象关联到总线,它可以创建时初始化,也可以稍后在初始化。


构造函数

  • class machine.I2C(scl, sda, *, freq=400000)
    创建并返回新的 I2C 对象,参数部分可以参考下面的初始化函数。

方法


  • I2C.init(scl, sda, *, freq=400000)
    初始化 I2C:
    • scl 代表 SCL 引脚
    • sda 代表 SDA 引脚
    • freq 代表 SCL 时钟速率
注: 实际上第一个参数默认是SDA,或者用scl强制指定Pin。

  • I2C.scan()
    扫描 0x08 到 0x77 之间的 I2C 地址,并返回设备列表。如果收到地址后设备拉低 SDA (包括读取位) 代表设备有响应。


原始 I2C 操作

下面方法执行原始的 I2C 主操作,它们可以组合产生各种 I2C 事务。提供这些方法是可以更好的控制总线,否则使用标准方法就足够。

  • I2C.start()
    在总线上发送 start 位 (当 SCL 是高时 SDA 变低)。

  • I2C.stop()
    发送停止位 (当 SCL 是高时 SCL 变高)。

  • I2C.readinto(buf)
    从总线上读取数据并存放到 buf,读取的数量是 buf 的长度。接收到倒数第二个数据时发送 ACK 信号,接收到全部数据后发送 NACK 信号。

  • I2C.write(buf)
    写入缓冲区数据到总线。每发送一个字节后将检查是否收到 ACK,如果没有收到将引发 OSError 异常。


标准总线操作

下面方法是标准的 I2C 主模式读写操作。

  • I2C.readfrom(addr, nbytes)
    从指定地址设备读取数据,返回读取对象。

  • I2C.readfrom_into(addr, buf)
    从指定地址设备读取数据到缓冲区,读取的数量是 buf 的长度。

    只有 WiPy 返回读取数据的数量,其他模块都返回 None。


  • I2C.writeto(addr, buf, *, stop=True)
    写入数据到设备。stop 参数 (仅 WiPy) 代表发送完成后需要再发送停止位。

    只有 WiPy 返回读取数据的数量,其他模块都返回 None。

内存操作

某些 I2C 设备作为存储设备 (或一组寄存器) ,可以读取或者写入。这种情况下,有两个地址和 I2C 事务相关: 从设备地址和内存地址。下面方法用于和这些设备进行通信。

  • I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)
    读取从设备 addr 的内存地址 memaddr 数据,addrsize 指定地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位),返回读取数据的字节对象。

  • I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)
    读取从设备 addr 的内存地址 memaddr 数据到缓冲区,addrsize 指定地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位),读取数据数量是buf的长度。

    在 WiPy 上返回值是读取数据数量,其他模块都返回 None。

  • I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)
    写入 buf 到从设备 addr 的内存 memaddr,addrsize 代表地址大小 (在 ESP8266 上这个参数无效,地址大小总是 8 位)。

    在 WiPy 上返回值是读取数据数量,其他模块都返回 None。



参考例子


from machine import Pin, I2C

i2c = I2C(Pin(14), Pin(2))
i2c = I2c(scl = Pin(2), sda = Pin(14), frq = 100000)

i2c.scna()
buf = bytearray(1)
buf[0] = 0xAA
i2c.writeto(0x77, buf)
i2c.readfrom(0x77, 1)



最新回复

使用Primitive I2C operations可以解决这种问题。按部就班的调用:I2C.start(),I2C.write(buf),I2C.stop()。这种情况下写到总线上的数据就是原生的数据。   详情 回复 发表于 2021-6-16 18:47
点赞 关注
 
 

回复
举报

1万

帖子

24

TA的资源

版主

推荐
 
strong161 发表于 2016-8-2 13:43
D威武,看micopython 论坛里面D已经写好STM32F767的文件了,D大最近是要上nucleo767,手上正有一块,坐等D ...

固件先放出来,给你参考

https://bbs.eeworld.com.cn/thread-496686-1-1.html

点评

谢谢呀,有空我也好好学下makefile  详情 回复 发表于 2016-8-3 11:47
 
 
 

回复

1297

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
这句话不明白,为什么用scl指定sda。(注: 实际上第一个参数默认是SDA,或者用scl强制指定Pin。)
 
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
i2c = I2C(Pin(14), Pin(2))
i2c = I2c(scl = Pin(2), sda = Pin(14), frq = 100000)

这 2 行不太能理解

点评

@johnrey @ slotg 两个一起回答了: 在pyb中,是指定I2C模块的序号,如: i2c = I2C(1) 在ESP8266中,内核和系统资源与STM32差异较大,在I2C中,不能直接指定I2C模块序号,需要自己指定使用的GPIO。 I2C  详情 回复 发表于 2016-7-31 21:02
 
 
 

回复

1万

帖子

24

TA的资源

版主

4
 
本帖最后由 dcexpert 于 2016-7-31 21:03 编辑
slotg 发表于 2016-7-31 20:41
i2c = I2C(Pin(14), Pin(2))
i2c = I2c(scl = Pin(2), sda = Pin(14), frq = 100000)

这 2 行不太能理 ...

@johnrey @ slotg 两个一起回答了:
在pyb中,是指定I2C模块的序号,如:

i2c = I2C(1)

在ESP8266中,内核和系统资源与STM32差异较大,在I2C中,不能直接指定I2C模块序号,需要自己指定使用的GPIO。


I2C需要指定SDA和SCL两个引脚,就是两个参数。默认第一个参数是SDA,第二个是SCL(官方文档写反了)。但是也可以自己指定某个参数代表哪个功能,也就是说下面两个用法其实效果是一样的。

i2c = I2C(Pin(14), Pin(2))
i2c = I2c(scl = Pin(2), sda = Pin(14), frq = 100000)

可能实际区别不大,只是可以更好符合官方文档的习惯吧。


点评

(官方文档写反了) 理解了  详情 回复 发表于 2016-7-31 21:16
 
 
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

5
 
dcexpert 发表于 2016-7-31 21:02
@johnrey @ slotg 两个一起回答了:
在pyb中,是指定I2C模块的序号,如:

i2c = I2C(1)

在ESP8266 ...

(官方文档写反了)

理解了
 
 
 

回复

280

帖子

0

TA的资源

一粒金砂(高级)

6
 
python里面的参数传递有1种叫关键字参数,与一般的位置参数不同,关键字参数需要使用关键字指定参数,不需要位置区分。
 
 
 

回复

2774

帖子

8

TA的资源

版主

7
 
D威武,看micopython 论坛里面D已经写好STM32F767的文件了,D大最近是要上nucleo767,手上正有一块,坐等D大放固件,不会 makefile 制作固件搞不来。

点评

固件先放出来,给你参考 https://bbs.eeworld.com.cn/thread-496686-1-1.html  详情 回复 发表于 2016-8-2 23:23
 
 
 

回复

2774

帖子

8

TA的资源

版主

9
 
dcexpert 发表于 2016-8-2 23:23
固件先放出来,给你参考

https://bbs.eeworld.com.cn/thread-496686-1-1.html

谢谢呀,有空我也好好学下makefile

点评

自己动手,丰衣足食。  详情 回复 发表于 2016-8-3 21:08
 
 
 

回复

1万

帖子

24

TA的资源

版主

10
 
strong161 发表于 2016-8-3 11:47
谢谢呀,有空我也好好学下makefile

自己动手,丰衣足食。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
请问,我想知道如何给tea5767发送i2c的频率信息?

点评

具体要求是怎样的?  详情 回复 发表于 2019-2-27 23:31
 
 
 

回复

1万

帖子

24

TA的资源

版主

12
 
neemxyang 发表于 2019-2-27 20:41
请问,我想知道如何给tea5767发送i2c的频率信息?

具体要求是怎样的?
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢分享,学习了
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

14
 
i2c.writeto函数仅支持地址长度为7位的器件,调用这个函数时,发送的地址会自动左移,并且低位补0。像TM1680的地址长度为8位,且地址低位位1的情况,该怎么操作呢?

点评

有一些非标准的I2C芯片,是无法使用这些标准I2C函数的,只能单独写一个驱动,建议换个芯片。  详情 回复 发表于 2021-6-15 21:43
 
 
 

回复

1万

帖子

24

TA的资源

版主

15
 
yangwenchao2000 发表于 2021-6-15 20:14 i2c.writeto函数仅支持地址长度为7位的器件,调用这个函数时,发送的地址会自动左移,并且低位补0。像TM168 ...

有一些非标准的I2C芯片,是无法使用这些标准I2C函数的,只能单独写一个驱动,建议换个芯片。

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

16
 
dcexpert 发表于 2021-6-15 21:43 有一些非标准的I2C芯片,是无法使用这些标准I2C函数的,只能单独写一个驱动,建议换个芯片。

使用Primitive I2C operations可以解决这种问题。按部就班的调用:I2C.start(),I2C.write(buf),I2C.stop()。这种情况下写到总线上的数据就是原生的数据。

点评

除非实在没有选择,这样做意义不大。  详情 回复 发表于 2021-6-16 23:22
 
 
 

回复

1万

帖子

24

TA的资源

版主

17
 
yangwenchao2000 发表于 2021-6-16 18:47 使用Primitive I2C operations可以解决这种问题。按部就班的调用:I2C.start(),I2C.write(buf),I2C.sto ...

除非实在没有选择,这样做意义不大。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表