|
I2C 总线是一双线串行总线, 它提供一小型网络系统,为总线上的电路共享公共的总线。总线上的器件有单片机、LCD 驱动器以及上E2PROM 器等等。自从菲利普公司提出I2C总 线规范以来,I2C器件得到了广泛的应用。I2C器件的应用大大减少了电路间连线,减小了电路板尺寸,降低了硬件成本,并提高了系统可靠性。
I2C通信的起始程序
void Delay(void)
{
_nop_; _nop_; _nop_;_nop_;//此函数的头文件为intrins.h
_nop_; _nop_; _nop_;_nop_;
}
void I2Cstart(void)
{
SDA =1;
Delay(); //延时函数
SCL = 1; //主要的就是在时钟信号为高电平的时候,
Delay(); //数字信号有一个从高到底的跳变
SDA =0;
Delay();
SCL = 0;
}
void I2Cstop(void)
{
SCL = 0;
Delay(); //延时函数
SDA =0; //主要的就是在时钟信号为高电平的时候,
Delay(); //数字信号有一个从低到高的跳变
SCL = 1;
Delay();
SDA =1;
Delay();
}
void ack(void) //主要的是主机给重机发送数据后,检测重机得应答。
{
uchar i;
SCL = 1; //将时钟信号拉高准备接受,应答!
Delay();
while(SDA == 1&&i<250)//防止时间长时间的等待因此增加i<250
{
i++;
}
SCL = 0; //释放时钟总线准备下一次数据的传输
Delay();
}
void nack(void) //主要的是主机读取重机得数据,读到最后一个字符的时候
{
SDA = 0; //重机回复的非应答
Delay();
SCL = 1;
Delay();
SCL = 0;
}
void iicwrite(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCL = 0;//释放时钟信号 让数据总线变化
Delay();
if(dat&&0x80) //将数据从高位到底位依次的付给SDA
{
SDA = 1;
}
else
{
SDA = 0;
}
dat = dat << 1;
Delay();
SCL = 1;//将数据从高位到底位依次的发送出去
Delay();
}
SDA = 1;
Delay();
}
uchar iicread(void)
{
uchar i,dat;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
dat = dat << 1;
if(SDA)
{
dat++;
}
}
return dat;
}
|
|