1.1 GPIO
GLink交换芯片支持16个双向GPIO,通过寄存器可控制GPIO的电平或读取GPIO的电平状态。上电复位完成默认为输入端口。
表1 GPIO相关寄存器
1.2 可编程时序接口
CLink交换芯片工作在交换机+配置节点或双交换机+配置节点模式时,支持一组4通道的可编程时序接口。可编程时序接口复用外部GPIO的高4位,可按照预先配置的指令集实现接口时序在线编程,产生SPI、I2C等常用接口时序,实现AD芯片采集或简单通信功能。
表2 GPIO工作模式选择寄存器
可编程时序接口由独立的接口引擎开展过程运算,包含指令集存储模块PRAM、数据存储模块DRAM、解码模块、执行模块和接口引擎,远程配置指令对各数据块进行初始化后,可触发接口引擎进行运算,按照预先配置的指令集逐行执行,调用工作寄存器、移位寄存器、等待等功能,读取或输出接口数据,实现需要的接口时序。
图1 可编程时序接口内部结构
例如,通过可编程时序接口控制I2C接口的某芯片,设置合理的指令集产生I2C协议下的起始信号、响应信号、停止信号等,可编程时序接口的接口引擎运行指令集后,调用DRAM中的数据通过移位寄存器按位串行输出,也可以将被控制芯片产生的串行数据通过移位寄存器记录在DRAM中,经多次数据交互得到多个有效数据。
1.2.1 PRAM与DRAM
可编程时序接口PRAM用于存储CPU运行的指令集,由配置NC写入,CPU运行时依次读出,PRAM的大小为2K Byte。
DRAM用于存储接口引擎运行需要和产生的数据,大小为2K Byte,前512字节可由配置NC写入,接口引擎可以操作整个2K字节空间。
PRAM和DRAM支持单独配置为单模/三模控制状态(寄存器地址0x200ebit1),三模控制下,芯片对3个配置NC发起的PRAM/DRAM写入数据进行三取二表决,根据表决结果写入。
1.2.2 指令集
可编程时序接口指令集共有9种指令类型,包含输出移位寄存器、输入移位寄存器、DRAM数据读取、计数器等功能,支持IF、LOOP等语句的调用和嵌套,可实现绝大部分的接口时序,详见附表四:可编程时序接口指令集。
接口引擎的运行时钟为芯片的系统时钟,4个的可编程时序接口分别为porta、portb、portc、portd,接口引擎的基础资源包含一个计数器、5个工作寄存器reg0~5、发送移位寄存器tx_shift_reg、接收移位寄存器rx_shift_reg,这些变量的值均可配置。接口引擎按照PRAM中的指令集逐行执行,单条指令由16bit组成,格式见。
表3 单条指令集格式
1.2.3 操作流程
图2 可编程时序接口典型操作流程
可编程时序接口操作流程如下:
1)控制源按照远程配置指令格式,将预先编辑好的指令集写入PRAM(地址0x8000~0x87ff);
2) 控 制 源 将 接 口 运 行 需 要 的 数 据 写 入 数 据 存 储 区DRAM( 地 址0x8800~0x89ff);
3)如果需要从可编程时序接口采集数据,控制源对芯片可编程时序接口信号的滤波参数进行配置(地址0x4802);
4)控制源对芯片发送触发控制指令(地址0x4801),指令集开始运行;
5)查询接口引擎运行状态(地址0x4040 bit0),等待接口引擎空闲;
6)配置NC读取DRAM中存储的数据。
1.2.4 ADS8509指令配置示例
ADS8509为一款常见的AD采样芯片,通过可编程时序接口,芯片可产生特定的接口时序与ADS8509进行通信。
图3 ADS8509控制时序
ADS8509的主要接口信号有R/C、BUSY、DATACLK、DATA,其中R/C、DATACLK为ADS8509的输入信号,BUSY、DATA为ADS8509的输出信号。
本例中使用可编程时序接口与ADS8509进行通信,porta与R/C连接、portb与DATACLK连接、portc与DATA连接,不使用BUSY信号,芯片运行的系统时钟为25MHz,时钟周期32ns。
控制源对芯片可编程时序接口PRAM中配置的指令见下表,可实现芯片控制ADS8509进行一次AD采样,并读取采样数据存入DRAM地址为0x10的空间。
表4 ADS8509配置示例
注:R/C端口实际低电平时间比设置的计时器数值0xa×32ns要大,因为指令集运行本身需要消耗一定的时间。
按照以上指令集运行产生的接口时序见图 6。其中t0为480ns,tw1为704ns,t2为1184ns,时钟周期为2240ns。采样点在时钟拉为高电平后448ns。
图4 ADS8509实际工作时序
1.2.5 时序计算方法
可编程时序接口的接口引擎工作时钟为系统时钟,即传输线速率的1/20。可编程时序接口收到触发控制指令后,延迟16个时钟周期开始工作。可编程时序接口每条指令的执行时间为5个时钟周期,每次数据变化延时一个时钟周期,特殊的计数器控制指令在指令执行完成后的(计数器设定值+2)个时钟周期后超时。
表5指令集执行周期
以如下 6 个示例介绍可编程时序接口的周期控制:
1)IO 输出示例;
2)带有计数器控制的示例;
3)带有 IF 指令的示例;
4)带有 LOOP 指令的示例;
5)带有 LOOP QUIT 指令的示例;
6)移位寄存器映射至输出端口的示例。
(1)常规示例:
指令集:
表6 常规示例
解释:
a.porta端口在指令执行后的16(15+1)个周期后输出1;
b.porta端口在指令执行后的21(20+1)个周期后输出0;
c.porta端口的高电平时间为5个时钟周期。
(2)带有计数器控制的示例
指令集:
表7 带有计数器控制的示例
解释:
a.porta端口在指令执行后的16(15+1)个周期后输出1;
b.porta端口在指令执行后的36(25+10+1)个周期后输出0;
c.该指令集累计周期数为40个时钟周期,其中等待超时指令的执行时间包含在超时时间内,超时时间的周期数为计数器设定值+2,即8+2=10。
(3)带有IF指令的示例
指令集:
表8 带有IF指令的示例
解释:
a.IF指令无论条件是否成立均被执行,即序号1-8均占用cpu执行时间且为串行执行;
b.上述指令集中reg[1]等于3,序号4指令生效,序号6指令无效,即最终reg[1]=4。
(4)带有LOOP指令的示例
指令集:
表9 带有LOOP指令的示例
解释:
a.当执行到loop end语句后跳转到loop begin的下一句执行;
b.porta分别在第16、31、46、...个周期变为高电平;
c.由于无退出循环条件,故序号6指令无法执行。
(5)带有LOOP QUIT指令的示例
指令集:
表10 带有LOOP QUIT指令的示例
解释:
a.当loop quit语句执行后不会直接跳转到loop end的下一条指令,而是顺序执行指令,但指令不生效。以上述指令集为例,执行完毕后reg[1]等于1而非0。
(6)移位寄存器映射至输出端口的示例
指令集:
表11 移位寄存器映射至输出端口的示例
解释:
a.tx_shift_reg在第21个周期变为0xFFFF;
b.porta在第22个周期输出1。