IIC 基本工作原理
依次从高位 7 到低位0 开始发送数据进行通讯
随后从机立即发送一个应答信号
IIC 软件模拟函数
- 启动部分函数
- 启动部分时序图
1.tCHDX 最小值为4.7微秒
2.tDLCL 最小值为4 微秒
void start()
{
SCL = 1;
SDA = 1;
Delay5us();
SDA = 0;
Delay5us();
}
在SCL高电平期间 SDA高低电平应该保持不变 。
- 接受数据部分函数
数据部分时序图
- 1.tCHCL 最小值为4微秒 :
让SCL为高电平时间比4微妙大即可 。- 2.tCLCH 最小值为4.7 微秒:
让SCL为低电平时间比4.7微妙大即可。- 3.tCLDX 最小值为0 微妙:
表示在SCL改变后 SDA电平可立即改变。- 4.tDXCX 最小值为250 微妙 :
表示在SDA改变后250微妙 SCL电平才可改变。
void send_data(char temp)
{
uint8 i;
SCL = 0;
for(i=0;i<8;i++)
{
if(temp & 0x80)
SDA = 1;
else
SDA = 0;
temp = temp<<1;
Delay5us():
SCL=1;
Delay5us();
SCL=0;
}
}
- 应答信号的函数
在第九个时钟周期时 应将SDA信号拉到高电平,来接受应答位
当器件收到应答信号后就会将SDA信号拉为低电平,此时用单片机信号判断SDA的电平即可。
先把SCL拉低,然后将SDA拉高,之后将tCLCH时间(也就是5微秒),然后再拉高SCL延时tCHCL(5微秒),while循环读取SDA电平是否被拉低。
void rec_data()
{
SCL = 0;
SDA = 1; //即为释放总线
Delay5us(); //此时从机将会主动拉低 SDA 电平
SCL = 1;
Delay5us();
while(SDA == 1)
{
;;
}
SCL=0; //为以一个发送数据周期做准备
led=0;
}
- 停止函数
即为,在SCL高电平时间,SDA出现上升沿
void stop()
{
SCL = 1;
SDA = 0;
Delay5us();
SDA = 1;
Delay5us();
}
封装
void IIC_write(unsigned char dev_addr, unsigned char addr, unsigned chari)
start();
send data (dev_addr);//寻址字节
rec_data ();
send data ( addr);//储存单元地址
rec_data ();
send data(i);//发送的数据
rec_data ();
stop();