极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 614|回复: 6

I2C的问题

[复制链接]
发表于 2017-12-1 03:14:09 | 显示全部楼层 |阅读模式

请问I2C通信的时候,接收信息的时候只能触发一个函数吗?

比如下图,设备3发送信息给设备1,设备1接收信息的函数指定的FuncA(). 能不能在设备3里发送信息的时候指定设备1的接收函数为FuncB\FuncC?

WechatIMG143.jpeg
回复

使用道具 举报

发表于 2017-12-3 18:43:34 | 显示全部楼层
Stormer 发表于 2017-12-2 14:55
谢谢了解了! 我现在就是用特殊的字符来做分割多个参数,然后接收到以后根据不同的参数再去调用相应的 ...

i2c 通讯的主从关系, 从 Wire.begin 时就决定了, 你现在的做法, 两者都是从机设定.
设定主从关系, 应该是这样的:

主机:  Wire.begin();
       
从机: Wire.begin(ADDRESS);
       
因为通道上只可以有一个主机, 而一切通讯均由主机操控, 主机是不需要地址的.
之後的通讯, 都应该由主机发动, 决定那一个从机可以使用通道传送.
而从机应该在接收到主机的指令, 才可以使用通道, 而它的传送对象, 亦只可以是主机.

你现在由从机自己启动传送, 如果通道上有多於一个如此乱来的从机, 通讯就会出问题了.
所以, 主从的设定要清楚, 不可以乱来的.
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-1 22:13:41 | 显示全部楼层
本帖最后由 Super169 于 2017-12-1 22:20 编辑

(奇怪, 打了一断文字, 每次都中断了.  可能因为是繁体的缘故.)

两个 i2c slave 之间通讯, 真的有点那个, 可以成功只可以说是好运吧, 建议你先了解一下 i2c 通讯的基本设定, master 及 slave 之间的关系.

假设你设定正确, 如果 slave 可以提供不同资料 (你的情况, 可能是执行不同 func).
只要 master 先向 slave 发出一次 write, 把要求送出.  比如 0 是 funcA, 1 是 funcB, 2 是 funcC.
然後才发出 requestForm, 而 slave 就可以跟据 master 之前发来的资料, 决定回传时执行的程式.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-2 14:55:54 | 显示全部楼层
本帖最后由 Stormer 于 2017-12-2 14:57 编辑
Super169 发表于 2017-12-1 22:13
(奇怪, 打了一断文字, 每次都中断了.  可能因为是繁体的缘故.)

两个 i2c slave 之间通讯, 真的有点那个, ...


谢谢了解了! 我现在就是用特殊的字符来做分割多个参数,然后接收到以后根据不同的参数再去调用相应的函数。

现在是可以正常工作的。感觉3号机应该算是从机了吧,1号是主机。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-3 19:09:33 | 显示全部楼层
Super169 发表于 2017-12-3 18:43
i2c 通讯的主从关系, 从 Wire.begin 时就决定了, 你现在的做法, 两者都是从机设定.
设定主从关系, 应该 ...

原来是这样,学习了。 我一直以为主机的地址是1.

那在从机里给主机发送信息的时候,Wire.beginTransmission(?); 这里的地址该怎么写?主机的地址是什么?
回复 支持 反对

使用道具 举报

发表于 2017-12-3 20:16:35 | 显示全部楼层
Stormer 发表于 2017-12-3 19:09
原来是这样,学习了。 我一直以为主机的地址是1.

那在从机里给主机发送信息的时候,Wire.beginTransmi ...

主机是不用地址的, 因为所有从机, 都只可以跟主机通讯.
所以, 你要先决定一台控制流程的主机, 其他都是从机, 发送资料的主动权都在主机上.

通讯的过程, 首先是主机向从机发出请求, 而从机收到请求就回传资料.
以确保通道上, 只会有一台机在使用.

之前在学习过程中, 我也记录了 i2c 通讯的方式, 由简单一个 byte 以至较复杂的(例如浮点)都有.
虽然有些地方可能有点不足, 但对建立基本 i2c 通讯应该是足够的, 你有兴趣可以看看:
http://arduino169.blogspot.hk/2015/07/arduino-i2c.html

以下部份都完成了:
(1) I2C 地址设定 及 I2C 地址扫瞄
(2) 由 master 向 slave 发送资料/发出指令 [slave 直接处理]
(3) 由 master 向 slave 发送资料/发出指令 [slave 延迟处理]
(4) 由 master 向 slave 要求资料回传
(5) master 向 slave 要求不同资料
(6) 由 master 提供参数, 再由 slave 作出相应的回复
(7) 单片机有效传送数据的选择
(8) 浮点的传送
(9) I2C 通讯实例(一) 简单传感数据收集 (把非 i2c 传感变成 i2c)
回复 支持 反对

使用道具 举报

发表于 2017-12-7 10:03:35 | 显示全部楼层
Super169 发表于 2017-12-3 20:16
主机是不用地址的, 因为所有从机, 都只可以跟主机通讯.
所以, 你要先决定一台控制流程的主机, 其他都是 ...

很好的blog, good job!
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2017-12-15 22:10 , Processed in 0.044585 second(s), 9 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表