戏解I2C(地方口音,仙桃滴吖)
时间:10-02
整理:3721RD
点击:
在这锅基情四射滴地方。大家都是搞单片机滴。
相信老是遇到要调I2C的东西,烦都要烦死人。
特别对于以前手生滴时候
我在这里就比较通俗滴说一哈
大家要拍砖滴拍,灌水滴灌,当然泥,赞一哈是更好滴
闲话不多嗦,来真滴打。
首先泥,调I2C肯定要有主从之分滴(GPIO模拟标准I2C协议)。
我泥就从主机这边开始说起,协议大概就是这样子滴
start(开始信号)+addrss(从机地址)+ack(应答)+data1(第一个数据)+ack(应答)+data2(第二个数据)+ark(应答)+stop(结束信号)
下面泥就细解了
(下面滴话老子都用汉字。好像实现不鸟,擦)
首先泥,I2C有两根线
CLK(时钟线):不要问我为毛叫时钟线,自己找个IO口这样命名就好了
DAT(数据线):同上
这两根线你不用滴时候,就把他都搞成输出状态,拉高
然后泥,你想从机对你有所反应泥
-----------------------------------------
你要先搞个开始信号,揍是英文滴start
时钟线一直拉高状态,数据线从高到低拉一哈,从机就来反应打。
揍是下面这个鬼样子(上下SCL和SDA同步操作)
SCL: --
SDA: -\_
警告一哈:横线之间的缝隙一般都有5微秒(具体情况请参照从机具体资料)延时滴(斜竖线不算,只是描述这根线滴走势,当个形容词就好了)。
参考写法:
SCL(1);
SDA(1);
DELAY_1US(5);
SCL(1);
SDA(0);
DELAY_1US(5);
中文解释:时钟高、数据高+5微秒延时+时钟高、数据低+5微秒延时
下面我就不折磨诺捷打,打滴手疼。
-----------------------------------------
-----------------------------------------
紧接倒就是发送从机地址+应答了,就是addrss+ark
记得要从数据(英文名字下面叫data)高位发起哦
长下面挪样:
SCL: _/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_
SDA: _<D7><D6><D5><D4><D3><D2><D1><D0>ACK__
参考代码:(锅锅们,我是纯手打滴啊,赞一过啊)
SCL(0);//先把时钟拉低,等每发送一位数据完后,在拉高一哈
DELAY_1US(5);
//下面是发送八位数据for(i=8;i;i--)
{
if(data&0x80)//获取数据滴最高头一位
SDA(1); //最高位为1滴时候,把数据线拉高
else
SDA(0); //最高位为0滴时候拉低
DELAY_1US(5);
SCL(1); //看倒没有啊,时钟现在拉高,从机就可以读这位数据打
DELAY_1US(5);
data<<=1; //把数据一位一位往最高位挪,方便读
SCL(0); //从这里开始循环读
}
// 下面开始获取从机滴应答信号打
I2C_SDA_IN(); //把数据线设置为输入,具体怎么搞,自己弄
DELAY_1US(5);
SCL(1);
DELAY_1US(5);
i= I2C_SDA_GET(); // 这过地方要注意哈,这是读取从机返回来滴数据的地方,当i=0滴时候,就说明前面滴地址从机已经承认打,你滴程序就可以往下面走大,反之呢,如果i=1呢,就说明可能哪过地方出错打,你程序再往下面跑就没有任何意义打,你可以选择重新发数据或者克搞别滴事情打。
SCL(0);
DELAY_1US(5);
-----------------------------------------
-----------------------------------------
后面还有数据发送什么的,都可以同理概之啊
,如果你硬是要我都告诉你囊么搞,可以留言哈,邮箱啊,QQ什么滴啊,都阔仪。交流经验也阔仪
-----------------------------------------
-----------------------------------------
最后讲过结束信号,阳文stop
长相:
SCL: _/-
SDA: __/
参考代码:
SDA(0);
SCL(0);
DELAY_1US(5);
SCL(1);
DELAY_1US(5);
SDA(1);
太晚打,相信各位都能看懂打,我就不解释那么多打。
-----------------------------------------
-----------------------------------------
TM好累啊,搞工程好苦逼啊,写帖子也真不是人搞滴事情啊。
相信老是遇到要调I2C的东西,烦都要烦死人。
特别对于以前手生滴时候
我在这里就比较通俗滴说一哈
大家要拍砖滴拍,灌水滴灌,当然泥,赞一哈是更好滴
闲话不多嗦,来真滴打。
首先泥,调I2C肯定要有主从之分滴(GPIO模拟标准I2C协议)。
我泥就从主机这边开始说起,协议大概就是这样子滴
start(开始信号)+addrss(从机地址)+ack(应答)+data1(第一个数据)+ack(应答)+data2(第二个数据)+ark(应答)+stop(结束信号)
下面泥就细解了
(下面滴话老子都用汉字。好像实现不鸟,擦)
首先泥,I2C有两根线
CLK(时钟线):不要问我为毛叫时钟线,自己找个IO口这样命名就好了
DAT(数据线):同上
这两根线你不用滴时候,就把他都搞成输出状态,拉高
然后泥,你想从机对你有所反应泥
-----------------------------------------
你要先搞个开始信号,揍是英文滴start
时钟线一直拉高状态,数据线从高到低拉一哈,从机就来反应打。
揍是下面这个鬼样子(上下SCL和SDA同步操作)
SCL: --
SDA: -\_
警告一哈:横线之间的缝隙一般都有5微秒(具体情况请参照从机具体资料)延时滴(斜竖线不算,只是描述这根线滴走势,当个形容词就好了)。
参考写法:
SCL(1);
SDA(1);
DELAY_1US(5);
SCL(1);
SDA(0);
DELAY_1US(5);
中文解释:时钟高、数据高+5微秒延时+时钟高、数据低+5微秒延时
下面我就不折磨诺捷打,打滴手疼。
-----------------------------------------
-----------------------------------------
紧接倒就是发送从机地址+应答了,就是addrss+ark
记得要从数据(英文名字下面叫data)高位发起哦
长下面挪样:
SCL: _/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_
SDA: _<D7><D6><D5><D4><D3><D2><D1><D0>ACK__
参考代码:(锅锅们,我是纯手打滴啊,赞一过啊)
SCL(0);//先把时钟拉低,等每发送一位数据完后,在拉高一哈
DELAY_1US(5);
//下面是发送八位数据for(i=8;i;i--)
{
if(data&0x80)//获取数据滴最高头一位
SDA(1); //最高位为1滴时候,把数据线拉高
else
SDA(0); //最高位为0滴时候拉低
DELAY_1US(5);
SCL(1); //看倒没有啊,时钟现在拉高,从机就可以读这位数据打
DELAY_1US(5);
data<<=1; //把数据一位一位往最高位挪,方便读
SCL(0); //从这里开始循环读
}
// 下面开始获取从机滴应答信号打
I2C_SDA_IN(); //把数据线设置为输入,具体怎么搞,自己弄
DELAY_1US(5);
SCL(1);
DELAY_1US(5);
i= I2C_SDA_GET(); // 这过地方要注意哈,这是读取从机返回来滴数据的地方,当i=0滴时候,就说明前面滴地址从机已经承认打,你滴程序就可以往下面走大,反之呢,如果i=1呢,就说明可能哪过地方出错打,你程序再往下面跑就没有任何意义打,你可以选择重新发数据或者克搞别滴事情打。
SCL(0);
DELAY_1US(5);
-----------------------------------------
-----------------------------------------
后面还有数据发送什么的,都可以同理概之啊
,如果你硬是要我都告诉你囊么搞,可以留言哈,邮箱啊,QQ什么滴啊,都阔仪。交流经验也阔仪
-----------------------------------------
-----------------------------------------
最后讲过结束信号,阳文stop
长相:
SCL: _/-
SDA: __/
参考代码:
SDA(0);
SCL(0);
DELAY_1US(5);
SCL(1);
DELAY_1US(5);
SDA(1);
太晚打,相信各位都能看懂打,我就不解释那么多打。
-----------------------------------------
-----------------------------------------
TM好累啊,搞工程好苦逼啊,写帖子也真不是人搞滴事情啊。
深更半夜毛人都没得。自己搞起
为毛连锅老乡都冒得。
有没有仙桃地锅锅
自己来,还有B
呵呵,地方音。