当前位置:首页 > 单片机 > 单片机
[导读]前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SD

前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信


科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。


通信过程:
主模式时,IIC接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。
从模式时,IIC接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。
数据和地址按8位/字节进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在主模式发送。
在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。参考下图。


详细协议可以参考:http://blog.csdn.net/subkiller/article/details/6854910


和SPI差不多,使用IIC无非就一个初始化,一个数据发送,一个数据接收,三大功能。

初始化分初始化为主机、从机,不过一般和外部芯片通信单片机都是作为主机。


voidIIC_Master_Init(void)

{

CLK_PCKENR1|=0x01;//使能IIC外设时钟

PB_DDR&=0xcf;

PB_CR1&=0xcf;

PB_CR2&=0xcf;

I2C_CR1=0x00;//允许时钟延展,禁止广播呼叫,禁止iic

I2C_FREQR=0x01;//输入时钟频率8MHz

I2C_OARH=0x40;//七位地址模式

I2C_OARL=0xa0;//自身地址0xa0

I2C_CCRL=0xff;//

I2C_CCRH=0x00;//标准模式

I2C_TRISER=0x02;

I2C_CR1|=0x01;//使能iic外设

}


这里使用的是STM8S105片上的IIC引脚PB4、PB5。另外就是需要使能IIC的时钟。



发送和接收数据这里只给出一个最简单的例子,因为不同的外部芯片的通信方式不一样,不过一般都是:

读操作:开始->发送外设地址 -> 开始->发送需要读取的寄存器地址-> 读一个字节-> (可能再读一个字节)->。。。-> 结束
写操作:开始->发送外设地址 ->发送需要写入的寄存器地址-> 写一个字节->

voidIIC_Write_Byte(u8DeviceAddress,u8Address,u8Data)

{

vu8temp=0;

while((I2C_SR3&0x02)!=0);//等待IIC总线空闲

IIC_Start();

while((I2C_SR1&0x01)==0);//EV5,起始信号已经发送

I2C_DR=(DeviceAddress&0xfe);//发送iic从器件物理地址,最低位0,写操作

while((I2C_SR1&0x02)==0);//地址已经被发送

temp=I2C_SR1;//清除ADDR标志位

temp=I2C_SR3;

while((I2C_SR1&0x80)==0);//等待发送寄存器为空

I2C_DR=Address;//发送要写入的寄存器地址

while((I2C_SR1&0x04)==0);//等待发送完成

while((I2C_SR1&0x80)==0);//等待发送寄存器为空

I2C_DR=Data;//发送要写入的数据

while((I2C_SR1&0x04)==0);//等待发送完成

temp=I2C_SR1;//清零BTF标志位

temp=I2C_DR;

IIC_Stop();//发送停止信号

}

unsignedcharIIC_Read_Byte(u8DeviceAddress,u8Address)

{

vu8temp=0;

shortread_data=0;

while((I2C_SR3&0x02)!=0);//等待IIC总线空闲

I2C_CR2|=0x04;//使能ACK

IIC_Start();

while((I2C_SR1&0x01)==0);//EV5,起始信号已经发送

I2C_DR=(DeviceAddress&0xfe);//发送iic从器件物理地址,最低位0,写操作

while((I2C_SR1&0x02)==0);//地址已经被发送

temp=I2C_SR1;//清除ADDR标志位

temp=I2C_SR3;

while((I2C_SR1&0x80)==0);//等待发送寄存器为空

I2C_DR=Address;//发送要读取的寄存器地址

while((I2C_SR1&0x04)==0);//等待数据发送完成

IIC_Start();

while((I2C_SR1&0x01)==0);//EV5,起始信号已经发送

I2C_DR=(DeviceAddress|0x01);//发送iic从器件物理地址,最低位1,读操作

while((I2C_SR1&0x02)==0);//地址已经被发送

temp=I2C_SR1;//清除ADDR标志位

temp=I2C_SR3;

while((I2C_SR1&0x40)==0);//等待接收数据寄存器非空

read_data=I2C_DR;

I2C_CR2&=0xfb;//读取数据下,发送stop必须禁止ack,才能释放从机

temp=I2C_SR1;//清零BTF标志位

temp=I2C_DR;

IIC_Stop();

returnread_data;

}



附上stm8s在IAR环境下的项目工程,包括了SPI、IIC、PWM、AWU、USART、EEPROM等片上硬件的初始化代码。

http://download.csdn.NET/detail/devintt/9454188



读操作:开始->发送外设地址 -> 开始->发送需要读取的寄存器地址-> 读一个字节-> (可能再读一个字节)->。。。-> 结束


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

下面小编为大家整理了电机驱动电路原理,你值得收藏!

关键字: 电机驱动电路原理 电源电路 iic

派瑞特旗下品牌,数字电视与广播接收器件的领先提供商迪康,将于2月23-25日出席在深圳举行的2012年国际集成电路研讨会暨展览会(IIC-China),展出用于数字电视与广播的可编程接收芯片Octop

关键字: 迪康 iic octop

明星涉及区块链早已不是什么新鲜事:韩国顶级女团T-ara在韩国发布了T-ara币;韩流明星权志龙也在自己的演唱会售票通道上开启了区块链token兑换区。而国内明星中,汪峰也在节目后台大谈区块链技

关键字: iic 区块链

IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。主要是用来方便微控制器与外围器件的数据传输。它是一种半双工,由SDA(数据)和SCL...

关键字: iic 梦源科技 iic-bus

IICvs SPI         现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Inter

关键字: iic 总线协议

IIC(Inter-Integrated Circuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备,它的最主要优点是简单和有效。它只需要数据线SDA和时钟线SCL,就能够实...

关键字: iic 寄存器 数据

今天查看STM32资料时,对输出速度2M 10M 50M不是很了解,再加上移植ARF2496K程序到STM32时出现意外情况。一、STM8S端作为接收端和发送端时接收到的数据都正常。二、发送端(STM8S),接收端(ST...

关键字: io口 stm32f stm8s 输出速率

LPC2124有一个标准的I2C总线接口,可配置为主机或从机,总线时钟速率可调整,最高可支持400KHZ总线速率。使用I2C总线时,要将相应得引脚设置连接SCL和SDA,并且总线上要上拉电阻,阻值为1~10K&Omega...

关键字: iic 总线应用

STM8S单片机开发环境由三大部分组成,包括PC机上的开发软件(集成开发软件、驱动程序等)、调试&编程器ST-LINK、目标单片机电路板。如下图所示:1、PC机上开发软件PC机上的软件包括:ST-LINK驱动程序...

关键字: stm8s 单片机入门 开发环境

/************************************** PCF8563时钟程序 * * 文 件 名:1602_8563.c * * 版 本:V22.02 * * 主控芯片:Mega16L...

关键字: iccavr iic pcf8563 时钟程序
关闭
关闭