您的位置 首页 ADAS

关于IIC协议及代码完成

最近学了下IIC协议,这里想把模拟IIC接口和标准IIC接口总结一下。(这里只介绍一主一从的情况)IIC数据通信是通过两根线实现通信的,即SDA

最近学了下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; //p0.2,p0.3 iic

第二步:设置IIC作业频率,即SCL的时钟

例如:

if(Mode == I2C_SPEED_400)
{
//— I2C Timing for 58 MHz (t = 16.954 ns) —
I2C0SCLH = 47; //– more then 0.6 us – 0.8
I2C0SCLL = 93; //– more then 1.3 us – 1.4
}
else //Slow
{
I2C0SCLH = 47*4;
I2C0SCLL = 93*4;
}

第三步:铲除一切标志位

I2C0CONCLR = 0xFF;

第四步:设置主从形式,这儿为主形式

I2C0CONSET = 0x40;

第五步:始能IIC接口(enable IIC)

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()//一般由主设备先发送一字节给从设备,让从设备发送数据给主设备

{

BYTEj,data = 0;

SDA = 1; //单片机当管脚作输入时,写入1,默以为输出功用。

for(j = 0; j < 8; j++)

{

data <<= 1;

SCL = 1;

delay(2);

data = SDA;

SCL = 0;

delay(2);

}

return data;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/262309.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部