文章目录

  • 前言
  • 一、I^2C总线协议及硬件介绍
    • I^2C总线
      • I^2C总线概念
      • I^2C总线的信号类型
      • I^2C总线的数据传输格式
    • S3C2410总线控制器
      • S3C2410总线控制寄存器介绍
      • IICCON寄存器
      • IICSTAT寄存器
      • ICCADD寄存器
      • IICDS寄存器
    • S3C2410 IIC总线操作方法
      • 方法一
      • 方法二
    • 通过中断服务程序来驱动IIC传输
    • IIC寄存器操作流程
  • IIC总线操作实例
    • IIC接口RTC芯片M41t11的操作方法
  • 总结

前言

  • 了解I^2C总线协议
  • 掌握S3C2410中I^2C接口的使用方法

一、I^2C总线协议及硬件介绍

I^2C总线

I^2C总线概念

I^2C(又称IIC)总线是一种由PHILIPS公司开发的串行总线,用于连接微控制器及外围设备,具有如下特点

  • 只有两条总线线路:一条串行数据线(SDA),一条串行时钟线(SCL)。
  • 每个连接到总线的器件都可以使用软件根据它的唯一地址来识别
  • 传输数据的设备间是简单的主/从关系。
  • 主机可以用作主机发送器或主机接收器。
  • 它是一个真正的多主机总线,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破环
  • 串行的8位双向数据传输,位速率在标准模式下可达到100kbit/s,在快速模式下可达到3.4Mbit/s。
  • 片上的滤波器可以增加抗干扰功能,保证数据的完整性
  • 连接到同一总线上的IC数量只受到总线的最大电容400pF的限制
    I^2C总线术语的定义
    发送器:发送数据到总线的器件
    接收器:从总线接收数据的器件
    主机:发起停止数据传输,提供时钟信号的器件
    从机:被主机寻址的器件
    多主机:可以有多个主机试图去控制总线,但是不会破环数据
    仲裁:当多个主机试图去控制总线时,通过仲裁可以使得只有一个主机获得总线控制权,并且它传输的信息不被破坏
    同步:多个器件同步时钟信号的过程

I^2C总线的信号类型

I^2C总线在传送数据过程中共有3种类型信号:开始信号、结束信号和响应信号。
开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
响应信号(ACK):接收器在接收到8位数据后,在第九个时钟周期,拉低SDA电平。
如图所示:
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化。

I^2C总线的数据传输格式

发送到SDA线上的每个字节必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能继续接收或发送下一个字节,从机可以拉低SCL迫使主机进入等待状态。当从机准备好接收下一个数据并释放SCL后,数据传输继续。如果主机在传输数据期间也需要完成一些其他功能(例如还是一个内部中断服务程序)也可以拉低SCL以占住总线。
启动一个传输时,主机先发出S信号,然后发出8位数据。这8位数据中前7位为从机的地址,第8位表示传输的方向(0表示写操作,1表示读操作)。被选中的从机发出响应信号。紧接着传输一系列字节及其响应位。最后,主机发出P信号结束本次传输。

  • 主机发出开始信号,传输一个8位数据(前7位表示从机地址的第一个7位数据进行标识,后面一位表示操作(R/W)决定了数据传输的方向,写就是主机-从机,读从机-主机)。同时被选中的从机发出响应信号表示收到。
  • 注意区分不同模式下的格式和步骤

并非所传输8位数据之后都会有ACK信号,有一下3中例外。

  1. 当从机不能响应主机地址时(例如它正忙于其他事而无法响应I^2C总线的操作,或者这个地址没有对应的从机),在第九个SCL周期内SDA线没有被拉低,即没有ACK信号。这时,主机发出一个P信号终止传输或则重新发出一个S信号开始新的传输。
  2. 如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
  3. 主机接收器在接收到最后一个字节后,不会发出ACK信号。于是从机发送器释放SDA线,以允许主机发出P信号结束传输。

S3C2410总线控制器

S3C2410总线控制寄存器介绍

S3C2410的I^2C接口有4种工作模式:主机发送器,主机接收器,从机发送器,从机接收器。内部结构如下:
从图中可以知道S3C2410提供4个寄存器来完成所有的I^2C操作。SDA线上的数据从IICDS寄存器发出,或传入IICDS寄存器中;IICADD寄存器中保存S3C2410当作从机时的地址;IICCON、IICSTAT两个寄存器用来控制或标识各种状态,比如选择工作模式,发出S信号,P信号,决定是否发出ACK信号,检测是否接收到ACK信号。各寄存器的用法如下:

IICCON寄存器

IICCON寄存器用于控制是否发出ACK信号、设置发送器时钟、开启I^2C中断,并标识中断是否发生。各位的含义如下:
使用IICCON寄存器时,使用注意事项

  • I^2C中断在一下3中情况下发生:当发出地址信息或接收到一个从机地址并且吻合时,当仲裁线失败时,当发送/接收完一个字节的数据时。
  • 基于SDA,SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清楚中断。

IICSTAT寄存器

IICSTAT寄存器用于选择I^2C接口的工作模式、发出S信号、P信号,使能接收/发送功能,并标识各种状态,比如总线仲裁是否成功、作为从机时是否被寻址、是否接收到0地址、是否接收到ACK信号等。
功能如下:

ICCADD寄存器

表示从机地址。IICADD寄存器在串行输出使能位IICSTAT[4]为0时(禁止接收/发送功能),才可以写入;在任何时间都可以读出.

IICDS寄存器

保存要发送或已经接收的数据。IICDS寄存器在串行输出使能位IICSTAT[4]为1时,才可以写入;在任何时间都可以读出。

S3C2410 IIC总线操作方法

方法一

当IICCCON[4]即中断状态为为0时,通过写IICSTAT寄存器启动IIC操作

方法二

当IICCON[4]写入0即中断状态位为1时,表示IIC操作被暂停。在这期间设置好其他寄存器之后,向IICCON[4]写入0即可恢复IIC操作。所谓"设置其他寄存器"有以下3种情况。

  • 对于主机模式可以按照方法一
  • 对于发送器,可以将下一个要发送的数据写入IICDS寄存器中,恢复IIC操作后即可发出
  • 对于接收器,可以从IICDS寄存器中读出收到的数据。最后向IICON[4]写入0的同时,设置IICCON[7]决定接收到下一个数据是否发出ACK信号。

通过中断服务程序来驱动IIC传输

  • 当仲裁失败时发生中断——本次传输没有抢到总线,可以稍后继续
  • 当主机模式,发出S信号、地址信息并经过一个SCL周期(对应ACK信号)后,发送中断——主机可以在此时判断是否成功寻址到从机。
  • 对于从机模式,当接收到地址与IICADD寄存器吻合时,先发出ACK信号,然后发生中断——从机可在此时准备后续的传输。
  • 对于发送器,当发送完一个数据并经过一个SCL周期后,发生中断。这时候可以准备发下一个,也可以发P信号结束传输’
  • 对于接收器,当接收到一个数据时,先根据IICCON7决定是否发出ACK信号后,然后发出中断。

IIC寄存器操作流程

IIC总线操作实例

对应着上面的开发流程进行编写程序就行

IIC接口RTC芯片M41t11的操作方法



源码部分,大家参考一下教材,后面有机会一起分析。

总结

今天有点赶时间,但是IIC很重要,在做汽车方面与CAN总线都有着一样的重要性,基本上工作上面对IIC的要求都很多。

Linux应用开发(十一)——I^2C接口相关推荐

  1. 嵌入式linux备份flash,嵌入式Linux裸机开发(十一)——Nandflash

    嵌入式Linux裸机开发(十一)--Nandflash 一.Nand Flash简介 NandFlash是Flash的一种,具有容量较大,改写速度快等优点,适用于大量数据的存储.NandFlash没有 ...

  2. 【正点原子Linux连载】第七十一章 Linux 4G通信实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. 【正点原子Linux连载】第六十一章 Linux I2C驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. poll接口《来自Linux驱动程序开发实例》

    您所在的位置:读书频道 > 操作系统 > Linux > 1.2.7 poll接口 1.2.7 poll接口 2012-05-22 13:38 冯国进 机械工业出版社 我要评论(0) ...

  5. Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  6. Linux驱动开发(十八)---网络(网卡)驱动学习

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  7. C/C++Linux后台开发(入门到精通) 学习路线-架构师篇

    前言:小编也是从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架构 ...

  8. 最全Linux驱动开发全流程详细解析(持续更新)

    Linux驱动开发详细解析 一.驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁. 具体任务 读写设备寄存器(实现控制的方式) 完成设备的轮询.中断处理.DMA通信(CPU与外设通信 ...

  9. A40i T3开发板外扩接口的功能测试

    A40i T3 开发板功能测试 硬件平台:飞凌嵌入式OKA40i-C/OKT3-C开发板, 基于国产芯片 A40i(工业级) T3(车规级)设计研发. 此章节主要说明A40i T3开发板外扩接口的使用 ...

  10. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

最新文章

  1. Python的零基础超详细讲解(第十天)-Python的input()函数
  2. 三巨头共聚AAA:ICapsule没有错,LeCun看好自监督,Bengio谈注意力
  3. “AI工厂”本质:AI基础设施及怎样将AI转化为运营动力
  4. 局域网实现VLAN实例
  5. 图像修复中的TV模型
  6. python bashplotlib_Matplotlib 中文用户指南 7.2 Python shell 中使用 Matplotlib
  7. winrar命令行的一些参数例子
  8. ORA-32004问题解决
  9. 【java8新特性】——方法引用(四)
  10. Elasticsearch分页解决方案
  11. Onvif协议及协议测试工具使用详解
  12. 论:一个草根程序员怎么进BAT??
  13. java异或什么意思_阿里二面准备(Java 研发),精心准备200题(含答案)收割 offer...
  14. nginx: [warn] conflicting server name “xxx“ on 0.0.0.0:80解决
  15. 高德地图插件使用汇总(干货-从注册到熟练使用)
  16. kubelet垃圾回收配置
  17. 《PeopleWare》读书笔记
  18. The Kouga Ninja Scrolls(2018沈阳现场E+切比雪夫距离+线段树维护最大次大最小次小)
  19. html5details标签。
  20. 宏观角度分析百度、360搜索和搜狗

热门文章

  1. matlab Logistic回归模型
  2. 最新Python教程全套合集项目实战(完整)
  3. 动漫头像修复高清,提高分辨率、提高清晰度的模型处理
  4. bootstrap 表格表头固定
  5. linux系统安装在u盘
  6. C语言编写简易图书管理系统
  7. 西门子PLC S7-1200如何实现远程上下载?
  8. SpringBoot中Mybatis-plus的通用接口BaseMapper方法演示(上)
  9. resource outo区别
  10. 第三方微信+支付宝个人免签支付源码