I2C总线万能程序C语言

2023-03-16 15:33   160   0  

"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;


}




登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。