I2C接口共涉及到18个寄存器,下面就来对它们进行具体分析。

先来看I2C配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40050000(I2C0),0x40054000(I2C1),0x40070000(I2C2),0x40074000(I2C3)。它包含适用于主机、从机及监视器功能的模式设置。

(1)第0位(MSTEN)为主机使能位,值为0时禁用I2C主机功能,禁用时主机功能的配置设置不会改变,但主机功能会从内部复位,值为1时使能I2C主机功能,默认为禁止。
(2)第1位(SLVEN)为从机使能位,值为0时禁用I2C从机功能,禁用时从机功能的配置设置不会改变,但从机功能会从内部复位,值为1时使能I2C从机功能,默认为禁止。
(3)第2位(MONEN)为监视器使能位,值为0时禁用I2C监视器功能,禁用时监视器功能的配置设置不会改变,但监视器功能会从内部复位,值为1时使能I2C监视器功能,默认为禁止。
(4)第3位(TIMEOUTEN)为总线超时使能位,值为0时禁用I2C总线超时功能,禁用时超时功能从内部复位,值为1时使能I2C总线超时功能,将会生成两种类型的超时标志,如果标志使能,则会引发中断,系统中通常仅使用一种超时,默认为禁止。
(5)第4位(MONCLKSTR)为监视器功能时钟拉伸使能位,值为0时禁用,此时监视器功能不会执行时钟拉伸。被覆盖之前,软件或DMA并非始终能够读取由监视器功能提供的数据,当非入侵式监控极为重要时,可使用这种模式。值为1时使能,此时监视器功能会执行时钟拉伸,以确保软件或DMA能够读取来自监视器功能的所有数据,默认为禁用。
(6)第5到31位为保留位,写入时只能写0。

接下来看I2C状态寄存器STAT,下表是它的全部位结构,其地址分别为0x40050004(I2C0)、0x40054004(I2C1)、0x40070004(I2C2)、0x40074004(I2C3)。它提供了关于I2C模块全部功能的状态标志和状态信息,寄存器中的某些信息为只读信息,某些标志位可通过写入1清除。

(1)第0位(MSTPENDING)为主机挂起标志位,该位为只读属性。值为0时表示正在进行通信,主机功能繁忙,当前无法接受命令,值为1时表示挂起,主机功能需要软件服务,或正处于闲置状态。

(2)第1到3位(MSTSTATE)为主机状态代码,这些位为只读属性。当MSTPENDING位(第0位)已经置位(即主机挂起或处于闲置状态时),主机状态代码用来反应主机的具体状态。值从0x0到0x4分别表示闲置、接收就绪、发送就绪、NACK地址、NACK数据。
(3)第4位(MSTARBLOSS)为主机仲裁丢失标志位,写1可清除该标志。值为0时表示未发生仲裁丢失,值为1时表示主机功能遭受仲裁丢失,此时主机功能停止驱动总线并进入闲置状态。
(4)第5位为保留位,写入时只能写0。
(5)第6位(MSTSTSTPERR)为主机开始/停止错误标志位,写1可清除该标志。值为0时表示未发生开始/停止错误,值为1时表示主机功能已出现开始/停止错误,主机接口已停止驱动总线并进入闲置状态,无需执行操作。
(6)第7位为保留位,写入时只能写0。
(7)第8位(SLVPENDING)为从机挂起位,该位为只读属性。值为0时表示从机功能当前无需服务,值为1时表示从机功能正等待继续在I2C总线上通信且需要软件服务,可在相邻的SLVSTATE字段(9、10两位)中找到关于所需服务的信息。
(8)第9到10位(SLVSTATE)为从机状态代码,这些位为只读属性,此字段中的每个数值都表示从机功能具体需要的服务。值从0x0到0x3分别表示从机地址、从机接收、从机发送和保留。
(9)第11位(SLVNOTSTR)为从机未执行拉伸标志位,该位为只读属性。该位表示何时从机功能正在拉伸I2C时钟,为了能够在从机操作期间自如调用深度睡眠或掉电模式,则需要如此。值为0时表示从机功能当前正在拉伸I2C总线时钟,此时无法进入深度睡眠或掉电模式,值为1时表示从机功能当前并未拉伸I2C总线时钟,此时可以进入深度睡眠或掉电模式。
(10)第12到13位(SLVIDX)为从机地址匹配索引,这些位为只读属性。当I2C从机功能通过接收到其中一个从机地址(由任意使能的从机地址寄存器确定)匹配的地址被选定,并且识别匹配地址时,此字段有效,匹配的地址可能不止一个,但此处只能报告一个匹配地址。值从0x0到0x3分别表示从机地址0、1、2、3。
(11)第14位(SLVSEL)为从机选定标志位,该位为只读属性。当软件指示从机功能确认地址时,SLVSEL在地址匹配之后置位。当另一地址周期出现一个与从机功能上的使能地址不匹配的地址,当从机软件决定NACK一个匹配地址,或者当在总线上检测到Stop时,其会被清除。如果软件NACK数据,则SLVSEL不会被清除。值为0时表示当前未选择从机功能,值为1时表示当前已选择从机功能。
(12)第15位(SLVDESEL)为从机取消选择标志位,写1可清除该标志。值为0时表示从机功能尚未被取消选择,值为1时表示从机功能已被取消选择。如果此标志通过INTENSET使能,则其在置位时会引发中断。
(13)第16位(MONRDY)为监视器就绪标志位,该位为只读属性,读取MONRXDAT寄存器时,此标志被清除。值为0时表示监视器功能当前无可用数据,值为1时表示监视器功能包含待读取的数据。
(14)第17位(MONOV)为监视器溢出标志位,写1可清除该标志。值为0时表示监视器数据尚未溢出,值为1时表示监视器数据已溢出,只有当监视器时钟拉伸并未由CFG寄存器的MONCLKSTR位使能时,才会发生这种情况。
(15)第18位(MONACTIVE)为监控器激活标志位,该位为只读属性。此标志显示何时监视器认为I2C总线已激活了。值为0时表示监视器功能认为I2C总线未激活,值为1时表示监视器功能认为I2C总线已激活。
(16)第19位(MONIDLE)为监视器空闲标志位,写1可清除该标志。当监视器功能确认I2C总线由激活状态变为非激活状态之后,此标志置位。软件可利用它来确认何时处理监视器功能储集的数据。如果此标志通过INTENSET寄存器使能,则其在置位时,会引发中断。值为0时表示I2C总线并未闲置,或者此标志已被软件清除,值为1时表示自此位上次被软件清除以来,I2C总线至少已被闲置过一次。
(17)第20到23位为保留位,写入时只能写0。
(18)第24位(EVENTTIMEOUT)为事件超时中断标志位,写1可清除该标志。该位指出了事件之间的时间长度何时长于TIMEOUT寄存器指定的时间长度。事件包含Start、Stop和时钟沿。向此位写入1可清除此标志。I2C总线闲置时,不会创建超时。值为0时表示I2C总线事件未引发超时,值为1时表示。I2C总线事件之间的时间长度长于I2C TIMEOUT寄存器指 定的时间长度。
(19)第25位(SCLTIMEOUT)为SCL超时中断标志位,写1可清除该标志。该位指出了SCL保持低电平的时间长度何时长于TIMEOUT寄存器指定的时间长度。值为0时表示SCL低电平时间未引发超时,值为1时表示SCL低电平时间已引发超时。
(20)第26到31位为保留位,写入时只能写0。

-待续-

I2C接口(续一)的更多相关文章

  1. (6)s3c2440用I2C接口访问EEPROM

    在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来, ...

  2. 解决STM32 I2C接口死锁在BUSY状态的方法讨论

    关于STM32的I2C接口死锁在BUSY状态无法恢复的现象,网上已有很多讨论,看早几年比较老的贴子,有人提到复位MCU也无法恢复.只有断电才行的状况,那可是相当严重的问题.类似复位也无法恢复的情况是存 ...

  3. JZ2440 裸机驱动 第12章 I2C接口

    本章目标: 了解I2C总线协议: 掌握S3C2410/S3C2440中I2C接口的使用方法: 12.1 I2C总线协议及硬件介绍 12.1.1 I2C总线协议 1 I2C总线的概念 2 I2C总线的信 ...

  4. 树莓派配置RTC时钟(DS3231,I2C接口)

    1.购买基于DS3231的RTC时钟模块,并且支持3.3V的那种 2.配置树莓派 a.打开树莓派的i2c接口 sudo raspi-config -->Interfacing Options - ...

  5. linux 标准i2c接口(一)

    一:I2C设备操作方式: 1.  应用程序操作法:i2c的设备的驱动可以直接利用linux内核提供的i2c-dev.c文件提供的ioctl函数接口在应用层实现对i2c设备的读写,但是在应用层使用ioc ...

  6. EEPROM的操作---SPI接口和I2C接口

    参考:http://blog.csdn.net/yuanlulu/article/details/6163106 ROM最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了PROM,可以自己写 ...

  7. 为 MaixPy 加入软 I2C 接口(移植 MicroPython 的 I2C)

    起因 本文的重心为讲解如何为一款芯片移植和实现 micropython 的通用组件,但会顺带解释不同芯片的工作方式和特性. 国际惯例,先有起因,再谈问题的解决,所以记得上次总结的 关于 K210 Ma ...

  8. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

    回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...

  9. 通过HttpClient来调用Web Api接口~续~实体参数的传递

    并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数 ...

  10. C51 I2C接口驱动,IO口模拟I2C(主+从)

    Master.asm ;/*------------------------------------------------------------------*/ ;/* --- STC MCU I ...

随机推荐

  1. (5)go-micro微服务domain层开发

    目录 一 domain层介绍说明 二 model层开发 三 repository层开发 四 service层开发 五 最后 一 domain层介绍说明 domain层专注于数据库数据领域开发,我们把数 ...

  2. 通过Terraform创建GCP Pubsub

    1 简介 Terraform是管理许多平台的基础设施的工具,如AWS.GCP和Azure.这篇文章将讲解如何通过Terraform来管理GCP Pub/Sub. 创建GCP项目请参考:初始化一个GCP ...

  3. Codeforces Round #569 (Div. 2)

    题解 Codeforces Round #569 (Div. 2) rank:1306/11165 rate: +43 1424 → 1467 Codeforces Round #569 (Div. ...

  4. linux 高效压缩工具之xz的压缩解压使用

    xz是什么 高压缩率的工具,它使用 LZMA2 压缩算法,生成的压缩文件比传统使用的 gzip.bzip2 生成的压缩文件更小, 不过xz也有一个坏处就是压缩时间比较长,比7z压缩时间还长一些.不过压 ...

  5. 关于计算机与常用DOS命令

    计算机 计算机 计算机由软件和硬件组成. 能够按照程序运行,自动,高速处理海量数据的现代化智能电子设备. 计算机硬件 CPU 主板 内存 电源.主机箱 硬盘 显卡 键盘.鼠标(输入设备) 显示器(输出 ...

  6. Flink1.15仅支持ZooKeeper3.5/3.6

    这是一个验证贴,因为社区文档是错误的. 先说结论 Flink1.15仅支持ZooKeeper3.5/3.6,不再支持3.4.FLINK-25146 Drop support for Zookeeper ...

  7. Ribbon负载均衡 (源码分析)

    Ribbon负载均衡 SpringCloud已经删除了ribbon组件,所以需要手动导入依赖.(要学是因为很多项目业务已经使用了ribbon) 服务拉取的时候添加了@LoadBalanced注解,实现 ...

  8. IDEA 2022 开启热部署

    POM.XML <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. JAVA虚拟机12--Class文件结构-属性表

    1 属性表 1.1 简介 属性表(attribute_info)在前面的讲解之中已经出现过数次,Class文件.字段表.方法表都可以携带自己的属性表集合,以描述某些场景专有的信息. <Java虚 ...

  10. 4.12 疫情数据可视化 毕设(初稿版 crud+可视化echarts

    4.22 完成地图 数据可视化~~~  599x150 解决不显示图片的问题 参考文档 https://blog.csdn.net/qq_51917985/article/details/121380 ...