IIC总线协议的基本原理
可编程部分组成。在一个系统中,可能希望接入多个相同的从机,从机地址中可以编程的部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
附:单片机I2C串行总线数据传送模拟
子程序:
1)总线的初始化
Void init()
{
SDA = 1;
delay( );
SCL = 1;
delay( );
}
将总线都拉高以释放总线
2)启动信号
void start()
{
SDA = 1;
delay( );
SCL = 1;
delay( );
SDA = 0;
delay( );
}
SCL在高电平期间,SDA一个下降沿启动信号
3)应答信号
void respons()
{
Uchar i=0;
SCL = 1;
delay( );
While((SDA == 1)&&(i < 255))
{
i++;
SCL = 0;
delay( );
}
}
SCL在高电平期间,SDA被从设备拉为低电平表示应答,上面的代码中有一个(SDA == 1)和(i <255)与关系,表示若在一段时间内没有收到从器件的应答则主器件默认从器件已经收到数据而不再等待应答信号,如果不加这个延时退出,一旦从器件没有发送应答信号,程序将永远停在这里,而真正的程序中不允许这样的情况发生。
4)停止信号
void stop()
{
SDA = 0;
delay( );
SCL = 1;
delay( );
SDA = 1;
delay( );
}
SCL在高平期间,SDA一个上升沿停止信号。
5)写一个字节
void writebyte(uchar data)
{
Uchar i,temp;
temp = data;
for(i=0;i<8,i++)
{
temp=temp<1;
SCL=0;
Delay();
SDA=CY;
Delay();
SCL=1;
Delay();
}
SCL=0;
Delay();
SDA=1;
Delay();
}
串行发送一个字节时,需要把这个字节中的8位一位一位的发出,temp=temp<1表示左移,将最高位移入PSD寄存器CY位中然后将CY赋给SDA,进而咋SCL的控制下发送出去。
6)读一个字节
Uchar readbyte()
{
Uchar i,k;
SCL=0;
Delay();
SDA=1
For(i=0;i<8;i++)
{
SCL=1;
Delay();
K = (k<1)|SDA;
SCL=0;
Delay();
}
Delay();
Retrun k;
}
串行接受一个字符时需要将8位一位一位的接收,然后再组合成一个字节,上面代码中我们定义了一个临时变量k,将k左移一位后与SDA进行或运算,依次把8个独立的位放入一个字节中来完成接收。
IIC总线协议基本原 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)