当前位置: 首页 > news >正文

Linux内核i2c通信,绝对干货!基于Cortex-A9,分析Linux内核I2C架构

3. 应答信号的传输

为了完成一个字节数据的传输,接收方将发送一个应答位给发送方。应答信号出现在SCL线上的时钟周期中的第九个时钟周期,为了发送或接收1个字节的数据,主机端会产生8个时钟周期,为了传输一个ACK位,主机端需要产生一个时钟脉冲。ACK时钟脉冲到来之际,发送方会在SDA线上设置高电平以释放SDA线。在ACK时钟脉冲之间,接收方会驱动和保持SDA线为低电平,这发生在第9个时钟脉冲为高电平期间。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号(即不发出ACK信号),以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

99228451286c633c918e6df5bbf0492e.png

4. 读写操作

当I2C控制器在发送模式下发送数据后,I2C总线接口将等待直到移位寄存器(I2CDS)接收到一个数据。在往此寄存器写入一个新数据前,SCL线应该保持为低电平,写完数据后,I2C控制器将释放SCL线。当前正在传输的数据传输完成后,4412会捕捉到一个中断,然后cpu将开始往I2CDS寄存器中写入一个新的数据。

当I2C控制器在接收模式下接收到数据后,I2C总线接口将等待直到I2CDS寄存器被读。在读到新数据之前,SCL线会被保持为低电平,读到数据后I2C控制器将释放掉SCL线。一个新数据接收完成后,4412将收到一个中断,cpu收到这个中断请求后,它将从I2CDS寄存器中读取数据。

5. 总线仲裁机制

总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

6. 终止条件

当一个从接收者不能识别从地址时,它将保持SDA线为高电平。在这样的情况下,主机会产生一个停止信号并且取消数据的传输。当终止传输产生后,主机端接收器会通过取消ACK的产生以告诉从机端发送器结束发送操作。这将在主机端接收器接收到从机端发送器发送的最后一个字节之后发生,为了让主机端产生一个停止条件,从机端发送者将释放SDA线。

7. 配置I2C总线

如果要设置I2C总线中SCL时钟信号的频率,可以在I2CCON寄存器中设置4位分频器的值。I2C总线接口地址值存放在I2C总线地址寄存器(I2CADD)中,默认值未知。

8. 每种模式下的操作流程图

在I2C总线上执行任何的收发Tx/Rx操作前,应该做如下配置:

(1)在I2CADD寄存器中写入从设备地址(2)设置I2CCON控制寄存器

a. 使能中断b. 定义SCL频率

(3)设置I2CSTAT寄存器以使能串行输出

下图为主设备发送模式

38bb5674f1e4a708cdfc980d8d2ad9d9.png

下图为主设备接收模式

f5980887e1c62388dbf10070378ae3b4.png

下图为从设备发送模式

c033d47a32d3fddf35fc4f02300771b3.png

下图为从设备接收模式

5df4325130816ccbc6de3ac0464548df.png

I2C控制器寄存器

I2C控制器用到的寄存器如下所示:

22a0a5826c28ebb2d48c004e0cc99cee.png

1-- I2C总线控制寄存器

IICCON寄存器用于控制是否发出ACK信号、设置发送器的时钟、开启I2C中断,并标识中断是否发生

68c5e6f609f9e629ab5d4c1bb4ef4d87.png

使用IICCON寄存器时,有如下注意事项

发送模式的时钟频率由位[6]、位[3:0]联合决定。另外,当          IICCON[6]=0时,IICCON[3:0]不能取0或1。

位[4]用来标识是否有I2C中断发生,读出为0时标识没有中断发生,读出为1时标识有中断发生。当此位为1时,SCL线被拉低,此时所以I2C传输停止;如果要继续传输,需写入0清除它。

中断在以下3种情况下发生:

当发送地址信息或接收到一个从机地址并且吻合时;当总线仲裁失败时;当发送/接收完一个字节的数据(包括响应位)时;

基于SDA、SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清除中断。

如果IICCON[5]=0,IICCON[4]将不能正常工作,所以,即使不使用I2C中断,也要将IICCON[5]设为1.

2 -- I2C状态寄存器

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

16c8fb0a53e4eded37bcca3223d2e6b7.png

相关文章:

  • linux中文本文件过滤搜索,Linux命令(八)过滤文本 grep
  • linux获得ram地址,Linux 如何查看系統硬體的記憶體(RAM)資訊
  • linux qt多屏幕输出,QT5 Ubuntu下c++调用linux命令、显示输出、执行多条命令
  • linux 获取时间间隔,获取时间间隔避免误差的方法
  • linux下for循环怎么退出,Linux之for循环进程终止的方法
  • linux cp scp rsync,为什么我的rsync与纯cp甚至scp相比都这么慢?
  • c语言队列的基本操作实验报告,数据结构栈和队列实验报告C语言源码(程序在C-Free下通过) .doc...
  • c语言单片机掉电模式程序,单片机掉电唤醒程序求解
  • 优秀C语言程序设计,C语言程序设计_优秀讲义.ppt
  • c语言交换ab排序流程图,各种排序的流程图 大家帮忙弄一下
  • c语言简单的投票系统,c语言简易电子投票平台
  • c语言中组成数据文件的成分是,C语言中,组成数据文件的成分是()。A.记录 B.数据行 C.数据块 D.字符(字节)序列...
  • c语言超长正整数加法,两个超长正整数的加法
  • android edittext 设置字体颜色,Android应用开发之Android更改EditText下划线的颜色样式和动态获取输入的字数的代码教程...
  • android 背景色阴影,Android 带阴影背景图片
  • SegmentFault for Android 3.0 发布
  • 10个最佳ES6特性 ES7与ES8的特性
  • 30秒的PHP代码片段(1)数组 - Array
  • co模块的前端实现
  • git 常用命令
  • Laravel Telescope:优雅的应用调试工具
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Nodejs和JavaWeb协助开发
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React系列之 Redux 架构模式
  • 笨办法学C 练习34:动态数组
  • 码农张的Bug人生 - 见面之礼
  • 普通函数和构造函数的区别
  • 怎么把视频里的音乐提取出来
  • 7行Python代码的人脸识别
  • AI算硅基生命吗,为什么?
  • raise 与 raise ... from 的区别
  • 阿里云移动端播放器高级功能介绍
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​批处理文件中的errorlevel用法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (动态规划)5. 最长回文子串 java解决
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (十一)图像的罗伯特梯度锐化
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ..回顾17,展望18
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 5种线程安全集合
  • .NET Core中的去虚
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 提取注释生成API文档 帮助文档
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境