i2c.c

来自「多点温度检测系统」· C语言 代码 · 共 76 行

C
76
字号
 #include <reg52.h>
 #include <INTRINS.H>
 #include "i2c.h"
 
 void I2CSomeNOP(void)
 {
 	_nop_();_nop_();_nop_();
 	_nop_();_nop_();_nop_();
 }

 void I2CStart(void)
 {
 EA=0;
 I2CSDA=1; I2CSCL=1; I2CSomeNOP();//INI
 I2CSDA=0; I2CSomeNOP(); //START
 I2CSCL=0;
 }

 void I2CStop(void)
 {
 I2CSCL=0; I2CSDA=0; I2CSomeNOP(); //INI
 I2CSCL=1; I2CSomeNOP(); I2CSDA=1; //STOP
 EA=1;
 }

 bit I2CWaitAck(void)
 {
 unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
 I2CSDA=1;I2CSomeNOP();
 I2CSCL=1;I2CSomeNOP();
 while(I2CSDA) {errtime--; if (!errtime) {I2CStop();return false;}}
 I2CSCL=0;
 return true;
 }

 void I2CSendAck(void)
 {
 I2CSDA=0; I2CSomeNOP();
 I2CSCL=1; I2CSomeNOP();
 I2CSCL=0;
 }

 void I2CSendNotAck(void)
 {
 I2CSDA=1; I2CSomeNOP();
 I2CSCL=1; I2CSomeNOP();
 I2CSCL=0;
 }

 void I2CSendByte(unsigned char ch)
 {
 unsigned char i=8;
 while (i--)
	 {
	 I2CSCL=0;_nop_();
	 I2CSDA=(bit)(ch&0x80); ch<<=1; I2CSomeNOP();
	 I2CSCL=1; I2CSomeNOP();
	 }
 I2CSCL=0;
 }

 unsigned char I2CReceiveByte(void)
 {
 unsigned char i=8;
 unsigned char ddata=0;
 I2CSDA=1;
 while (i--)
	 {
	 ddata<<=1;
	 I2CSCL=0;I2CSomeNOP();
	 I2CSCL=1;I2CSomeNOP();
	 ddata|=I2CSDA;
	 }
 I2CSCL=0;
 return ddata;
 }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?