AD2428W手册解读之操作与配置 中
5、GPIO远距离
该特性允许在初始编程后在A2B总线上进行GPIO通信,而无需主机干预。主机只需要通过使用虚拟端口初始化GPIO远距离特性即可。GPIO超距离功能具有以下功能:
1、8个并行的1位虚拟端口,由主节点管理。主节点可以在A2B_GPIODDAT寄存器中读取每个虚拟端口的状态。
2、GPIO引脚到虚拟端口0 ~ 7的灵活映射方案。
3、GPIO引脚可以配置为更新A2B_GPIODDAT寄存器内容的输入,也可以配置为反映 A2B_GPIODDAT寄存器内容的输出。
4、当多个虚拟端口映射到一个GPIO输出引脚时,这些值被“OR”在一起。
5、当多个GPIO输入引脚映射到一个虚拟端口时,即使来自多个节点,这些值也会被“OR”在一起。
5.1、配置
在尝试配置给定引脚的GPIO超远距离功能之前,首先要验证它对GPIO可用,如GPIO引脚配置表所示。
如果引脚可用为GPIO,则通过在GPIO超远距离(A2B_GPIODEN)寄存器中设置适当的使能位来使能GPIO 超远距离。当设置一个位时,对应的GPIO引脚可以通过GPIO远端掩码寄存器(A2B_GPIOD0MSK到A2B_GPIOD7MSK,分别对应GPIO能力引脚IO0到IO7)映射到一个或多个远端虚拟端口。这些寄存器中的位0到7分别对应虚拟端口0到7。如果在其中一个寄存器中设置了一个位,它会将与该寄存器相关联的GPIO引脚映射到相应的虚拟端口。
如果对给定的GPIO能力引脚使能GPIO超远距离,引脚的方向完全通过GPIO输出使能寄存器(A2B_GPIOOEN)控制,而不是该寄存器和GPIO 超远距离互补GPIO输入使能寄存器(A2B_GPIOIEN)的组合。当在A2B_GPIOOEN寄存器中设置一个位时,相关的GPIO引脚是GPIO在距离上的输出。如果该位在A2B_GPIOOEN寄存器中被清除,则相关的GPIO引脚在距离上是GPIO的输入。在对感兴趣的引脚使用GPIO时,不需要对A2B_GPIOIEN寄存器进行编程。
如果GPIO引脚是一个输入(A2B_GPIOOEN中相关位= 0),本地节点通过距离掩码寄存器更新与GPIO中设置位相关的虚拟端口(A2B_GPIOD0MSK.IOD0MSK通过A2B_GPIOD7MSK.IOD7MSK)。虚拟端口值可以通过远程数据寄存器(A2B_GPIODDAT)在GPIO中读取。
如果GPIO引脚是一个输出(A2B_GPIOOEN中的相关位 = 1),则映射到该引脚的虚拟端口,由通过距离掩码寄存器的相关GPIO中的设置位决定(A2B_GPIOD0MSK. IOD0MSK通过A2B_GPIOD7MSK.IOD7MSK)加OR来产生GPIO输出值(即A2B_GPIODDAT寄存器中相应位的逻辑OR)。
注意:A2B_GPIODDAT寄存器是只读的。建议主机总是从主节点读取这个寄存器。
距离反转寄存器(A2B_GPIODINV)允许GPIO引脚输入或输出的反转。当在这个寄存器中设置一个位时,相关的GPIO引脚信号是反向的。如果GPIO引脚是一个虚拟端口的输入(A2B_GPIOOEN中的相关位= 0),反转在引脚从引脚进来的时候应用,如果引脚是一个虚拟端口的输出(A2B_GPIOOEN中的相关位= 1),反转在GPIO引脚出来的时候应用。
如果多个节点正在更新同一个虚拟端口,可以使用A2B_GPIODINV寄存器设置将有线或更改为有线和。例如,要创建一个有多个主动高GPIO位的有线和,GPIO输入和GPIO输出必须是反向的。
5.2、将多个GPIO输入映射到一个虚拟端口
当多个节点有一个GPIO输入映射到同一个虚拟端口时,协议将输入引脚视为有线或进入虚拟端口。当虚拟端口处于低位(不活动)时,设置虚拟端口的任何请求都会导致主节点执行一个命令,更新整个系统中的所有A2B_GPIODDAT寄存器。
当虚拟端口处于高(活动)状态时,任何清除虚拟端口的请求都会导致主节点发出一个特殊命令,通知所有从节点该请求。如果任何一个从节点拒绝请求,主节点看到请求被拒绝,A2B_GPIODDAT寄存器保留它们的值。如果没有一个从节点拒绝请求,那么主节点将看到请求被接受,并使用更新后的A2B_GPIODDAT值。
5.3、GPIO远程编程示例
下面的步骤描述了在距离上使用GPIO的引脚映射情况。
注意:GPIO编程必须在发现节点之后进行。有关节点发现的更多信息,请参见简单发现流程
和附录A:附加发现流程示例小节。
5.3.1、将Master节点DRX1/IO6 Pin映射到Slave 2 ADR1/IO1 Pin:
下面以主节点DRX1/IO6引脚映射到从节点2 ADR1/IO1引脚为例进行说明。
1、将0x04写入主节点A2B_GPIOD6MSK寄存器,将DRX1/IO6引脚映射到虚拟端口2。
2、将0x40写入主节点A2B_GPIODEN寄存器,以在DRX1/IO6引脚上远程访问GPIO。
3、将0x02写入从节点2 A2B_GPIOOEN寄存器,使ADR1/IO1引脚GPIO输出。
4、将0x04写入从节点2 A2B_GPIOD1MSK寄存器,将虚拟端口2映射到ADR1/IO1引
脚。
5、将0x02写入从节点2 A2B_GPIODEN寄存器,使ADR1/IO1引脚上的GPIO通过远程访问。
5.3.2、将Slave 1 DTX1/IO4 Pin映射到Master Node ADR1/IO1 Pin:
下面以从1 DTX1/IO4引脚映射到主节点ADR1/IO1引脚为例进行说明。
1、将0x10写入从节点1 A2B_GPIOD4MSK寄存器,将DTX1/IO4引脚映射到总线GPIO端口4。
2、将0x10写入从节点1 A2B_GPIODEN寄存器,使DTX1/IO4引脚上的GPIO通过远程访问。
3、将0x02写入主节点A2B_GPIOOEN寄存器,使ADR1/IO1引脚的GPIO输出生效。
4、将0x10写入主节点A2B_GPIOD1MSK寄存器,将总线GPIO端口4映射到ADR1/IO1引脚。
5、将0x02写入主节点A2B_GPIODEN寄存器,使ADR1/IO1引脚上的GPIO通过远程访问。
5.3.3、将从0到2上的ADR1/IO1引脚映射到主节点ADR1/IO1引脚下面介绍如何将从0到2上的ADR1/IO1引脚映射到主节点ADR1/IO1引脚。
1、对于从节点2、1和0,将0x01写入A2B_GPIOD1MSK寄存器,将每个从节点的ADR1/IO1引脚映射到总线GPIO端口0。
2、对于从节点2、1和0,将0x02写入A2B_GPIODEN寄存器,以在每个从节点的ad1/IO1引脚上远程访问GPIO。
3、将0x02写入主节点A2B_GPIOOEN寄存器,使ADR1/IO1引脚的GPIO输出生效。
4、将0x01写入主节点A2B_GPIOD1MSK寄存器,将总线GPIO端口0映射到ADR1/IO1引脚。
5、将0x02写入主节点A2B_GPIODEN寄存器,使ADR1/IO1引脚上的GPIO通过远程访问。
6、收发器标识
每个A2B收发器都有一个供应商ID寄存器(A2B_VENDOR),一个产品ID寄存器(A2B_PRODUCT)和一个版本ID寄存器(A2B_VERSION),以指示主机系统中存在哪些A2B收发器。每个A2B收发器厂商被分配一个唯一的厂商ID(模拟设备A2B收发器使用0xAD作为厂商ID)。A2B_PRODUCT和A2B_VERSION寄存器由芯片供应商分配,以唯一标识芯片并表明A2B互操作性。收发模块的产品ID分别为0x26 (AD2426W)、0x27 (AD2427W)、0x28 (AD2428W)。
每个A2B收发器也有一个A2B_CAPABILITY寄存器,以识别可用的控制接口,以及I2C接口的存在(A2B_CAPABILITY.I2CAVAIL = 1)。
6.1、在EEPROM中自动配置系统信息
在A2B系统中,如果从模块包含一个配置内存(I2C EEPROM),其组织和内容如附录C:模块ID和模块配置内存中描述的那样,则可以确定每个A2B节点的供应商和特定的产品ID来进行自动配置。当主机事先不知道确切的系统配置时,使用自动配置进行发现。从节点的特定配置命令也可以通过可选配置块存储在配置内存中。
7、待机模式
待机状态下,A2B总线上没有上行流量。只有一个最小的(19位)SCF存在以保持所有从节点同步,并且没有SRF。头计数错误和CRC错误被忽略,数据槽被禁用。在待机模式下,GPIO设置保持不变。
在正常模式下,主机可以写主收发器A2B_DATCTL寄存器以进入备用模式,但是直到新的结构应用到系统中,写才生效。主机执行如下操作:
1、 在主收发器中设置A2B_DATCTL.A2B_DATCTL位生成一个0x80的广播会将所有发现的从节点的A2B_DATCTL.STANDBY为设置为0x80。将0x80写入A2B_DATCTL寄存器确保数据槽被禁用。
2、在主收发器上设置A2B_CONTROL.NEWSTRCT位来应用新的结构。
应用新的结构后,系统切换到备用模式。通过将0x00写入主节点中的A2B_DATCTL寄存器,主机可以将系统移回正常模式。该指令在所有的从节点中向A2B_DATCTL寄存器生成0x00的广播写操作。当系统回到正常模式时,主节点向主机提供备用完成中断(A2B_INTTYPE = 0xFE)。