欢迎来到天天文库
浏览记录
ID:28142162
大小:85.00 KB
页数:10页
时间:2018-12-08
《让代码助你理解I2C总线.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、让代码助你理解I2C总线 I2C只是用两条双向的线,一条SerialDataLine(SDA),另一条SerialClock(SCL)。 SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿触发) SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成“线与”关系。 为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理。对于时序不理解的朋友请参考“I2C总线概述及时序总结” 完整的程序如下: #include #defineucha
2、runsignedchar #defineuintunsignedint #definewrite_ADD0xa0 #defineread_ADD0xa1 uchara; sbitSDA=P2 ; sbitSCL=P2; voidSomeNop();//短延时 voidinit();//初始化 voidcheck_ACK(void); voidI2CStart(void); voidI2cStop(void); voidwrite_byte(uchardat);//写字节 voiddelay(uintz); ucharread_byte
3、();//读字节 voidwrite(ucharaddr,uchardat);//指定地址写 ucharread(ucharaddr);//指定地址读 bitflag;//应答标志位 voidmain() { init(); write_add(5,0xaa);//向地址5写入0xaa delay(10);//延时,否则被坑呀!!! P1=read_add(5);//读取地址5的值 while(1); } //*******************************************************************
4、******** voiddelay()//简单延时函数 {;;} //*************************************************************************** voidstart()//开始信号SCL在高电平期间,SDA一个下降沿则表示启动信号 { sda=1;//释放SDA总线 delay(); scl=1; delay(); sda=0; delay(); } //*******************************************************
5、******************** voidstop()//停止SCL在高电平期间,SDA一个上升沿则表示停止信号 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } //*************************************************************************** voidrespons()//应答SCL在高电平期间,SDA被从设备拉为低电平表示应答 { uchari; scl=1; delay(); //至多等待250
6、个CPU时钟周期 while((sda==1)&&(i《250))i++; scl=0; delay(); } //*************************************************************************** voidinit()//总线初始化将总线都拉高一释放总线发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号 { sda=1; delay(); scl=1; delay(); } //*************************************
7、************************************** voidwrite_byte(uchardate)//写一个字节 { uchari,temp; temp=date; for(i=0;i《8;i++) { temp=temp《《1; scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿 delay(); sda=CY; delay(); scl=1;//拉高SCL,此时SDA上的数据稳定 delay(); } sc
此文档下载收益归作者所有