原创 【博客大赛】51的I2C协议操作

2012-11-19 14:38 2939 12 14 分类: MCU/ 嵌入式

I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。

具体可以详细查看通讯协议

#include "reg51.h"
#include "intrins.h"
unsigned char SystemError;
sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的需要来定义
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStart(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
SDA=0; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void AD7416_I2CStop(void) 2003/05/04
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
SCL=1; SomeNOP(); SDA=1;
EA=1;
}
/*--------------------------------------------------------------------------------
调用方式:I2CAck(void) 2003/05/13
函数说明:私有函数,I2C专用,等待从器件接收方的应答
ACK BY AD7416
---------------------------------------------------------------------------------*/
WaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;
SCL=1;
SystemError=0x10;
while(SDA)
{ errtime--;
if(!errtime)
{ AD7416_I2CStop();
AD7416_SystemError=0x11; //出错后给全局变量赋值
return;
}
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫2003/05/13
函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
SCL=1; SomeNOP();
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:void I2CSend(uchar ch) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
unsigned char i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据
SCL=1; SomeNOP();
}
SCL=0;
}
/*--------------------------------------------------------------------------------
调用方式:uchar I2CReceive(void) 2003/05/13
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
unsigned char i=8,data=0;
SDA=1;
while (i--)
{
data<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
data|=SDA;
}
SCL=0;
return data;
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户412802 2012-12-10 20:44

SDA是空闲就为高的,不影响循环数据,

用户1709946 2012-12-8 10:35

Byte I2CReceiveByte(void) { unsigned char i=8,data=0; SDA=1; while (i--) { data<<=1; SCL=0;SomeNOP(); SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据 data|=SDA; } SCL=0; return data; } 想问下在接收函数中的SDA=1;然后进入循环不影响数据吗

用户403664 2012-11-13 10:35

不是,你关注@ednchina 了吗?你的新郎微博地址是?

huzylover_619904060 2012-11-9 21:04

还不太会用这个站的东西~~T_T @EDNChina这个事啥意识,写博客还能传微博吗?咋整啊 ------------------------------------------------ 网友: 胖螃蟹 臭鸡蛋 (0) 鲜花 (0) 快速回复 引用回复(0) 2012-11-09 10:26 评论: 没看到图片呀,用高级编辑器上传一下啊!

用户403664 2012-11-9 10:26

没看到图片呀,用高级编辑器上传一下啊!

用户403664 2012-11-9 10:20

@EDNChina把这个系列发到微博,好多人响应呢!求你的新浪微博
相关推荐阅读
用户412802 2013-10-11 21:26
【博客大赛】AD9834,高性能信号发生器的选择
  AD9834简介 AD9834是一款75 MHz、低功耗DDS器件,能够产生高性能正弦波和三角波输出。其片内还集成一个比较器,支持产生方波以用于时钟发生。当供电电压为3 V时,其功耗仅...
用户412802 2013-04-22 16:47
想学就学,EDN助你一臂之力!拿板子参加嵌入式主题大赛
  就这几个月入门进阶FPGA,边参加嵌入式主题大赛,边学习FPGA!加入FPGA入门小组一起学!       新手快来,原理有文档文档介绍,网友在完成此次的基础上,可尽情发挥,重在学习领...
用户412802 2013-02-19 10:55
ouryk回来,活动继续
最近一直忙着其他事情,小组等活动暂停了,不过现在回来了,继续完成承诺,给以最大优惠奉献大家,欢迎关注我的小组 我爱单片机...
用户412802 2013-01-12 17:09
2013的我们
2013的我们该怎么生活,技术路线,职业生涯,希望大家一起好好讨论下...
用户412802 2012-12-11 13:11
【告别2012】我们一起破2012还继续,奋斗着,学习着
2012即将结束,拿出手上的资源,让利给大家 单片机200 包邮价格 带液晶屏 http://item.taobao.com/item.htm?spm=a1z10.3.0.76.3bpjHq&...
用户412802 2012-11-30 08:53
【博客大赛】DIY个性时钟与温度计
   学了51,你可以自己diy个性时钟与温度计,让你的东西与众不同,让同学们羡慕去吧 [注:AT89S52使用12M晶振]======================================...
EE直播间
更多
我要评论
2
12
关闭 站长推荐上一条 /3 下一条