找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2094|回复: 4
打印 上一主题 下一主题
收起左侧

用LED玩通弄懂I2C总线

[复制链接]
跳转到指定楼层
楼主
ID:266429 发表于 2020-1-30 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
思路其实蛮简单的。
我们知道,I2C对时序要求是严格的,但对时间没有要求,即每一个动作之间的时间间隔没有要求,于是,我们可以把每一个动作放慢到我们利于肉眼可以观测的速度,并用LED来显示每一个步骤及端口的电位变化。
具体说来,就是将每一步SDASCL端口的电位,送入另外的两个端口,这两个端口分别接有LED,比如,我们用P1.0作为总线的SCL端口,用P1.2作为SDA端口,用P1.5作为SCL电位显示的端口(标记为LSCL,P1.6作为SDA电位显示的端口(标记为LSDA;P2作为发送或接收的数据的显示端口,每发送一位或接收一位,就显示在P2端口的LED上。
如果你自己搭建电路,需要注意的是,SDASCL端口一定要接上拉电阻。
每一步延时的时间,可以设为1s,看你自己喜欢。
编写程序时,我们可以直接写入器件寻址及写入器件命令值10100000B值,最后通过观测LSDA的亮灭来检验你的程序是否正确。
对于初练I2C的人来说,建议先一步步硬写这段程序,程序流程如下:
SDA高电位;
SDA送入LSDA
SCL高电位;
SCL送入LSDA
延时;
SDA低电位;取得总线控制权
LSDA=SDA
延时;
SCL0;为SDA上放数据作好准备
LSCL=SCL
延时;
SDA1;数据的第7
LSDA=SDA
P2.7=SDA;送入数据显示LED最高位
短延时;有几个空操作就够了
SCL=1;
LSCL=SCL;
DELAY1S;
SCL=0;
LSCL=SCL;
DELAY1S;
以上第7位就发送完了,按上面从“置SDA1”开始的程序,将剩下的7位全部发送完成,这样就将10100000B发送完成。然后,运行并观测所有LED灯的显示是否符合你的设计,最终LSDA应处于灭状态。如果你送入的是10100001B(读)数值,则最后LSDA处于亮状态。
没问题后,再加写三条程序
SDA=1
LSDA=SDA;
DELAY1S;
再运行,完成后LSDA应处于灭状态。
没问题后,再加写以下程序:
SCL=1;
LSCL=SCL;
DELAY1S;
LSDA=SDA;
DELAY1S;
再运行,完成后LSDA依然处于灭状态。
再加写以下程序:
SCL=0;
LSCL=SCL;
DELAY1S;
LSDA=SDA;
DELAY1S;
再运行,完成后LSDA处于亮状态。说明从器件是在SCL的下降沿读取SDA的值。
至此,我们的实验基本就算达成了目的,后面的写数据也好读数据也好,在此基础上编写就是了。
此慢动作的方法,其实适用于任何数据传输协议的探究与学习,无非是对于固定波特率的协议,在编程中进行人为加个放大的时间倍率就是了。
前面有个贴子,说是教科书中有错误,而这个试验,就是对其的论证。
另外说明一下,上面的流程,即不是C也不是汇编,你按这个流程,选择你喜欢的语言来编程就是了。还有你可以输入10100001B来一步一步地试验。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:266429 发表于 2020-1-31 08:47 | 只看该作者
这种慢动作的玩法,还可以用于新的通讯协议的开发中,先用慢动作进行研发,成功后再确定其时间间隔。
回复

使用道具 举报

板凳
ID:88606 发表于 2020-1-31 12:51 | 只看该作者
加上仿真更直观
回复

使用道具 举报

地板
ID:561971 发表于 2020-1-31 12:52 | 只看该作者
很好的思路,值得推广
回复

使用道具 举报

5#
ID:266429 发表于 2020-1-31 15:29 | 只看该作者
搭建了个面包板,但不会发图片。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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