A2B收发器技术参考手册 第三章 A2B 操作和配置
A2B IIC功能介绍,推荐参考B站视频:《A2B IIC功能介绍》
三,A2B 操作和配置
A2B总线是高等级可编程的,可以满足多种使用场景。A2B系统易于配置,基于对系统、节点和外设的了解。通过分别收集每个从设备的信息,可以获得确切的系统配置。例如,同一A2B模块可以由不同供应商提供,每个模块都有独特的寄存器编程要求。一种模块可以使用TDM4作为音频接口,而另一种则使用TDM8。一个模块可以提供两个上行通道,而另一个模块可以提供三个上行通道,而主机在此之前并不知道连接了多少个节点。
重要提示:确保寄存器编程产生有效的系统配置。
Analog Devices 提供免费的 SigmaStudioTM(http://www.analog.com/SigmaStudio)工具,具有直观的图形用户界面,用于架构、配置和设置 A2B 总线。这些工具还可以为嵌入式软件生成驱动程序代码。
Linux 和 QNX 软件驱动程序也可根据请求提供。
3.1 I2C 端口编程概念
主启用的收发器寄存器通过 A2B 主机使用直接 I2C 寄存器访问直接编程。启用从设备的收发器寄存器也可以通过连接到从节点的 I2C 控制器以这种方式编程;然而,A2B 从收发器寄存器通常是通过 A2B 主机通过主收发器在 A2B 总线上远程编程的,使用的是远程从 I2C 寄存器访问。此外,如果从收发器本地连接到从节点的 I2C 从设备,则该连接的 I2C 从设备也可以通过 A2B 主机在 A2B 总线上使用远程外设 I2C 访问进行远程访问。I2C 访问的编程序列图是编程收发器寄存器和访问从节点 I2C 外设设备时所需的编程序列的图形表示。
在 I2C 访问的编程序列图中:
- I2C ADDR 是主收发器的 I2C 设备地址。
- 对主收发器的直接 I2C 寄存器访问使用 BASE_ADDR(I2C ADDR: BASE)。
- 对从收发器的远程从 I2C 寄存器访问和对从节点上与 I2C 连接的外设的远程外设 I2C 访问使用 BUS_ADDR(I2C ADDR: BUS)。
注意:有关 BASE_ADDR 和 BUS_ADDR 的更多细节,请参见收发器 I2C 访问。
- NODEADR 是主收发器的 A2B_NODEADR 寄存器。
- NODE 是 A2B_NODEADR.NODE 字段。
- PERI 是 A2B_NODEADR.PERI 位。
- CHIP 是 A2B_CHIP 寄存器:
- 黑色文本表示 A2B_CHIP 寄存器本身。
- 蓝色文本表示 A2B_CHIP 寄存器的值。
3.1.1 直接I2C寄存器访问
I2C 端口可以用于直接访问收发器寄存器空间,无论收发器是配置为主设备还是从设备:
- 在主节点上,A2B 主机通过此方法直接访问主收发器的寄存器空间。
- 在从节点上,本地连接的 I2C 主机通过此方法直接访问从收发器的寄存器空间。
如 I2C 访问编程序列图中的主 I2C 访问部分所示,主收发器寄存器访问要求主机的 I2C 传输包含主收发器 I2C 设备地址(I2C ADDR: BASE = BASE_ADDR),其次是寄存器地址(ADDR),最后是与主收发器寄存器相关联的数据(R/W 数据)。有关更多细节,请参见收发器 I2C 访问。
注意:该主 I2C 访问序列对于直接访问从收发器寄存器空间的从节点上的 I2C 连接主机是相同的。
3.1.2 远程从 I2C 寄存器访问
尽管从节点上的本地连接 I2C 主机可以通过 I2C 端口直接编程从收发器寄存器,但 A2B 系统通常由主节点上的 A2B 主机进行全面配置。如 I2C 访问编程序列图中的从设备 0 I2C 访问部分所示,这一 2 步过程首先要求 A2B 主机直接配置主收发器,然后使用远程 I2C 访问通过 A2B 总线编程特定的从收发器。A2B 主机必须使用以下编程序列从主节点远程访问 A2B 从收发器寄存器空间通过 A2B 总线。
1,使用直接 I2C 寄存器访问将主收发器的 A2B_NODEADR.NODE 字段设置为要访问的从节点 ID。在此写入操作中,确保 A2B_NODEADR.PERI 位被设置为 0,以便后续的总线访问针对指定的从收发器寄存器空间,而不是连接到指定从设备的 I2C 外围设备。
附加信息:将 A2B_NODEADR.NODE 字段设置为 0 意味着后续的总线访问将针对从节点 0。如果此字段设置为 1,后续的总线访问将针对从节点 1。如果想要将写入广播到所有发现的节点(主设备和从设备),请确保在此写入中也设置广播位(A2B_NODEADR.BRCST)。
2,要访问从收发器寄存器,主机的 I2C 传输包括主收发器的总线地址(I2C ADDR: BUS = BUS_ADDR),接着是从收发器寄存器地址(ADDR),最后是与从收发器寄存器相关联的数据(Data)。有关更多细节,请参见收发器 I2C 访问。
3.1.3 远程外设 I2C 访问
I2C 访问编程序列图中的从设备 1 I2C 访问部分说明了 A2B 主机通过 A2B 总线使用远程外设 I2C 访问访问连接到从收发器 I2C 端口的外设所需的序列。A2B 主机必须遵循以下编程序列,以便通过 A2B 总线访问 A2B 从节点上的 I2C 外设(例如,麦克风或 DAC)。
1,使用直接 I2C 寄存器访问写操作,将主收发器的 A2B_NODEADR.NODE 字段设置为连接到要访问的外设的从节点 ID。在此写入操作中,请确保清除 A2B_NODEADR.PERI 位,以便后续的总线访问是针对目标从收发器的寄存器空间,而不是从外设本身。
附加信息:在此写入操作中,A2B_NODEADR.NODE 字段设置为 1,以便后续的总线访问针对从节点 1。如果打算将外设写入广播到所有发现的节点(主设备和从设备),请确保在此写入中也设置 A2B_NODEADR.BRCST 位。如果目标从收发器中的 A2B_CHIP 寄存器已经设置为预期外设访问的 I2C 地址,请执行此写入操作,并设置(而不是清除)A2B_NODEADR.PERI 位,然后直接进入最后一步。
2,使用远程从设备 I2C 寄存器访问写操作,将所需的从收发器的 A2B_CHIP 寄存器编程为连接到从设备的外设的 I2C 设备地址。
3,使用直接 I2C 寄存器访问写操作设置主收发器的 A2B_NODEADR.PERI 位(同时保持 A2B_NODEADR.NODE 字段的内容),确保后续的 BUS_ADDR 访问可以发送到所需的从节点 I2C 外设。
4,要访问从节点外设,主机的 I2C 传输必须包含主收发器的 BUS_ADDR(I2C 地址:BUS),接着是从收发器将用于访问从节点 I2C 外设的地址(ADDR),最后是与该地址相关联的数据(Data)。
3.2 系统启动与发现
A2B 系统由 A2B 主机启动。一旦电源正常建立,系统中的每个节点必须按顺序进行发现和配置,从主节点开始。
3.2.1 复位状态和操作状态
丢失 PLL 锁定会重置所有寄存器信息,除了 A2B_BMMCFG 和 A2B_CONTROL.MSTR。收发器状态图显示了在启动和运行完整的 A2B 系统时,了解的收发器状态信息。
备注:由于持续模式是仅限于从设备的功能,主收发器不会进入 SUSTAIN 状态。在主收发器上丢失 PLL 锁定会直接返回到 POWER-UP 状态。
收发器上电与复位
当收发器初始上电时,它处于 RESET 状态。在 RESET 状态下,所有 A2B 系统寄存器都保持复位状态,直到收发器进入 POWER-UP RESET 状态,此状态取决于施加到收发器上的电源(VIN)。
一个内部的上电复位电路监测 VIN 电源引脚的状态,保持内部上电复位信号(PORST)为低电平,直到满足 VRSTN 规格,此时 PORST 被拉高以指示收发器已正确供电。接着,收发器过渡到 POWER-UP RESET 状态。
在收发器进入 POWER-UP RESET 状态后,PORST 信号保持高电平,除非在 VIN 电源引脚上感应到的电压降到其 VRST 规格范围内,此时 PORST 会被拉低,将收发器带回 RESET 状态。
3.2.2 主节点启动与操作
参考收发器状态图,ADR1/IO1 和 ADR2/IO2 引脚被锁存以确定 I2C 设备地址,当收发器过渡到 POWER-UP RESET 状态时,收发器在不超过 2.5 毫秒后可访问 I2C 设备。然后,A2B 主机在驱动 SYNC 引脚(主设备启用的收发器的 PLL 的输入时钟)之前设置收发器中的 A2B_CONTROL.MSTR 位,时钟频率为系统的音频采样率(可选择 48 kHz 或 44.1 kHz)。主收发器根据 PLL 锁定时间(tPLK)规格锁定其 PLL 到接收到的 SYNC 信号。
备注:建议主机设置超时,超过 PLL 锁定时间(tPLK)规格,以便软件能够检测到不响应的主收发器。
当 PLL 锁定后,主收发器过渡到 NODE READY PLL LOCKED 状态,此时它向主机生成 MSTR_RUNNING(0xFF)中断(IRQ/IO0 引脚被拉高),该信息存储在中断类型寄存器(A2B_INTTYPE)中,表示主收发器已准备好通过 I2C 接口进行编程。
备注:一旦 PLL 锁定,写入 A2B_CONTROL.MSTR 位将没有效果。如果主收发器的 PLL 在总线操作期间解锁,收发器将返回到 POWER-UP 状态,因为 SUSTAIN 状态仅为从设备功能(SUSTAIN = 0)。除 A2B_CONTROL 寄存器外,所有寄存器均返回其复位值。
3.2.3 从节点启动与操作
参考收发器状态图,一旦建立本地或A2B总线电源,收发器就会进入POWER-UP RESET(上电复位)状态,并且ADR1/IO1和ADR2/IO2引脚会被锁存以确定I2C设备地址。默认情况下,该收发器为从设备,并且在进入POWER-UP RESET状态后的2.5毫秒内准备好被发现和编程。
备注:在 POWER-UP RESET 状态下,BCLK 和 SYNC 输出处于三态。
在 POWER-UP RESET 状态下,连接的主机可以通过 I2C 端口使用直接 I2C 寄存器访问配置从收发器寄存器空间的子集。这些寄存器包括:
虽然在 POWER-UP RESET 状态下可以写入这些寄存器,但编程的值在收发器进入 NODE READY PLL LOCKED 状态之前不会生效,唯一的例外是槽寄存器(A2B_BCDNSLOTS、A2B_LDNSLOTS、A2B_LUPSLOTS、A2B_DNSLOTS、A2B_UPSLOTS、A2B_UPMASK0 到 A2B_UPMASK3,以及 A2B_DNMASK0 到 A2B_DNMASK3)。对列出的槽寄存器编程的值在主收发器的 A2B_DATCTL 寄存器被编程并且新结构随后应用(A2B_CONTROL.NEWSTRCT = 1)之前也不会生效。
在 POWER-UP RESET 状态下,从设备收发器等待来自主设备的同步控制帧(SCF),当主机通过设置主设备收发器的 A2B_DISCVRY 寄存器为目标从设备的响应时间来启动该特定 A2B 系统从设备的发现过程时,这一过程被触发。当进行此写操作时,主设备通过发送包含响应时间值的发现帧来启动发现过程。被发现的从设备随后提取信息以设置其响应时间(A2B_RESPCYCS)。这些发现帧为从设备收发器提供输入时钟,从设备收发器根据 PLL 锁定时间(tPLK)规范锁定其 PLL。一旦从设备收发器 PLL 锁定,它就进入 NODE READY PLL LOCKED 状态,并开始向上游节点生成同步响应帧(SRF),这会导致主设备收发器生成 DSCDONE 中断(A2B_INTTYPE = 0x18),表明从设备收发器已准备好通过远程从设备 I2C 寄存器访问在 A2B 总线上进行编程。
注意:当同时尝试从 A2B 总线(使用远程从设备 I2C 寄存器访问)和 I2C 端口(使用直接 I2C 寄存器访问)对同一寄存器进行写入时,这些 I2C 访问发生的顺序是不可预测的。因此,在同时来自两个来源的 I2C 事务时,必须特别小心。
提示:如果应用中希望进行本地节点编程(使用直接 I2C 寄存器访问),可以通过与主节点使用一个邮箱握手来避免这种潜在的冲突,以便主机在准备开始进行寄存器访问时写入从设备的一个邮箱,并等待从设备读取该邮箱,以此指示其初始化序列已完成。有关更多信息,请参见邮箱部分。
在 NODE READY PLL LOCKED 状态下,BCLK 和 SYNC 输出被拉低,直到从设备收发器的 A2B_PDMCTL(对于 PDM 模式)或 A2B_I2SCFG(对于 I2S/TDM 模式)寄存器中启用了任何 I2S/TDM/PDM 端口数据引脚。
如果在总线操作期间从设备收发器的 PLL 解锁,并且时钟保持特性被禁用(A2B_SUSCFG.SUSDIS = 1,在收发器状态图中表示为 SUSTAIN = 0),它将返回到 POWER-UP 状态。一旦回到 RESET 状态,主设备可以发出另一个发现序列。
时钟保持功能
默认情况下(在收发器状态图中表示为 SUSTAIN = 1),从设备收发器具有时钟保持功能,可以对带有处理器和 DAC 的从节点进行断电处理,同时优雅地静音本地供电的从节点的音频信号。当总线失去通信且从设备收发器无法恢复可靠时钟(在收发器状态图中为 PLL UNLOCK)时,从设备收发器进入 SUSTAIN 状态,前提是时钟保持功能未被禁用(A2B_SUSCFG.SUSDIS = 1)。进入 SUSTAIN 状态时,收发器会执行以下操作:
- 在 1024 个 SYNC 周期内以当前时钟频率运行
- I2S/TDM 端口继续运行
- 如果启用,则在 GPIO 上输出 SUSTAIN 状态信号
- 在 SUSTAIN 状态下不尝试 PLL 重新锁定
- 重置并重新进入 POWER-UP RESET 状态
- 如果存在稳定的 SCF 发现帧,则过渡到 NODE READY PLL LOCKED 状态
如果保持 GPIO 输出使能位(A2B_SUSCFG.SUSOE)被设置,当收发器处于 SUSTAIN 状态时,来自 PLL 的保持信号会在 A2B_SUSCFG.SUSSEL 位域选择的 GPIO 引脚上被拉高。此功能的优先级高于其他 GPIO 输出,但低于引脚上的功能输出。例如,如果时钟输出 1 被启用(A2B_CLK1CFG.CLK1EN = 1),那么 ADR1/IO1 引脚会作为时钟输出。设置 A2B_SUSCFG.SUSOE 位并在 ADR1/IO1 引脚上配置保持输出(A2B_SUSCFG.SUSSEL = 1)并不会覆盖这一行为。
来自 PLL 的保持信号在超帧开始时附近变为高电平。一旦保持信号高电平,DTX0/IO3 和 DTX1/IO4 引脚上会在随后的 I2S/TDM 帧中产生衰减数据值。TX 帧缓冲区中的数据(参见管理 A2B 系统数据流)是从 A2B 总线上接收到的 32 位值,将输出到 I2S DTX0/DTX1 数据引脚之一或两个。负值逐渐衰减至 0,而正值在启用的数据引脚上逐渐衰减至 -109 dB(0x00001F00)。
3.2.4 节点发现与初始化
本节提供有关 A2B 总线系统的简单节点发现和初始化的信息。在本手册的附录 A:额外的发现流程示例中,描述了修改、优化和高级的发现流程。您可以将这些软件流程图作为发现和初始化的指导。
简单发现流程
所有从节点都按顺序从从节点 0 开始被发现,直到系统中最后一个可用的从节点,使用的软件流程如简单发现流程图所示。在该图中,各个阶段显示了在主机和主控收发器之间通过 I2C 接口发出的命令。写命令标识为“wr”,读命令标识为“rd”,并附有正在访问的 REGISTER_NAME。“M”表示对 BASE_ADDR 的访问,“S”表示对 BUS_ADDR 的访问。
注意:在简单发现流程图中,在主节点或任何从节点中设置 A2B_SWCTL.ENSW 位会导致该节点开始向下游的下一个连接从节点发送 SCFs,从而允许下一个从收发器在主节点启动针对它的发现帧之前开始锁定其 PLL。
按照以下指南使用反向接线功能 A2B_CONTROL.XCVRBINV(从 LVDS XCVR B 反转数据):
-
在主节点中,先设置 A2B_CONTROL.XCVRBINV 位,然后再写入 A2B_SWCTL.ENSW 位。在为其他目的(例如写入 A2B_CONTROL.NEWSTRCT 位)写入 A2B_CONTROL 寄存器时,请小心不要不小心清除 A2B_CONTROL.XCVRBINV 位。
-
在任何从节点中,必须在写入 A2B_SWCTL.ENSW 位之前先设置 A2B_CONTROL.XCVRBINV 位。
一旦所有从节点被发现,便可以初始化节点以进行同步数据交换。示例流程图从最后一个节点开始初始化ÿ