i2c时序图_单片机编程时如何分析芯片的时序图?

fa083e424d28326d63e739d62ee48b4d.png 时序对于数字电路而言非常重要,可以说时序是数字电路正常工作的基础。说到时序,一般是指可编程器件的编程方法,在单片机编程时,需要根据被控芯片的时序去写程序,把芯片手册上规定好的时序用代码来实现,放可以实现单片机和芯片之间的通讯。下面以几种常用芯片的时序来简单介绍一下如何看懂时序。 IIC通讯的开始/结 束时序 IIC是常用的芯片间的通讯方式,也叫I2C,适合于PCB板内近距离的通讯,总共具有两跟线,可挂接不同地址的多个设备,其硬件连线如下图所示。

cb276d85a2393166af17923bc860db81.png

IIC在通讯时需要首先发送一个开始信号,数据结束时需要发送结束信号,开始和结束就在器件手册上就给出了时序图,在编程时就需要用C语言代码去实现开始和结束的时序,时序图如下所示。

d15c3863e5cc279ef57a2833f34063e2.png

SCL是IIC的时钟线,SDA是数据线,SDA数据如何传输需要在特定的SCL时序上。从图中可以看出,在开始时,必须SCL是高电平,而SDA是下降沿,这就是开始的时序。在发送结束信号时,必须让SCL为高电平,让SDA是上升沿,这就构成了结束信号。用C语言代码所实现的结束信号如下所示。

41329dcbcfb9873961b3af0600a027af.pngIIC数据传输时的时序

IIC在发送完开始信号后,就要开始发送数据,发送数据的过程也必须得遵守IIC的时序,IIC数据传输的时序如下图所示。

a0770d04f9509a8a122f474c7c8d0c2d.png

从时序图上,可以看出,在SCL为高电平期间是不允许SDA数据发生变化的,如果要改变SDA数据必须发在SCL为低电平期间。这就是这个时序图的含义。单片机在编程时要遵循这个规则才可以。 时序图是编程的依据,在写代码时必须要严格按照芯片手册上的时序图,否则通讯失败。所以,时序图这个东西要多看,多写代码。 33a1ce5dcad588dfb8d413c4ac526ef0.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于C51单片机和DS1302实芯片的数据读写时序图以及相应的代码实现: DS1302数据读写时序图: ``` _____ _____ _____ _____ _____ CE _| |_______| |_______| |_______| |_______| |_______ _______ _______ _______ _______ _______ SCLK | |_______| |_______| |_______| |_______| ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ IO ___|_| |___| |_|___|_| |_|___|_| |_|___|_| |_|___|_| |___ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ __ __ __ __ __ __ __ __ __ __ D7 D6 D5 D4 D3 D2 D1 D0 R/W ST ``` 根据上面的时序图,我们可以编写DS1302数据读写的代码。 DS1302数据读取代码实现: ```c #include <reg52.h> #include <intrins.h> sbit DS1302_CE = P2 ^ 7; // DS1302 CE 引脚 sbit DS1302_IO = P2 ^ 6; // DS1302 IO 引脚 sbit DS1302_SCLK = P2 ^ 5; // DS1302 SCLK 引脚 // 从DS1302读取数据 unsigned char DS1302_Read(unsigned char address) { unsigned char i, dat = 0; DS1302_CE = 0; // 拉低CE DS1302_SCLK = 0; // 拉低SCLK DS1302_CE = 1; // 拉高CE DS1302_IO = 0; // 写入读取命令 DS1302_SCLK = 1; // 拉高SCLK DS1302_SCLK = 0; // 拉低SCLK address = address & 0xFE; // 清除最低位,设置为读取命令 for (i = 0; i < 8; i++) // 写入地址 { DS1302_IO = address & 0x01; address = address >> 1; DS1302_SCLK = 1; DS1302_SCLK = 0; } for (i = 0; i < 8; i++) // 读取数据 { dat = dat >> 1; if (DS1302_IO) { dat = dat | 0x80; } DS1302_SCLK = 1; DS1302_SCLK = 0; } DS1302_CE = 0; // 关闭DS1302 return dat; } ``` DS1302数据写入代码实现: ```c #include <reg52.h> #include <intrins.h> sbit DS1302_CE = P2 ^ 7; // DS1302 CE 引脚 sbit DS1302_IO = P2 ^ 6; // DS1302 IO 引脚 sbit DS1302_SCLK = P2 ^ 5; // DS1302 SCLK 引脚 // 向DS1302写入数据 void DS1302_Write(unsigned char address, unsigned char dat) { unsigned char i; DS1302_CE = 0; // 拉低CE DS1302_SCLK = 0; // 拉低SCLK DS1302_CE = 1; // 拉高CE DS1302_IO = 0; // 写入写入命令 DS1302_SCLK = 1; // 拉高SCLK DS1302_SCLK = 0; // 拉低SCLK address = address | 0x01; // 设置最低位,设置为写入命令 for (i = 0; i < 8; i++) // 写入地址 { DS1302_IO = address & 0x01; address = address >> 1; DS1302_SCLK = 1; DS1302_SCLK = 0; } for (i = 0; i < 8; i++) // 写入数据 { DS1302_IO = dat & 0x01; dat = dat >> 1; DS1302_SCLK = 1; DS1302_SCLK = 0; } DS1302_CE = 0; // 关闭DS1302 } ``` 上述代码中的 `address` 为DS1302芯片的寄存器地址,`dat` 为要写入的数据。在使用,可以根据需要调用相应的函数对DS1302芯片进行读取和写入操作。 注意:在使用DS1302芯片,需要先进行初始化操作,设置钟的初始值。具体操作可以参考DS1302芯片的数据手册

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值