_Nop(); _Nop(); }
/******************************************************************* 字节数据接收函数 函数原型: UCHAR RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。
********************************************************************/ unsigned char RcvByte() {
unsigned char retc; unsigned char BitCnt; retc=0;
SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop();
SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop();
_Nop(); retc=retc<<1; if(SDA==1)
retc=retc+1; /*读数据位,接收的数据位放入retc中 */
_Nop(); _Nop(); } }
/******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a);
功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c(bit a) {
if(a==0)
SDA=0; /*在此发出应答或非应答信号 */ SCL=0; _Nop(); _Nop(); return(retc);
else
SDA=1;
_Nop(); _Nop(); _Nop();
SCL=1; _Nop();
_Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop();
}
24c02部分
/*************************此部分为AT2402的驱动程序使用I2C总线连接*************************************/ #include
/******************************************************************* 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。
********************************************************************/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char {
unsigned char i;
no) Start_I2c(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(ack==0) return(0);
SendByte(suba); /*发送器件子地址*/ if(ack==0)return(0); for(i=0;i SendByte(*s); /*发送数据*/ if(ack==0)return(0); s++; } Stop_I2c(); /*结束总线*/ return(1); } /******************************************************************* 向有子地址器件读取多字节数据函数 函数原型: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。 ********************************************************************/ bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char { unsigned char i; Start_I2c(); /*启动总线*/ no) SendByte(sla); /*发送器件地址*/ if(ack==0)return(0); SendByte(suba); /*发送器件子地址*/ if(ack==0)return(0); Start_I2c(); /*重新启动总线*/ SendByte(sla+1); if(ack==0)return(0); for(i=0;i *s=RcvByte(); /*发送数据*/ Ack_I2c(0); /*发送就答位*/ s++; } *s=RcvByte(); Ack_I2c(1); /*发送非应位*/ Stop_I2c(); /*结束总线*/ return(1); } Function.h部分 #define uchar unsigned char #define uint unsigned int extern void write_sfm(uchar add,uchar dat); extern extern extern extern void delay(uint z); void dsreset(void); //18B20复位,初始化函数 bit tempreadbit(void); //读1位函数 uchar tempread(void); //读1个字节