最近学了下IIC协议,这儿想把模仿IIC接口和规范IIC接口总结一下。(这儿只介绍一主一从的状况)
IIC数据通讯是经过两根线完成通讯的,即SDA和SCL,SDA是数据线,SCL是时钟线,SCL操控SDA的作业时钟,也就是说当SCL为高电平常SDA上面的数据才有用。
模仿IIC接口设置:
主要是挑选两条I/O别离作为SCL和SDA线,在进行数据传输是确认其输入输出功用(装备IOxDIR寄存器)。
规范IIC接口设置:
以LPC2148为例
第一步:设置管脚功用挑选寄存器,挑选I/O为SCL,SDA功用
例如:PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50;
第二步:设置IIC作业频率,即SCL的时钟
例如:
if(Mode == I2C_SPEED_400)
第三步:铲除一切标志位
I2C0CONCLR = 0xFF;
第四步:设置主从形式,这儿为主形式
I2C0CONSET = 0x40;
I2C0CONSET |= I2C_FLAG_I2EN;
下面列出IIC进行数据通讯时满意的几个条件:
1)开端条件:当SCL和SDA都为高电平常,假如SDA由高电平变低电平常就以为是开端条件。
IIC_Start()
{
SDA = 1;
delay(2);//这个时刻有自己设定
SCL = 1;
delay(2);
SDA = 0;
delay(2);
SCL = 0;
}
这样就能够开端进行数据通讯了,PS:SCL高电平常SDA的数据才有用.
2)中止条件:当SCL为高电平常,假如SDA由低电平变为高电平,可以为是一个中止条件,即中止数据传输,一般主发送机来操控。
IIC_Stop()
{
SCL = 0;
delay(2);
SDA = 0;
delay(2);
SCL = 1;
delay(2);
SDA = 1;
}
这样就发生一个中止条件。
2)呼应
当主设备发送完一字节数据时,从设备会发生一个呼应ACK(一位,低电平),此刻主设备开释SDA线高,假如主设备接纳到一位低电平,表明从设备发生了一个呼应位,因而能够持续向从设备发送数据,反之则中止发送。
bit IIC_RecevAck()
{
CY = SDA;//单片机为例
delay(2);
SCL = 1;
delay(2);
SCL = 0;
delay(2);
return CY;
}
//——当主设备接纳从设备的一字节数据时,主设备能够发送ACK也能够不发送ACK,假如不发送ACK表明中止读取从设备数据,反之则能够持续接纳数据。
IIC_SendAck(char ack)//ack=0有呼应,ack=1表明不发送呼应,中止接纳。
{
if(ack == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
SCL = 1;
delay(2);
SCL = 0;
}
下面举例说明IIC进行一字节数据的传输
IIC_SendOneByte(unsigned char data)//主设备向从设备发送一字节数据
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (data & 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay(2);
SCL = 1;
delay(2);
SCL = 0;
delay(2);
data <<= 1;
}
SDA = 0;//能够把SDA拉低,等候呼应位,也能够经过IIC_RecvAck()来拉低
}
//——————————————————–
BYTE IIC_ReadOneByte()//一般由主设备先发送一字节给从设备,让从设备发送数据给主设备
{
BYTE
SDA = 1; //单片机当管脚作输入时,写入1,默以为输出功用。
for(j = 0; j < 8; j++)
{
data <<= 1;
SCL = 1;
delay(2);
data = SDA;
SCL = 0;
delay(2);
}
return data;
}