IIC 通信简单介绍及代码
物理层(接线)
是一种串行、同步、半双工的通信协议
- IIC_SCL 时钟线
- IIC_SDA 数据线
特点:
1. 空闲电平:高
2. 通信速度:标准模式:100Kbit/s 快速模式:400Kbit/s
协议层(通信协议)
-
起始信号:当SCL高时,SDA产生由高到低的电平变换
-
停止信号:当SCL高时,SDA产生由低到高的电平变换
起止条件如下:
![avatar] (https://img-blog.csdnimg.cn/20210326201410641.png) -
应答/非应答信号:当SCL高时,SDA为高表示非应答,为低表示应答
-
写字节:SCL为低时修改SDA,先发送高位
void IIC_WriteByte(u8 tData)
{
u8 i;
//修改SDA为输出模式
for(i=0;i<8;i++)
{
IIC_SCL = 0;
ICC_SDA = (tData & (1 << (7 - i)))?1:0;
delay();
IIC_SCL = 1;
delay();
}
//收应答
}
- 读字节:
u8 IIC_ReadByte(void)
{
u8 i,rData = 0;
//修改SDA为输入模式
for(i=0;i<8;i++)
{
IIC_SCL = 1;
rData |= (ICC_SDA << (7 - i));
delay();
IIC_SCL = 0;
delay();
}
//发应答
}
代码
#include "IIC.h"
void IIC_StartOrStop(u8 mode)
{
IIC_SDA_MODE_OUT();
IIC_SDA = (mode?1:0);
IIC_SCL = 1;
IIC_Delay();
IIC_SDA = (mode?0:1);
IIC_Delay();
if(mode) IIC_SCL = 0;
}
void IIC_WriteByte(u8 tData)
{
u8 x = 8;
IIC_SDA_MODE_OUT();
while (x-->0)
{
IIC_SCL = 0;
IIC_Delay();
IIC_SDA = ((tData & (1 << x))?1:0);
IIC_Delay();
IIC_SCL = 1;
IIC_Delay();
}
IIC_SCL = 0;
}
u8 IIC_Wait_ACK(void)
{
IIC_SDA_MODE_IN();
IIC_SDA = 1;
IIC_SCL = 1;
IIC_Delay();
IIC_SCL = 1;
IIC_Delay();
if(IIC_SDA_DATA_IN)
{
IIC_StartOrStop(CLOSE);
return 0;
}
IIC_SCL = 0;
return 1;
}
u8 IIC_ReadByte(void)
{
u8 x = 8,rData = 0;
IIC_SDA_MODE_IN();
while (x-->0)
{
IIC_SCL = 0;
IIC_Delay();
IIC_SCL = 1;
IIC_Delay();
rData |= (IIC_SDA_DATA_IN << x);
IIC_Delay();
}
IIC_SCL = 0;
return rData;
}
void IIC_Send_ACK(void)
{
IIC_SDA_MODE_OUT();
IIC_SCL = 0;
IIC_SDA = 0;
IIC_Delay();
IIC_SCL = 1;
IIC_Delay();
IIC_SCL = 0;
}
void IIC_Send_NonACK(void)
{
IIC_SDA_MODE_OUT();
IIC_SCL = 0;
IIC_SDA = 1;
IIC_Delay();
IIC_SCL = 1;
IIC_Delay();
IIC_SCL = 0;
}