单片机 I2C通信
这是一份I2C说明书上的截图高电压和那些时间的关系有干什么简单的说,我不懂这个图的意思。可以高人帮忙解答下!其实我是想知道电平不同是带代表什么意思那是不是不同电压的读写周...
这是 一份I2C 说明书上的截图
高电压和那些 时间的关系
有干什么
简单的说,我不懂这个图的意思。
可以高人帮忙解答下!
其实我是想知道 电平不同是 带代表什么意思
那是不是不同电压的 读写周期 展开
高电压和那些 时间的关系
有干什么
简单的说,我不懂这个图的意思。
可以高人帮忙解答下!
其实我是想知道 电平不同是 带代表什么意思
那是不是不同电压的 读写周期 展开
4个回答
展开全部
I2C的时序是比较复杂的,你如果能把I2C的时序弄清,那其他器件的时序都不成问耐返题了。
我就按照我的理解来跟你讲吧。
直接用程序来说明吧。
NOP(),一个机器周期时间的延迟,12M晶振时为1微秒
NOPS(),4个NOP()。
sbit SDA P2^0;
sbit SCL P2^1; 定义数据线和时钟线接口
首先,I2C有2个重要的线,SDA数据线SCL时钟线,当总线上没有进行信息传送时,SDA和SCL都为高电平,我们称之为释放总线。
开始传送信息时,要有一个开始信号,
开始信号 :定义为在SCL为高电平的时候,SDA从高电平拉低。
start()
{
SDA=1;
NOP(); //同你图中 SDA/SCL上升/下降所用时间 1US
SCL=1;
NOPS(); //建立开始信号(同你图中TSU起始信号建立时间一样4US)
SDA=0; //SDA拉低
NOPS();
SCL=0; //SCL拉低, 钳住总线,准备发送或接收数据
NOP();
}
结束信号:与开始信号相反,在SCL为高电平时,SDA从低拉高
stop()
{
SDA=0;
NOP();
SCL=1;
NOPS(); //建立信号时间
SDA=1; //拉高 结束。
NOPS();
}
我晕,发现昌拿饥写了半天还有好多。。算了 帮人帮到底了
发送/接收一个数据:数据的发送和接收都是在SCL为低电平的时候发生,因为SCL为高电平时已给了开始和结束信号。发送数据时,当数据准备读入时,将SCL线暂时拉高(SCL为高时,SDA无法改变状态),保持一段时间然后拉低(同你图中的TDH,数据输出保持时间),这时数据则发送完毕到SDA上。接收则与之大同小异。当SDA线上有数据过来时,先将SCL拉高,建立好时间,然后拉低,数据则被读入。(关于如何被发出以及如何被读入则是芯片做的事,我们不用敏腔管,只需记住SCL拉低,数据发出/读入)
用程序来讲就是:
send(uchar c) //发送一个字节
{
uint i;
for(i=0;i<8;i++) //该字节8位从高往低发送
{
if((c<<i)&0x80) SDA=1;
else SDA=0;
NOP();
SCL=1; //建立信号时间
NOPS();
SCL=0; //发送完毕
}
}
recieve()
{
uchar r;uint i;
r=0;SDA=1;
for(i=0;i<8;i++) //读取8位数据
{
NOP();
SCL=0;
NOPS();
SCL=1;
NOP();
r<<=1;
if(SDA==1) r+=1;
NOP();
}
SCL=0;
NOP();
return (r);
}
程序可能有点难懂,不过没关系,使用I2C时候,直接调用写好的程序,如我写的 start.stop.send receive 等,这些程序应该有现成的。
发送一个字节后会有一个应答函数,应答函数定义为,当发送完一个字节也就是8位的时候,如果这是SDA为低电平,则为有应答,反之则无。如果要发送多个字节,一个字节发完后需要一个应答函数才能继续发下面一个字节。程序也就大同小异。掌握好时序就行了。
I2C用的最多的就是E2PROM了。
给你举个例子
如果我想往E2PROM的0x50单元写一个‘a’,则我这样写:
start(); //开始
send(0xa0); //选择我要发送的器件。0xa0为E2PROM的器件地址
answer(); //应答
send(0x50); //选择E2PROM中的0X50地址单元
answer(); //应答
send('a'); //发送数据‘a’
stop(); //停止
好累。。。。。就写这么多
我就按照我的理解来跟你讲吧。
直接用程序来说明吧。
NOP(),一个机器周期时间的延迟,12M晶振时为1微秒
NOPS(),4个NOP()。
sbit SDA P2^0;
sbit SCL P2^1; 定义数据线和时钟线接口
首先,I2C有2个重要的线,SDA数据线SCL时钟线,当总线上没有进行信息传送时,SDA和SCL都为高电平,我们称之为释放总线。
开始传送信息时,要有一个开始信号,
开始信号 :定义为在SCL为高电平的时候,SDA从高电平拉低。
start()
{
SDA=1;
NOP(); //同你图中 SDA/SCL上升/下降所用时间 1US
SCL=1;
NOPS(); //建立开始信号(同你图中TSU起始信号建立时间一样4US)
SDA=0; //SDA拉低
NOPS();
SCL=0; //SCL拉低, 钳住总线,准备发送或接收数据
NOP();
}
结束信号:与开始信号相反,在SCL为高电平时,SDA从低拉高
stop()
{
SDA=0;
NOP();
SCL=1;
NOPS(); //建立信号时间
SDA=1; //拉高 结束。
NOPS();
}
我晕,发现昌拿饥写了半天还有好多。。算了 帮人帮到底了
发送/接收一个数据:数据的发送和接收都是在SCL为低电平的时候发生,因为SCL为高电平时已给了开始和结束信号。发送数据时,当数据准备读入时,将SCL线暂时拉高(SCL为高时,SDA无法改变状态),保持一段时间然后拉低(同你图中的TDH,数据输出保持时间),这时数据则发送完毕到SDA上。接收则与之大同小异。当SDA线上有数据过来时,先将SCL拉高,建立好时间,然后拉低,数据则被读入。(关于如何被发出以及如何被读入则是芯片做的事,我们不用敏腔管,只需记住SCL拉低,数据发出/读入)
用程序来讲就是:
send(uchar c) //发送一个字节
{
uint i;
for(i=0;i<8;i++) //该字节8位从高往低发送
{
if((c<<i)&0x80) SDA=1;
else SDA=0;
NOP();
SCL=1; //建立信号时间
NOPS();
SCL=0; //发送完毕
}
}
recieve()
{
uchar r;uint i;
r=0;SDA=1;
for(i=0;i<8;i++) //读取8位数据
{
NOP();
SCL=0;
NOPS();
SCL=1;
NOP();
r<<=1;
if(SDA==1) r+=1;
NOP();
}
SCL=0;
NOP();
return (r);
}
程序可能有点难懂,不过没关系,使用I2C时候,直接调用写好的程序,如我写的 start.stop.send receive 等,这些程序应该有现成的。
发送一个字节后会有一个应答函数,应答函数定义为,当发送完一个字节也就是8位的时候,如果这是SDA为低电平,则为有应答,反之则无。如果要发送多个字节,一个字节发完后需要一个应答函数才能继续发下面一个字节。程序也就大同小异。掌握好时序就行了。
I2C用的最多的就是E2PROM了。
给你举个例子
如果我想往E2PROM的0x50单元写一个‘a’,则我这样写:
start(); //开始
send(0xa0); //选择我要发送的器件。0xa0为E2PROM的器件地址
answer(); //应答
send(0x50); //选择E2PROM中的0X50地址单元
answer(); //应答
send('a'); //发送数据‘a’
stop(); //停止
好累。。。。。就写这么多
展开全部
IIC就是个通行协议,就是数据传输的时唯正山候通过一跳数据线 DAT和一条时钟线CLK来实现,这个表说的就是这个通行协议,就是通行的时候要先如何如何,然后要传输数据,传输的时候你要保持多少时间数据稳清睁定,数据才能被接受之类的。。找个程序看看就知道了。。大概是指中这个意思。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单地说,就是避免数字电路里的竞争与冒险的现象的一些时间允许参数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你从哪里看来的资料,我也看不懂电压是什么意思。如果有兴趣,可以传整个资料给我看看,谢谢,Q:174566069
电压部分: 我猜测如下,可能不对: 4.5V~5.5V是指IC正常工作的电压
1.8V指的睁喊是IC绝对不能工作的门槛电压
2.5V是指IC的掉电复位电压
一般i2c的图表这里是分为:标准模式,快速模式
觉得你这张表格很怪异。
下面的就简单了:
fscl 标准模式速没逗率最大 100khz 高悉察野速模式最大速率为 400kHz
其它的类同,你可以自己仔细看看。
电压部分: 我猜测如下,可能不对: 4.5V~5.5V是指IC正常工作的电压
1.8V指的睁喊是IC绝对不能工作的门槛电压
2.5V是指IC的掉电复位电压
一般i2c的图表这里是分为:标准模式,快速模式
觉得你这张表格很怪异。
下面的就简单了:
fscl 标准模式速没逗率最大 100khz 高悉察野速模式最大速率为 400kHz
其它的类同,你可以自己仔细看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询