一,概念
I2C(IIC, Inter-Integrated Circuit,集成电路总线)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。他是同步半双工通信
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。
(二)传输方向
在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。
二,信过程
在时钟线低电平时,数据线进行数据翻转
I2C通信,存在几种信号
1)起始信号(条件):通知从机做好通信的准备。 //时钟线为高,数据线有高到低
2)应答信号:有应答和无应答。有应答是SDA为低电平,无应答是SDA为高电平。
3)停止信号(条件):告诉从机通信已经结束。 //时钟线为高,数据线有低变高
连续通信过程如图(AT24C02写入数据时序图为例)所示:主机先发送起始信号,然后发送寻址地址(寻址地址是由生产厂家和开发者共同决定的,本例子的设备地址是0xa0),等待从机响应,接着发送数据存储地址,等待AT24C02响应,接着每写入一个字节(8bit)从机应答一下。主机发送停止信号,通信结束。
三,代码实现
GPIO口配置
static GPIO_InitTypeDef GPIO_InitStructure;
void at24c02_Init(void)
{
// 输出模式
/* 1.打开GPIO时钟(根据需要开关,降低功耗) */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* 2.配置(模拟IIC) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // 指定引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 模式:输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_