I2C学习笔记-基于51单片机

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33472414/article/details/101391733

I2C起始信号
在这里插入图片描述
代码:
在这里插入图片描述
说明:
1.起始信号是SCL线在高电平期间,SDA线从高电平到低电平的一个跳变
2.跳变之前,SCL和SDA都要在高电平,且保持时间 > 4.7us
3.跳变之后,SCL线是高电平,SDA线是低电平,且保持时间 > 4us
4.SCL线置为低电平
所以起始信号后:SCL 和 SDA都是0


I2C写一个字节数据:
在这里插入图片描述
代码:
在这里插入图片描述
在这里插入图片描述
分析:
1.发送1 byte的数据,是从数据的最高位开始发送的
2.起始信号之后,SCL和SDA都在低电平,此时SDA线上面的电平是可以变化的,所以首先把数据放到SDA上去
3.这里我们先取出数据的最高位 使用>>7的方式,然后<<1,去掉最高位
4.然后SCL置为高电平,保持SDA线上的电平稳定,保持时间 > 4.7us
5.然后把SCL=0,然后再把下一个bit的数据发出去,依次类推,发出8bit的数据出去。发送完了之后,SCL线是低电平的
6.实际测试过程中发现,当主站把SCL线拉低的时候,SDA线马上就会被从站拉低,所以从示波器分析来的。
7.所以代码中 SDA = 1,是看不到SDA为高电平的
8.然后,我们把SCL拉高,也就是第9个周期,此时SDA线还是低电平,while(SDA)不会进去,SCL =0, 电平应保持 > 4us
9.然后while(SDA)之后,SCL就被拉低了
10.SCL拉低时,从站马上松开SDA,SDA变为高电平
总结: 发送完一个字节之后,SCL=0 SDA=1,SCL线是低电平,SDA线是高电平


I2C终止信号
1.当I2C发送完数据的时候,SCL =0,SDA =1
2.I2C停止信号是 SCL在高电平的时候,SDA从低电平到高电平的跳变
在这里插入图片描述
在这里插入图片描述
分析:
1.首先把SDA = 0,然后把SCL=1
2.SCL=1的保持时间要>4us
3.然后SDA=1,此时SCL和SDA都是1,保持时间>4.7us
4.终止信号之后,SCL=SDA=1


I2C读一个字节数据
在这里插入图片描述
分析:
1.发送完一个字节之后,SCL=0,SDA=1, 因为从站ACK之后,会释放SDA,所以SDA=1,此时SCL=0,slave应该把数据放到SDA上
2.然后SCL=1,此时要求slave放到SDA线上的数据稳定,然后读SDA线上的数据
3.读到SDA线上的数据之后,然后继续SCL=0,等待slave把数据放到SDA上,然后再SCL=1,读取SDA数据,依次读8次,就是1个字节
4.读完之后,我们把SDA=1(主站不发ack信号),然后SCL=1期间,SDA=1,表示主站不发ack信号
5.这里的ack信号并不是告诉slave有没有读到,而是告诉slave要不要继续发数据,当SDA=1,表示无ack,slave不会继续发数据,
如果SDA=1,表示主站有ack,则slave会继续发送数据到主站。
6.之后把SCL=0,SDA会跳到低电平
7.若此时有stop信号,则首先要把SCL=1,然后再让SDA从0变为1,表示stop信号


主机数据发送流程:
I2C发送数据流程
在这里插入图片描述
在这里插入图片描述
**AT24C20发送流程: **
在这里插入图片描述
为什么写入首地址之后,就可以一直去发送数据?按正常道理来说每个周期都是先发地址,然后发数据啊
AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1
AT24C02 分析:
1.首先发送start信号
2.然后发送丛机地址
3.最后发送写入地址
4.发送数据
AT24c2中:
发数据的时候,先要发写入的首地址,之后就可以发数据了,而且是可以一直发数据的,因为:AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1


主机数据接收流程:
I2C接收流程有两种方式:
在这里插入图片描述
AT24C2读取数据:
在这里插入图片描述
因为我们在传输的过程中,需要改变传输方向,所以选的是c
在这里插入图片描述
AT24C02 分析:
1.首先产生start信号
2.发送写器件地址(这里要把读取地址写到slave)
3.发送要读取的地址
4.start
5.发送读器件地址
6.读取数据
7.stop

猜你喜欢

转载自blog.csdn.net/qq_33472414/article/details/101391733