前言
写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。
I2C简介
I2C 是很常见的一种总线协议,I2C 是 NXP 公司设计的,I2C 使用两条线在主控制器和从
机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据
线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。I2C 总线标准模式下速度可以
达到 100Kb/S,快速模式下可以达到 400Kb/S。
I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C
从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C
设备了,一个 I2C 总线连接多个 I2C 设备如图所示:

实现流程
实现i2c传输功能的步骤:
1、初始化i2c,包括通过I2CCLKENB启动i2c的时钟源PCLK,通过I2CCON设置时钟分频得到i2c_clk,通过I2CSTAT开启i2c功能。
2、建立i2c传输的数据结构
3、编写产生读/写开始信号的函数,产生读/写停止信号的函数,检查ack应答信号的函数
4、编写主机模式下的读/写函数
具体实现
1、初始化i2c
其中i2c_clk的时钟源——PCLK的开启需要到手册的时钟体系板块那里找到相应的寄存器,而实现通过分频得到i2c_clk就到手册的i2c板块那里找相应的寄存器,一般i2c_clk的频率是100KHz或者400KHz。

#define I2C0_Clk (*(volatile unsigned int*)0xC00AE000)
#define I2C1_Clk (*(volatile unsigned int*)0xC00AF000)
#define I2C2_Clk (*(volatile unsigned int*)0xC00B0000)
/* 初始化i2c */
void i2c_init(I2C_Type *Base)
{
Base->I2CSTAT &= ~(1<<4); /* 关闭i2c */
I2C0_Clk |=(1<<3); I2C1_Clk |=(1<<3); I2C2_Clk |=(1<<3); /* 使能i2c0,1,2 的时钟源PCLK */
Base->I2CCON |= (1<<6); /* PCLK/256 = 200/256 = 781KHz */
Base->I2CCON &= (0xF<<0);
Base->I2CCON |= (7<<0); /* Tx clock = 781/7 = 111KHz */
Base->I2CCON |= (1<<7); /* 1:发送允许ACK信号 ,0:发出NO ACK信号*/
Base->I2CSTAT |= (1<<4); /* 使能i2c

本文详细介绍了I2C总线协议,包括其工作原理、速度等级以及多从机特性。接着,阐述了实现I2C传输功能的步骤,包括初始化I2C、建立数据结构、编写控制信号函数以及主机模式下的读写操作。通过具体的代码示例展示了如何在特定硬件平台上初始化I2C、发送读写信号和检查错误状态。
最低0.47元/天 解锁文章
1816

被折叠的 条评论
为什么被折叠?



