Arduino IIC协议笔记

以下内容大多为网络收集和整理,为个人学习笔记复习使用

IIC协议

物理拓扑结构


他由3根线组成分别叫SDA,SCL,GND,SDA为数据线,SCL为时钟线,GND为参考电平,就是0电平

通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平

总线特征

I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址**(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。

I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输

协议

总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件

数据的传输

主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据

总线操作

第一,主设备往从设备中写数据。数据传输格式如下:

第二,主设备从从设备中读数据。数据传输格式如下:

第三,主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

主发从收:

主机发送  START 信号-> 主机发送地址-> 从机发送ACK应答
-> (主机发送数据 -> 从机发送ACK应答(循环)) -> 主机发送STOP信号
或 主机发送 START 信号启动下一次传输

主收从发:

主机发送 START 信号-> 从机发送发地址 -> 主机发送ACK应答 -> (从机发送数据
-> 主机发送ACK应答 (循环)) -> 接受至最后一个字节时,主机发送NACK -> 主机发送STOP 信号或 主机发送START信号 启动下一次传输

wire库

Arduino的IIC通信使用wire库,该库包含以下方法:

begin()

requestFrom()

beginTransmission()

endTransmission()

write()

available()

read()

onReceive()

onRequest()

arduino型号的IIC引脚定义:

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

Wire.begin() 建立连接

代码示例

主收从发

主收

#include <Wire.h>
void setup()
{
Wire.begin();        // join i2cbus (主机,不用写IIC地址)
Serial.begin(9600);  // 串口输出
}
void loop()
{
Wire.requestFrom(2, 6);    // 要求2号IIC设备,通过Wire传送 6个 char过来
while(Wire.available())    // 如果Wire上有 char 等读取
  {
char c = Wire.read(); // 从Wire 上读取一个char
Serial.print(c);      //输出到串口监视器查看
  }

delay(5500);  // 等5.5秒
Serial.println( ); // 输出到下一行方便查看
} // loop

从发

#include <Wire.h>
void setup()
{
Wire.begin(2);   //通知IIC总线, 是2 号IIC设备地址
Wire.onRequest(ggyy); // 注册当收到主机信息时相应的调用函数ggyy( )
}
void loop()
{
  // 从机,代码空
}
// 信息处理函数,必须在 setup( ) 內用onRequest( ) 注册
void ggyy()
{
Wire.write("Hello "); // 送出 6 个char给IC 上的主机
} // loop

写代码步骤

(1)要在 setup( ) 内用Wire.begin( ) 加入 IIC 通讯
(A)Master 只要这样Wire.begin( );
(B)Slave 要用一个 1 到 127 的整数当作参数, 代表 Slave 的address,
例如
Wire.begin(2); // 我是2 号地址

(2)要由 Master 下命令要求Slave 送数据过来,
例如:
Wire.requestFrom(2,6); // 要求 2号透过Wire 送 6 个char 过来
但是, 请注意, 这里的 6 其实只是一个byte 的命令, 只是"希望"从机送 6 byte (最多只可要求32 byte)
这里的 6 到底是啥意思是由Master 和 Slave 的程序设计者自己约定好即可

Wire.requestFrom(); 只是送个命令(一个 byte)给某个Slave,
然后等着,直到至少一个char 送过来或 time out 才会往下做下一行
所以, 这时 Master 在这句下方要用Wire.read( ) 读取数据

Wire.requestFrom(); 会回传一个整数, intkkk = Wire.requestFrom(2, 6);
然后检查实际收到几个 byte 的kkk 是否为 0, 是表示 timeout 都没收到任何 byte

(3) Slave 应该如何响应主人Master的命令
官网的范例不管 Master 送过来是啥, 直接用 requestEvent() 函数送回6 bytes
比较正确的方法应该是:
(A) Master 在下达命令.requestFrom(从机地址, 几byte); 之前:

  • (A1)先用 .beginTransmission( ) + .write( ) ...+ .endTransmission( ) 送一个讯息去给 Slave,
  • (A2)然后紧接着下达 .requestFrom(从机地址, 几 byte); 的命令;

(B)在Slave 这边相对应于 (A)Master 的动作如下:

  • (B1)透过 Wire.onReceive (注册接收函数); 所注册的函数把(A1) 的信息收下来
    -(B2)透过 Wire.onRequest (注册送讯息函数); 所注册的函数送数据去给 Master,
    但是, 应该根据(B1)所接收的信息(通常是从机或传感器的寄存器编号)决定要送的数据

(C)在 Master 这边于.requestFrom( ); 之后用 while 检查Wire.available( ) 并用 Wire.read( ) 接收数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 总线 计算机的各个功能部件通过总线连接在一起构成完整的计算机系统,总线是多个系统功能部件之间进行数据传送的公共通路...
    罗蓁蓁阅读 4,808评论 0 10
  • SPI(Serial Peripheral Interface,串行外设接口) SPI是一种高速、全双工、同步、串...
    NooneIam阅读 1,349评论 0 3
  • 在使用单片机的过程中,I2C 通信可以说是最被广泛使用和采纳的协议之一,采用 I2C 协议可以占用更少的资源,链接...
    noparkinghere阅读 2,166评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 姓名:周崇杰 学号:16040120059 专业:机械设计制造及其自动化 转载自:http://blog.cs...
    CJbaby阅读 2,861评论 0 5