IIC简介
IIC是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。
IIC是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。
IIC数据格式如下:
- 无数据:SCL=1,SDA=1;
- 开始位(Start):当SCL=1时,SDA由1向0跳变;
- 停止位(Stop):当SCL=1时,SDA由0向1跳变;
- 数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;当SCL保持为0时,SDA上的数据可随意改变;
- 地址位:定义同数据位,但只由Master发给Slave;
- 应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
- 否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。
当数据为单字节传送时,格式为:
- 开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。
当数据为一串字节传送时,格式为:
- 开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。
模拟IIC从机代码(查询方式)
本次调试IIC设置为1对1单点透传模式,所以省略了对地址的处理,直接发送数据包。
先贴代码:
/*
* IIC接收处理函数(扫描)
*/
uint8_t IICSdaOld, IICSclOld;
void i2cSlaveHandler(void)
{
uint8_t temp_scl = IIC_SCL;
uint8_t temp_sda = IIC_SDA;
if (temp_scl == 1)
{
if (IICSclOld == 0)
{ //SCL上升沿
if (IICStat < 0x08)
{
IICTemp <<= 1;
IICTemp |= temp_sda;
//SCL由0变位为1
IICStat++;
}
else if (IICStat == 0x08)
{
spSendDataChar(IICTemp); //通过串口打印字符串
IICStat = 0x00;
}
}
if (temp_sda != IICSdaOld) //SDA变位检测
{
if (temp_sda == 0) //如果SDA跳变为下降沿为起始位
{
IICStat = 0x00;
}
else //如果SDA跳变为上升沿则为停止位
{
IICStat = 0xFF;
}
}
}
IICSdaOld = temp_sda;
IICSclOld = temp_scl;
}
版权属于:wshon
转载时须注明出处及本声明
最新回复