SI2I2C总线是PHLIPS公司推出的一种串行总线,是具有多主机体系所需的包含总线判决和高低速器材同步功用的高性能串行总线。
I2C总线只要两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
一.I2C体系结构
每个接到I2C总线上的器材都有仅有的地址。主机与其它器材间的数据传送可所以由主机发送数据到其它器材,这时主机即为发送器。由总线上接纳数据的器材则为接纳器。
二.数据位的有效性规则
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据有必要保持稳定,只要在时钟线上的信号为低电平期间,数据线上的高电平或低电平状况才答应改变。
三.字节传送与应对
每一个字节有必要确保是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后边都有必要跟从一位应对位(即一帧共有9位)。
四.驱动程序
#define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2^1;sbit SDA=P2^0;
- 1
- 2
- 3
- 4
- 5
1.开端信号和停止信号
SCL线为高电平期间,SDA线由高电平向低电平的改变表明开端信号;
SCL线为高电平期间,SDA线由低电平向高电平的改变表明停止信号。
开端和停止信号都是由主机宣布的,在开端信号发生后,总线就处于被占用的状况;在停止信号发生后,总线就处于闲暇状况
void I2C_Start() //开端{SCL=1;somenop();SDA=1;somenop();SDA=0;somenop();SCL=0;somenop();}void I2C_Stop() //停止{ SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.发送数据
void I2C_SendByte(uchar dat, uchar ack) //发送一个字节{uchar i,j,b=0;for(i=0;i<8;i++){ SCL=0; somenop(); SDA=(bit)(dat&0x80); //每次取最高位进行发送dat<<=1; //从最高位开端发送,左移使每一位逐步成为最高位SCL=1; //上升沿时发送数据somenop(); }SCL=0;somenop(); SDA=1; somenop();SCL=1;_nop_();while((SDA==1)&&(j<250)) j++; //等候应对,也便是等候从设备把SDA拉低SCL=0;_nop_(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
3.读取数据
uchar I2C_ReadByte() //读一个字节{uchar i,dat=0;SCL=0; //此处也能够不置低,由于开端和发送一个字节之后SCL都是0somenop();SDA=1; //拉高预备数据读取_nop_();for(i=0;i<8;i++) //读取8位数据{SCL=1;somenop();dat<<=1;if(SDA==1)dat=dat"0x01;somenop();SCL=0; //下降沿时读取数据somenop();}return dat;}