arm之s3c2440的I2C的用法

基础概念

IC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。

IIC 的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线 ,一根是数据线SDA ,另一 根是时钟线SCL 。这两个信号线都是双向的 。 作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态 ,所发生的数据被总线上所 有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址相同时,接收 方才真正执行相关的指令。

IIC总线规定,设备在空闲时,两根总线都处于高电平状态 。为保证这种状态,数据线SDA和时钟线SCL都要 外接上拉电阻 。

I2C通信的流程

  1. IIC总线上连接的若干设备中,每次通信前,发送方首先发送一个**"起始"信号** ,其实信号就是在SCL为高电平时, SDA发送一个低电平 。当其它设备接收到这个其实信号后,将进行一次**"总线仲裁"** 。意思就是设备(除发送其实信 号的那个设备以外的)都将处于聆听状态。

2.IC总线进行数据传送时,时钟线(SCL) 上的信号为高电平期间,数据线(SDA)上的数据必须保持稳定。只有在时钟线 (SCL)上的信号为低电平期间,数据线(SCL)上的高电平或低电平状态才允许变化。同时,SCL信号由数据启动发送 的设备提供。输出到数据线(SDA)上的每个字节必须是8位。数据传送时,先传送最高位(MSB),后传送最低位(LSB)。

3.发送器每发送一个字节(8个bit),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。 主机 SCL拉高,读取从机SDA的电平。对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平 期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。

数据线(SDA)为低电平 时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节。

数据线(SDA)为高电平 时,规定为非应答位(NACK),表示接收器没有成功接收该字节。

当发送方发送完最后一个bit后,需要发送一个结束标志来终止整个通信过程。当时钟线SCL 为高电平时,数 据线SDA 由低电平向高电平跳变。

完整的IIC通信时序图。

IIC控制寄存器

IICCON:IIC控制寄存器中的每个域都需要设置

Bit7:处于发送数据时,如果设置为允许,那么当接收设备回应ACK后,会产生IIC中断。当处于接收数据时, 允许这一位会发送ACK,否则发送NACK。

Bit6:IIC产生波特率的第一次分频

Bit5:由于我们要使用中断方式,所以这一位允许

Bit4:这一位看起来似乎是一个查询用的挂起标志,但是这一位是允许写0的。而且无论我们要发送什么数 据,都必须清除这一位才能真正将数据发送出去。

Bit0~3:IIC产生波特率的第二次分频

代码示例

IIC初始化函数

第16~17行:配置GPE14和GPE15为IIC方式

第19行:允许ACK,中断使能,IIC时钟分频为512=50M/512=97656.25

第20行:发送时钟分频因子 0+1=10 因此,波特率为97656.25约等于97.6K

第22~23行:允许IIC中断,注册中断服务函数

IIC中断服务函数,由于IIC控制器会在收到和发送完ACK之后产生中断,我们将来在数据发送后等待这个标 记即可。

由于无论发送还是接收数据,手册里要求我们必须清除IICCON的第四位之后才能继续 ,也就是说我们把数据放入IICDS之后,数据并没有发送出去,而是需要我们把这一位清零后数据才开始发送 。从发送第一个比特到接收到ACK之间肯定需要时间,当收到ACK之后就会产生中断。需要注意的 是at24c02在收到数据之后需要一点时间把数据写入到EEPROM中,所以可以在循环中等待一段时间。这个 时间大约为100us。

写操作

读操作

结合以下流程图更容易理解

主机发送器操作

主机接收器操作

以下是逻辑分析仪采取的波形图,直观地查看数据

相关推荐
钡铼技术物联网关5 小时前
模块化革命:树莓派CM5嵌入式工业计算机如何重构嵌入式系统开发边界
linux·arm开发·边缘计算
心随雪冻1 天前
18.PCIe总线入门理解与Linux上PCIe设备配置与使用
linux·arm开发·嵌入式硬件
kongba0072 天前
GD32 ARM单片机开发规范检查清单 GD32嵌入式C代码检查清单
c语言·arm开发·单片机
亿道电子Emdoor2 天前
【ARM】MDK-解决中文注释的乱码问题
arm开发·stm32·单片机·arm·mdk
亿道电子Emdoor4 天前
【ARM】MDK-解决单机版LIC获取报错
arm开发·stm32·单片机·arm
Jason_zhao_MR4 天前
国产开发板—米尔全志T113-i如何实现ARM+RISC-V+DSP协同计算?
arm开发·嵌入式硬件·mcu·嵌入式·risc-v
爱吃馒头爱吃鱼4 天前
Qt在ARM中,如何使用drmModeObjectSetProperty 设置 Plane 的 zpos 值
开发语言·arm开发·qt
EasyCVR4 天前
跨平台IPC通信、嵌入式WebRTC轻量化引擎:解析EasyRTC在ARM/Linux平台的性能突破
linux·arm开发·webrtc
梅尔文.古4 天前
MCU-芯片时钟与总线和定时器关系,举例QSPI
arm开发·单片机·嵌入式硬件·汽车