工作原理
常用串行扩展总线:
- IIC,单总线,SPI,Mircrowire/plus
- 硬件设计简化,体积减小,可靠性提高,更改扩充极为容易
- 可以接很多设备,根据那个设备先发送地址码,那个地址码
- IIC总线通过上拉电阻接正电源10K,三极管流控流,场效应管压控流。
- 每个器件都有唯一的地址,总线通过仲裁,以决定哪一台主机控制。
- 时钟信号为高电平期间,数据必须保持稳定,只有时钟线上的信号为低电平时,数据线上的高低电平状态才允许变化。
起始和终止信号
- SCL线为高电平时,SDA由高到低变化为起始信号。
void IICstart(void)
{
SDA=1;
SomeNop();
SCL=1;
SomeNop();
SDA=0;
SomeNop();
}
- SCL线为高电平时,SDA由低到高变化为终止信号
void IICStop(void)
{
SDA=0;
SomeNop();
SCL=1;
SomeNop();
SDA=1;
}
- 起始和终止都是由主机发出
数据传送格式
- 每一个字节必须保证是8位长度,先传MSB,每一个被传送字节后面都必须跟随一位应答位(即一共9位)。
- 应答位是从机发出的。一个时钟传一位。
- 从机不对主机寻址信号应答时,它必须将数据线置于高电平,而由主机产生一个终止信号结束总线的数据传送。
数据帧格式
-
在起始信号后必须传送一个从机地址(7位),第8位是数据传送方向位(R/T),0代表主机发送数据,1代表主机接受数据。
-
每次都是由主机产生的终止信号结束,若继续,则可以不产生终止信号
-
-
主机发送地址时,总线上的每个从机都将这7位地址码与自己地址进行比较。
-
从机地址=固定+可编程(4+3),3位 这时仅能寻址8个相同的器件。
写入过程
- 先发送7位地址和方向位(R/T),发送完后释放SDA线并在SCL上产生第九个时钟,被选中存储器器件确认后在SDA上产生一个应答信号作为响应,主机收到应答后传送数据。
读出过程
- 移位操作:左移时最低位补0,最高位移入PSW中的CY位。
#include<reg52.h>
#define uchar unsigned char
sbit SCL=P2^0;
sbit SDA=P2^1;
void delay()
{ ; ; }
void init()
{
SCL=1;
SDA=1;
}
void START() // 起始
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void STOP() // 终止
{
SDA=1;
delay();
SCL=0;
delay();
SDA=1;
delay();
}
void BYTE_WRITE(uchar date)
{
uchar i,temp;
temp=date;
SCL=0; //低电平数据可以变化
delay();
for(i=0;i<8;i++)
{
temp=temp<<1;
SDA=CY;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
SDA=1; //数据总线释放
delay();
}
uchar BYTE_READ()
{
uchar i,j,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
j=SDA;
k=(k<<1)|j;
scl=0;
delay();
}
return k;
}
void main()
{
init();
BYTE_WRITE(0xa0);
respons();
BYTE_WRITE_BYTE(3);
RES
}