I2C详解学习 - nRF52832蓝牙芯片 TWI-I2C学习详解笔记

(本文部分来源于网上资源)

1. I2C 总线概述

1.1 主要特征

nRF52832 片内集成了 TWI(Two-wire Serial Interface)两线串行总线,TWI 完全兼容 I2C 总线,简单一点,可以直接认为 TWI 是 I2C 总线。
典型的 I2C 应用原理如下图所示,I2C 总线通讯仅需两根信号线,可以连接多个设备, 从设备都有唯一的地址,主设备通过从设备的地址和不同的从设备通讯。

                       

                                                    图 22-1:典型的 I2C 总线应用

 

I2C  总线硬件结构简单,仅需一根时钟线(SCL)、一根数据线(SDA)和两个上拉电阻即可实现通讯。

I2C 总线的 SCL 和 SDA 均为开漏结构,开漏结构的电路只能输出“逻辑 0”,无法输出“逻辑 1”,因此 SCL 和 SDA 需要连接上拉电阻。

上拉电阻的阻值影响传输速率,阻值越大,由于 RC 影响,会带来上升时间的增大,传输的速率慢,阻值小,传输的速率快,但是会增加电流的消耗,一般情况下,我们会选择 4.7K 左右的阻值,在从机数量少,信号线短的情况下,可以适当增加阻值,如使用 10K 的阻值。

I2C 总线中的从设备必须有自己的地址,并且该地址在其所处的 I2C 总线中唯一,主设备通过此唯一的地址即可和该从设备进行数据传输。

I2C 总线支持多主机,但是同一时刻只允许有一个主机。I2C 总线中存在多个主机时, 为了避免冲突,I2C 总线通过总线仲裁决定由哪一个主机控制总线。

I2C 总线只能传输 8 位的数据,数据速率在标准模式下可达 100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达 3.4Mbit/s,nRF52832 的 I2C 总线不支持高速模式。

同时连接到同一个 I2C 总线上的设备数量受总线最大电容(400pF)的限制。

I2C 总线电流消耗很低,抗干扰强,适合应用于低功耗的场合。

 

1.2 I2C 地址

I2C 总线中的设备必须要有唯一的地址,这意味着如果在总线中接入两个相同的设备, 该设备必须有配置地址的功能,这也是我们经常用的 I2C 接口的设备会有几个引脚用来配置地址的原因。

对于 I2C 地址,我们经常看到有的 I2C 接口设备在规格书中描述的是 7 位地址,而有的I2C 接口设备在规格书中描述的是 8 位地址,它们有什么区别?(I2C 也有 10 位地址,但用的较少,这里不做介绍,本章中的内容不涉及到 10 位地址)。

7 位地址和 8 位地址如下图所示,它们结构上是一样的,都是由 7 个地址位加一个用来表示读写的位组成,只是描述上有所区别。

规格书中描述I2C 地址是 7 位地址的设备:给出的是 7 个地址位加R/W 位,最低位(R/W 位)为 0 时表示为写地址,最低位为 1 时为读地址。如果把 0 和 1 分别带入 R/W 位, 得到的地址就和 8 位地址一样了。

规格书中描述 I2C 地址是 8 位地址的设备:直接给出写地址和读地址,也就是最低位(R/W 位)为 0 时的地址和最低位为 1 时的地址。

                          

                                                                 22-2:I2C 地址

 

   由此可见,所谓的 7 位地址和 8 位地址实际上都是 7 位地址加上最低位的读写位,本质上是一样的,只是各个 I2C 接口设备的描述方式不一样。

I2C 保留了如下表所示的两组 I2C 地址,这些地址用于特殊用途。

 

从机地址   

R/ W 位   

描述


表 22-1:保留地址

0000 000   

0

广播呼叫地址。

0000 000   

1

起始字节。

0000 001   

X

CBUS 地址。  

0000 010   

X

保留给不同的总线格式 。

0000 011   

X

保留到将来使用。

0000 1XX   

X

Hs 模式主机码。

1111 1XX   

X

保留到将来使用。

1111 0XX   

X

10 位从机寻址。

 

1.3 I2C 数据传输

(1)起始和停止条件(START and STOP conditions

所有的 I2C 事务都是以 START 开始、STOP 结束,起始和停止条件总是由主机产生, 如下图所示,当 SCL 为高电平时,SDA 从高电平向低电平转换表示起始条件,当 SCL 是高电平时,SDA 由低电平向高电平转换表示停止条件。如果总线中存在多个主机,先将 SDA 拉低的主机获得总线控制权。

                            

 

                                                 图 22-3:起始和停止条件

 

(2)字节格式(Byte format)
I2C 总线发送到 SDA 上的数据必须为 8 位,即一次传输一个字节,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位,首先传输的是数据的最高位 MSB, 如果从机要完成一些其他功能后,例如一个内部中断服务程序才能接收或发送下一个完整的数据字节,那么从机可以将时钟线 SCL 保持为低电平强制主机进入等待状态,当从机准备好接收下一个字节数据并释放时钟线 SCL 后数据传输继续。

                               

 

1.4 ACK NACK

每个字节后会跟随一个 ACK 信号。接收者通过 ACK 位告知发送者已经成功接收一字节数据并准备好接收下一字节数据。所有的时钟脉冲包括 ACK 信号的时钟脉冲都是由主机产生的。

ACK 信号:发送者发送完 8 位数据后,在 ACK 时钟脉冲期间释放 SDA 线,接收者可以将 SDA 拉低并在时钟信号为高时保持低电平,这样就产生了 ACK 信号,从而使得主机知道从机已成功接收数据并且准备好了接收下一数据。

 

NACK 信号:当 SDA 在第 9 个时钟脉冲的时候保持高电平,定义为 NACK 信号。这时, 主机要么产生STOP 条件来放弃这次传输,要么重复START 条件来启动一个新的传输。下面的 5 种情况会导致产生 NACK 信号:

(1)发送方寻址的接收方在总线上不存在,因此总线上没有设备应答。

(2)接收方正在处理一些实时的功能,尚未准备好与主机通信,因此接收方不能执行收发。

(3)在传输期间,接收方收到不能识别的数据或者命令。

(4)在传输期间,接收方无法接收更多的数据字节。

(5)主-接收器要通知从-发送器传输的结束。

 

1.5 从机地址和 R/W 位
I2C 数据传输如下图所示,在起始条件(S)后,发送从机地址,从机地址是 7 位,从机地址后紧跟着的第 8 位是读写位(R/W),读写位为 0 表示写,读写位为 1 表示读。数据传输一般由主机产生的停止位 P 终止,但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件 S 和寻址另一个从机而不是首先产生一个停止条件,在这种传输中可能有不同的读写格式结合。

                                   

                                                                      图 22-5:I2C 总线传输时序

 

可能的数据传输格式有:

(1)主机发送器发送到从机接收器,传输的方向不会改变,接收器应答每一个字节,如下图所示 (2)在第一个字节后,主机立即读从机,在第一次应答后,主机发送器变成主机接收器,从机接收器变成从机发送器。第一次应答仍由从机生成,主机生成后续应答。之前发送了一个非应答(A)的主机产生 STOP 条件。

                             

                                               图 22-7:主机发送第一个字节后立即读取从机

 

(3)复合格式,如下图所示。传输改变方向的时侯,起始条件和从机地址都会被重复,但R/W 位取反。如果主接收器发送重复 START 条件,它会在重复 START 条件之前发送一个非应答(A)。

                                  

                                                                    图 22-8:复合格式

2. nRF52832 TWI 特点

本章描述的是 TWIM(带 EasyDMA 的 TWI 主机),本章中的 TWI 均指的TWIM,即 TWI 主机。

nRF52832 片内集成的 TWI(两线串行总线)兼容 I2C 总线,带有 EasyDMA,可与连接到同一总线的多个从机设备通讯,主要特点如下:

(1)兼容 I2C。

(2)速率:100 kbps、250 kbps 或 400 kbps。

(3)支持时钟延伸。

(4)带 EasyDMA。

(5)TWI 的 SCL 和 SDA 信号可以通过配置寄存器连接到任何一个GPIO,这样可以灵活地实现器件引脚排列,并有效利用电路板空间和信号路由。

nRF52832 的 TWI 的原理框图如下图所示,TWI 主机通过触发STARTTX 或STARTRX 任务启动TWI 传输,通过触发 STOP 任务停止 TWI 传输。TWI 主机在挂起时无法停止,因此必须在 TWI 主机恢复后触发 STOP 任务停止 TWI。启动 TWI 主机后,在TWI 主机停止之前,即在 LASTRX,LASTTX 或 STOPPED 事件之后,不应再次触发 STARTTX 任务或STARTRX 任务。如果从机产生 NACK 输入,那么 TWI 主机将产生ERROR 事件。

                                       

                                                                图 22-9:TWI 的原理框图

 

2.1 EasyDMA

TWI 主机通过 EasyDMA 实现数据传输,因此 TWI 的接收和发送缓存必须位于数据RAM 区域,如果 TXD.PTR 和 RXD.PTR 未指向数据 RAM 区域,则 EasyDMA 传输可能导致 HardFault 或 RAM 损坏。

.PTR 和.MAXCNT 寄存器是双缓冲的,因此在收到RXSTARTED/TXSTARTED 事件后, 可以立即更新并准备下一个 RX/TX 传输。STOPPED 事件表示 EasyDMA 已完成访问 RAM 中的缓冲区。

2.2 低功耗

当系统处于低功耗且不需要 TWI 外设时,为了尽可能降低功耗,应先停止 TWI,然后禁用TWI 外设来实现最低功耗。

如果 TWI 已经停止,则不需要触发 STOP 任务停止 TWI,但是如 TWI 正在执行发送, 则应等待直到收到STOPPED 事件作为响应,然后再通过ENABLE 寄存器禁用外设。

2.3 引脚配置

TWI 的 SCL 和 SDA 信号可以自由映射,通过设置 PSEL.SCL 和 PSEL.SDA 寄存器可以将它们映射到任意的物理引脚。

PSEL.SCL 和 PSEL.SDA 寄存器及其配置仅在 TWI 使能时使用,并且仅在器件处于 ON 模式时保留。TWI 禁用后,引脚将作为常规 GPIO 使用,即可以使用 GPIO 的 OUT 位字段和PIN_CNF [n]寄存器中的配置。PSEL.SCL 和 PSEL.SDA 必须在禁用 TWI 后才可以配置。

为确保 SPIM 中的正确行为,在使用 SPIM 前必须要正确配置 SPIM 的引脚,但是需要注意的是不能同时将多个 SPIM 外设的信号映射到同一个引脚,如不能将 SPIM0 和 SPIM1 的 MISO 同时映射到P0.05,否则,可能会导致不可预测的行为。

当系统处于 OFF 模式时以及 TWI 禁用时,为确保 TWI 主机使用的引脚上的信号电平正确,这些引脚应按照下表所示配置。

TWI 信号

SPIM 引脚

方向

输出值

驱动能力

SCL

由PSEL.SCK 寄存器设置

输入。

不适用

S0D1

SDA

由PSEL.SDA 寄存器设置

输入。

不适用

S0D1

 

                                                         表 22-2:TWI 使能前GPIO 配置

TWI 寄存器

nRF52832 片内集成了 2 个 TWIM 外设,如下表所示。

外设名称

基址

TWIM0

0x40003000

TWIM1

0x40004000

 

                                                              表 22-3:TWIM 基址

========******=========******========******=========******==========

白浪介绍:

(1)关于射频、微波、天线、无线通信、智能硬件、软件编程、渗透安全、人工智能、区块链,Java、Android、C/C++、python等综合能力的培养提升。

(2)各种学习资料、学习软件分享。

1.扫码关注公众号(Geekxiaobai)

                                                    

2. 在后台发送“Python高级编程”“Python Graphics”或者“2003”,即可免费获得电子书籍。仅供学习之用。

3. 扫码关注后,查看往期内容,会有更多资料惊喜等着你来拿哦  

   

  想要更多相关学习资料,可以在文章后面留言哦,后期将会根据留言需求免费分享学习资料哦。

========******=========******========******=========******==========

 

 

发布了42 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sunskyday/article/details/104126858