Bootstrap

【A2B协议之I2C接口】

A2B协议之I2C接口

一、A2B的I2C接口

I2C接口用于从本地连接的主机直接访问收发器寄存器空间,并通过A2B总线在主收发器和任何被发现的从节点之间远程交换I2C数据。这个协议被称为I2C over distance,交换的I2C数据内嵌在SCF和SRF中。
被配置为master节点的收发器可以识别两个I2C设备地址:
BASE_ADDR:通过I2Cport直接访问主节点的寄存器空间。
BUS_ADDR:使用I2C over distance协议通过A2B总线远程访问从节点寄存器和从节点I2C外设。
I2C BASE_ADDR由上电复位时ADR2/IO2和ADR1/IO1引脚上的逻辑电平设置,从而支持最多四个主设备连接到同一I2C总线。
7位设备地址的LSB决定I2C数据交换是使用BASE_ADDR(位1 = 0)访问收发器还是使用BUS_ADDR(位1 = 1)通过启用的主收发器访问总线节点。
在这里插入图片描述被配置为从的收发器不能识别BUS_ADDR。在从收发器上,I2C接口允许I2C主端和从端行为。当收发器通过A2B总线接收到来自主机的远程I2C外设访问请求时,它就是I2C主控器。从收发器作为I2C的主机,然后将I2C事务转发到其A2B_CHIP寄存器中编程的I2C从地址。当本地外部控制器通过I2C端口访问收发器寄存器(BASE_ADDR)时,它是I2C从机。
收发器上的I2C接口允许在锁相环锁定之前进行寄存器编程。动作(W1A)位写1(例如,A2B_CONTROL.ENDDSC和A2B_CONTROL.NEWSTRCT)在锁相环锁定之前没有效果,因为协议引擎仍处于重置状态。
注意:在主收发器中,A2B_SWCTL、A2B_SLOTFMT、A2B_DATCTL和A2B_DISCVRY寄存器不能在锁相环锁定之前写入。在锁相环锁定建立之前,对这些寄存器的写操作无效。

二、收发器I2C访问

7位设备地址的LSB决定了I2C数据交换是使用BASE_ADDR (bit 1 = 0)访问收发器,还是使用BUS_ADDR (bit 1 = 1)通过被配置的主收发器访问总线节点,如下表所示:
在这里插入图片描述
A2B收发器支持以下读写操作:
(1) 单字写操作:A2B主(I2C从)通过在第九个时钟脉冲期间拉低SDA发出应答,从而完成访问。
(2) 突发模式写序列:收发器在每个数据字节之后自动增加寄存器地址指针,因此可以在不重新编程地址的情况下写入顺序数据寄存器。
(3) 单字读操作:首先R/W位设置为0,表示写操作。这是因为必须写入寄存器地址来设置内部地址。在I2C从机接收到寄存器地址并发出应答后,I2C主机必须发出一个重复的启动命令,然后是R/W位设置为1(读)的芯片地址。这导致I2C数据线SDA反转方向并开始将数据驱动回I2C主机。然后I2C主机每第9个脉冲向从机发出应答。
(4) 突发模式读取序列:收发器在每次读取一个数据字节后自动增加寄存器地址指针,因此可以在不重新编程地址的情况下读取顺序数据寄存器。
通过I2C接口传输数据需要以下步骤:
(1) 数据传输由连接到A2B收发器上的微控制器发起。
(2) 微控制器建立一个启动条件(在SDA上从高到低转换,而SCL保持高),这表明一个地址/数据流跟随在后面。
(3) 在接下来的8个SCL周期中,A2B收发器从主机接收7位地址和R/W位(MSB优先)。
(4) A2B收发器识别传输地址,并通过在第9个时钟脉冲(应答位)期间拉低数据线来响应。
R/W位决定数据的传输方向。当第一个字节的LSB被清除(=0)时,主机向master写入信息。当第一个字节的LSB被设置(=1)时,主机从master读取信息。数据传输一直持续到遇到停止条件(当SDA从低到高转换而SCL保持高位时)。寄存器地址指针自动递增,以支持突发模式I2C读写操作。
以下I2C操作的格式可以参考I2C格式图:
(1) 写入BASE_ADDR/BUS_ADDR可以包含一个或多个字节的数据。设备地址后的第一个字节设置设备的寄存器地址。下一个字节被写入寻址寄存器。由于在每次写入后地址指针都会增加,因此顺序寄存器可以在单个事务中写入。
(2) 从BASE_ADDR/BUS_ADDR读取可以包含一个或多个字节的数据。带写指示的设备地址后面跟设备的寄存器地址和带读访问指示的重复设备地址。
在这里插入图片描述重复设备地址后的第一个字节包含所寻址的寄存器的值。设备地址后的第一个字节设置设备的寄存器地址,后面跟着带有读访问的重复设备地址,接下来的字节包含自动递增的寄存器地址的值。
I2C写时序如下:
在这里插入图片描述
I2C读时序如下:
在这里插入图片描述

三、I2C端口编程概念

使能的主收发器寄存器由A2B主机通过I2C端口使用直接I2C寄存器访问编程。使能的从收发器寄存器也可以通过从节点上使用I2C连接的控制器以这种方式编程;然而,A2B从收发器寄存器通常由A2B主机通过A2B总线上的主收发器使用远程从I2C寄存器访问远程编程。此外,如果从收发器本地连接到从节点上的I2C从设备,那么连接的I2C从设备也可以被A2B主机通过A2B总线使用远程外设I2C访问。
在这里插入图片描述
在该I2C访问编程顺序图中:
(1) I2C ADDR是主收发器I2C设备地址:
直接I2C寄存器访问主收发器使用BASE_ADDR (I2C ADDR: BASE)。
远程从I2C寄存器访问从收发器和远程外设I2C访问从节点上连接I2C的外设使用BUS_ADDR (I2C ADDR: BUS)。
(2) NODEADR是主收发器A2B_NODEADR寄存器:
NODE是A2B_NODEADR.NODE位。
PERI是A2B_NODEADR.PERI位。
(3) CHIP是A2B_CHIP寄存器:
黑色文本表示A2B_CHIP寄存器本身。
蓝色文本表示A2B_CHIP寄存器的值。

1.直接I2C寄存器访问

I2C端口可用于直接访问收发器寄存器空间,无论收发器配置为主还是从:
(1) 在主节点上,A2B主机直接使用该方法访问主收发器寄存器空间。
(2) 在从节点上,本地连接的I2C主机使用该方法直接访问从收发器寄存器空间。
主收发器寄存器访问要求主机进行I2C传输,以包含主收发器I2C设备地址(I2C ADDR: BASE = BASE_ADDR),接下来是寄存器地址(ADDR),最后是与收发器主寄存器数据(R/W数据)。

2.远程从I2C寄存器访问

虽然从节点上本地连接的I2C主机可以直接通过I2C端口对从收发器寄存器进行编程,但A2B系统通常由主节点上的A2B主机完全配置。一共包含两个过程:A2B主机首先直接配置主收发器,然后使用远程I2C访问通过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)。

3.远程外设I2C访问

通过A2B总线远程访问A2B从节点上的I2C外设,A2B主机必须遵循以下编程顺序:
(1) 使用直接I2C寄存器访问设置主收发器A2B_NODEADR.NODE字段为要访问的从节点ID。确保在这个写操作中A2B_NODEADR.PERI被清除,以便后续总线访问目标是从收发器寄存器空间,而不是从外设本身。
(2) 使用远程从I2C寄存器写访问,用连接到从节点的外设的I2C设备地址去设置该从收发器的A2B_CHIP寄存器。
(3) 使用直接I2C寄存器写访问设置主收发器A2B_NODEADR.PERI位(同时保持A2B_NODEADR.NODE的内容),以便后续的BUS_ADDR访问转到所需的从节点I2C外设。
(4) 要访问从节点外设,主机的I2C传输必须包含主收发器的BUS_ADDR (I2C ADDR: BUS),接着是从收发器用来访问从节点I2C外设的地址(ADDR),最后是与该地址相关的数据(Data)。

;