s5p6818裸机-i2c

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

前言

写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。

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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值