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。

写操作

读操作

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

主机发送器操作

主机接收器操作

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

相关推荐
satadriver1 天前
Qemu arm操作系统开发环境
arm开发
待什么青丝2 天前
【TMS570LC4357】之相关驱动开发学习记录1
c语言·arm开发·驱动开发·学习
南玖yy3 天前
x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
开发语言·汇编·arm开发·后端·架构·策略模式
菜只因C4 天前
嵌入式系统:从技术原理到未来趋势(驱动程序篇)
arm开发
!chen6 天前
鲲鹏Arm+麒麟V10 K8s 离线部署教程
java·arm开发·kubernetes
ScilogyHunter6 天前
ARM P15协处理器指令详解:架构、编程与应用实践
arm开发·协处理器指令·cp15
apolloyhl7 天前
1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集
arm开发·stm32·单片机·嵌入式硬件
二进制coder8 天前
芯片:数字时代的算力引擎——鲲鹏、升腾、海光、Intel 全景解析
arm开发·架构·硬件架构
荆楚闲人8 天前
Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法
arm开发
MonKingWD8 天前
【Redis原理】四万字总结Redis网络模型的全部概念
网络·arm开发·redis