iic通信的深入理解(主从设备通信)

虽然之前也研究了先iic同行基本的时序你弄明白了,可是在机子写at24c02驱动的时候由于理解不够透彻出了点问题。

一.写数据

24c02的写入数据,可以看到主从设备iic中写的过程:起始信号->器件地址(7位地址加一个读写位)->等待应答->要操作内存的地址->等待应答->写入数据->等待应答->停止

时序图:

代码:

可是上面的程序中箭头所指的位置可以看出我们在一个write函数中发送了两次起始信号。

第一次起始信号之后我们只是寻址了从设备地址(就像是配对)配对完我们给了要写入数据的地址然后给了一个开始信号。

第二次起始信号后由于我们没有严格按照上面的通信协议(写器件地址)就直接发送数据由于此时我们没有寻址从器件地址(配对)那么我们直接写数据是无法成功的。

那么有人会纳闷了我们之前不是写入地址了吗怎么会无法写入数据了。

答案就是:你太弱了,没有理解24c04读写时序图(在编写iic通信器件驱动是严格按照从设备读写时序写)

在第一次起始信号时虽然我们寻址了器件地址和要写入的内存地址,可是我们在配对完成后有给了一个起始信号,那么相当于我们第一次的配对断开了第一次配对所设置的写数据地址那些不付出在。

在第二个起始信号中我们我们没有写器件地址你肯定的无法再特定内存段写入数据。

那么这个程序我们要怎么改了?

一种方法:去掉第二个起始信号相当于只开启了配对一次从设备。

另一种方法:你不想去掉第二个起始信号那么你就只需要在第二个起始信号后加上从-设备地址和要写内存段的地址就ok(注意两个地址必须加)这样的话相当于但你的第一次配对啥都没做(不提倡)如下图:

二.读数据

24c02中iic协议中读数据的过程:起始信号->器件地址(7+1位写(0))->应答->读取地址->应答->起始信号-.>器件地址(7位+读(1))->应答->读取数据->发送应答->停止信号

时序图:

附带代码:

注:iic——read函数自带应答。

注:在我们写从设备的与主设备通信iic驱动是一定要查看通信的时序(读写时序)而我们的代码其实就是按照时序来写。。

 转载请标明原贴出处:https://blog.csdn.net/zj490044512

猜你喜欢

转载自blog.csdn.net/zj490044512/article/details/83412901