一种兼容SMBus协议的I2C总线控制器的设计
2018-09-27王芬芬冯海英
王芬芬,冯海英,丁 柯
(中科芯集成电路股份有限公司,江苏无锡 214072)
1 引言
I2C总线[1]是Philips公司开发的一种简单、双向二线制同步串行总线[1]。通过串行时钟线SCL和串行数据线SDA即可在连接于总线上的器件之间传送信息,因而广泛应用于微控制器、EEPROM、A/D转换器及电子通信领域[2]。
SMBus 2.0协议是在I2C协议基础上研发出来的系统管理总线协议[3],它基于I2C操作原理,继承了I2C总线的特点和优点,起初是为智能电池、充电电池和与其他系统通信的微控制器之间的通信链路而定义的,后来也被用来连接各种设备,包括电源相关设备、系统传感器、EEPROM通信设备等,目前已成为在智能电池及低速率管理设备上被广泛采用的协议标准[4]。
实现I2C总线协议时主要有两种方法:第一种是利用SOC芯片的两个引脚去模拟SDA和SCL,并利用软件模拟控制器的接口功能,这种方法通用可行但移植性差,占用资源多,软件规模大,不易于维护;第二种方法是利用I2C总线控制器IP,在SOC芯片中嵌入I2C总线接口,利用硬件设计I2C总线控制器,然后集成到SOC系统中,这种方法移植性好,但要求I2C总线控制器功能完善且占用较低的硬件资源。
王炳文等[5]基于可编程逻辑设计了一种I2C总线主机控制器,通过FPGA状态机的组合扩展出I2C总线,相比完全用软件模拟I2C时序的方法减小了软件的工作量,但扩展出的I2C总线仅支持部分传输方式。张文梅等[6]设计了一种功能可扩展的I2C控制器,但该控制器只能作为从机控制器,且只能进行写操作,不可进行读操作。宋杰等[7]的设计中采用了异步先进先出来同步APB总线和I2C总线之间的数据交换,且设计满足通信的100 kHz和400 kHz两种数据传输速率要求,但不支持从机的10位地址模式,也不支持主机的时钟同步和总线仲裁功能。胡春媚等[8]设计了一种I2C主从控制器,实现了I2C总线协议规范的基本功能。陈涛[9]设计了一种SMBus接口的控制器用于智能电池系统,实现了SMBus总线协议规范的基本功能。在芯片管脚资源受限的系统中,单独设计一种既能覆盖I2C总线也能覆盖SMBus总线的控制器具有重要的意义。
本文设计了一种兼容SMBus 2.0协议的I2C总线控制器,既保证各自的功能和协议规范,又极大地节省了硬件资源。该控制器连接串行I2C/SMBus总线,可配置为主机或从机模式,且有多主机功能;而且该控制器由状态机控制,同时满足I2C/SMBus的通信模式和通信时序。此外,本文基于APB总线设计,采用Verilog HDL语言实现,使得该控制器很容易集成到基于AMBA总线的SOC系统,从而得到更广泛的应用。
本文首先简要介绍了I2C总线的基本原理,分析了I2C总线和SMBus总线的相同点和不同点;然后对整个I2C总线控制器进行了层次分明的模块化设计,并深入阐述了各个模块的功能及I2C和SMBus兼容性的实现;最后,通过仿真验证了该I2C总线控制器的兼容性。
2 I2C总线与SMBUS总线比较
I2C串行总线包含2根信号线:串行数据线SDA和串行时钟线SCL,这2根线都是双向的,并通过一个电流源或上拉电阻连接到正的电源电压[1]。当总线空闲时,这两根线均处于高电平状态。此外,连接到总线的器件输出级必须是漏极开路或集电极开路,这样就可将多个I2C设备的串行数据线SDA和串行时钟线SCL分别进行线与的功能,同时连接到一个通信网络中。该总线结构图如图1所示。每个连接到I2C总线的设备都有一个唯一的设备地址,而且都可作为一个主机或从机用于发送或接收数据。
图1 I2C总线结构图
在I2C总线上,执行数据传输时主机和从机的关系不是恒定的。主机用于启动总线传输数据,产生START起始条件和STOP结束条件,发送设备地址并产生时钟信号,此时任何被寻址的器件均被认为是从机。而此时数据传送的方向决定了I2C器件是发送器还是接收器,I2C总线的数据传输时序如图2所示。
图2 I2C总线协议
SMBus系统管理总线也是一种同步串行总线,包括数据线 SMBDAT(本文记做 SDA)、时钟线SMBCLK(本文记做SCL),还有一个可选信号为SMBALERT。它基于I2C总线协议规范,与I2C的数据有效性是一致的,数据传输格式也相同;但二者之间存在很多差异,在规范[10]中的多个协议层都有详细说明,本文从二者设计兼容的角度将必须考虑和实现的差异总结为3个方面:
(1)SMBus与I2C在时序方面有较多差异,见表1,要做到I2C与SMBus设计兼容,必须正确地把二者的时序可靠地组合起来使用,使得二者都要满足各自的协议规范。
表1 SMBus与I2C时序的不同点
(2)SMBus为了提高数据传输的可靠性,增加数据包错误校验(Packet Error Checking,PEC)功能,主要用来检测或校验数据传输中出现的错误,I2C未作类似说明。
(3)SMBus设备地址类型可划分为很多种,如保留地址、目的性分配地址、动态分配地址等。这些地址的划分运用于不同协议层的特定场合或特定目的。
3 I2C总线控制器设计
本文设计的片上I2C总线控制器基于APB总线设计,且兼容SMBus总线协议。APB总线是由ARM公司开发的一种简单SOC总线,它由一个APB Bridge和多个APB Slave组成,主要用来连接一些低速外围设备,因此该I2C总线控制器兼容性强,可以方便地集成到任何基于APB总线的SOC系统。
3.1 设计框架
该I2C总线控制器支持主机或从机模式,能够控制所有I2C和SMBus总线特定的时序、协议、仲裁,支持7位和10位地址模式,支持通信速率标准模式高达100 kHz和快速模式高达400 kHz,同时满足SMBus的超时检测功能和PEC检测功能。
I2C总线控制器设计结构图如图3所示,包括4个子模块:APB总线接口模块、SDA控制单元、SCL控制单元和状态机控制单元。
图3 I2C总线控制器结构图
3.2 APB总线接口设计
APB总线接口模块是整个I2C总线控制器接口的控制部分,使I2C总线控制器的硬件行为与APB总线协调一致,负责实现与片上APB总线的互联及数据交换,所以设计了基于APB总线的接口寄存器,该寄存器的功能描述见表2。MCU可通过APB总线对I2C总线控制器的寄存器进行配置、数据读写和中断处理等操作,从而控制I2C总线控制器的工作模式及工作流程,实现I2C总线的数据通信。
表2 寄存器描述
3.3 SCL控制单元设计
SCL控制单元是对I2C总线控制器SCL总线的控制,主要作用是通过主机时钟产生、从机时钟拉伸和SMBus超时检测子模块结合时钟控制逻辑,产生SCL总线的时序,使其既满足I2C的SCL总线时序,又满足SMBus的SCL总线时序。
3.3.1 主机时钟产生
当该控制器配置为I2C主机,配置CCR的通信模式,确定为I2C的标准模式、快速模式或SMBus模式;配置CCR的时钟分频系数,产生特定的SCL时钟频率;其中I2C的标准模式和SMBus模式的SCL占空比采用1∶1,CCR的时钟分频系数配置见公式(1),I2C快速模式的SCL占空比采用2∶1,CCR的时钟分频系数配置见公式(2),式中fPCLK表示主时钟PCLK的时钟频率,fSCL表示I2C/SMBus的总线通信速度;在时钟分频时必须实施时钟同步机制,以支持多主机环境和从机时钟拉伸。为了时钟同步,从SCL下降沿开始计数时钟低电平的个数,一旦计数到CCR的时钟分频系数,就释放SCL到高电平;从SCL上升沿开始计数时钟高电平的个数,一旦计数到CCR的时钟分频系数,就将SCL拉低到低电平。
为保证兼容性,还必须同时保证I2C时序和SMBus时序的正确性,为了满足数据保持时间和建立时间以及时钟上升时间和下降时间,从SCL下降沿开始计数数据保持时间的个数,然后再计数数据建立时间的个数。考虑到硬件设计简单化且减少硬件面积,设计时充分结合I2C和SMBus两者时序的共同点和差异,将数据建立时间和保持时间根据主时钟进行了分类和归纳,见表3,对比I2C规范协议中的时序参数说明及SMBus 2.0规范协议中的时序参数说明,表3的时序设计可同时满足I2C和SMBus的时序要求。
表3 I2C/SMBus时序参数
3.3.2 时钟拉伸
在总线传输期间,主机或从机可以选择在字节传输之间拉伸时钟低电平周期,用以处理已接收的数据或准备发送的数据或执行实时任务,在这种情况下,I2C和SMBus总线控制器就需要支持时钟拉伸功能。
3.3.3 SMBus超时检测
主机或从机根据需要可以实时拉伸时钟总线,但SMBus 2.0总线规范对在总线传输期间的时钟拉伸的累积值有严格限制,而I2C没有这个限制。当配置为SMBus设备时,设计了3种超时检测:第一种,时钟低电平超时检测,不论是主机或从机,一旦检测到SCL下降沿就开始计数,35 ms内出现SCL上升沿,则计数器清零;一旦超过设置的超时阈值,见公式(3),那么所有的控制寄存器和状态寄存器及状态机都进行复位操作,同时主机在SCL和SDA总线上产生STOP条件,从机释放SCL和SDA总线为高电平;第二种,对从机的时钟低电平扩展累计时间tLOW:SEXT进行检测,在25 ms内总线从START开始的一次传输期间,一旦检测到从机在字节传输之间或一个字节传输完毕后拉伸时钟低电平,就开始计数,该计数器一直累计,一旦超过设置的超时阈值,见公式(4),或检测到STOP条件,则计数器清零,同时所有的控制寄存器和状态寄存器及状态机都进行复位操作,且释放SCL和SDA总线为高电平;第三种,对主机的时钟低电平扩展累计时间tLOW:MEXT进行检测,在10 ms内总线从START到ACK阶段、ACK阶段到下一个ACK阶段、ACK阶段到STOP的传输期间,一旦检测到主机在这3个阶段有字节传输之间或一个字节传输完毕后拉伸时钟低电平,就开始计数,该计数器一直累计,直到下一个阶段计数器清零,重新开始计数,一旦超过设置的超时阈值,见公式(5),则计数器清零,同时所有的控制寄存器和状态寄存器及状态机都进行复位操作,且在SCL和SDA总线上产生STOP条件。
3.4 SDA控制单元设计
SDA控制单元控制I2C总线控制器的SDA总线。SDA控制单元设计时兼容了SMBus的设备地址分配识别和SMBus的PEC校验功能。
3.4.1 SMBus的设备地址
SMBus设备地址类型可划分为很多种,如保留地址、目的性分配地址、动态分配地址等。这些地址的划分运用于不同协议层的特定场合或特定目的,详细说明参见SMBus协议规范及相关文献。当配置为SMBus设备时,在地址阶段通过地址匹配比较,识别SMBus的设备缺省地址0x1100001x;当配置为SMBus主机时,在地址阶段通过地址匹配比较,识别SMBus的Host地址 0x0001100x。
3.4.2 SMBus PEC的产生和校验
SMBus协议规范引进了数据包错误检测PEC机制来提高数据传输的可靠性,这个计算使用CRC-8多项式C(x)=x8+x2+x+1,对每一位串行数据进行计算得到。PEC是一个计算所有信息字节(包括地址以及读写位和数据字节)之后得到的CRC-8错误校验字节,该字节作为最后一个信息字节。
当配置为SMBus发送设备,将地址字节以及读写位和数据字节的每一位进行串行CRC计算得到PEC字节,然后发送该字节;在PEC字节后接收到ACK响应表示这次写数据在从器件接收端被成功执行,否则收到NACK响应。当配置为SMBus接收设备,将地址字节以及读写位和数据字节的每一位进行串行CRC计算得到PEC字节,然后将接收的最后一个字节与该PEC字节进行比较,如果匹配则发送ACK响应,否则发送NACK响应。
3.5 状态机控制单元设计
由于该控制器可以作为主机也可以作为从机,可作为发送器也可作为接收器,可作为I2C设备也可作为SMBus设备,为了兼容工作模式的多样性设计了状态机控制单元,该单元是I2C总线控制器的核心控制部分,主要负责实现I2C和SMBus的总线协议,控制I2C和SMBus工作模式选择及工作流程,产生读写时序及各状态标志。该单元由一个状态机控制实现,如图4所示,该状态机共有15个状态,具体描述见表4;状态之间的跳转及其跳转条件在表5中简要地进行了阐述。
4 仿真验证
为确保该I2C总线控制器功能和时序的正确性、通信的稳定性以及与SMBus的兼容性,将该I2C控制器与I2C外设模型或SMBus外设模型连接[11],对该控制器进行了全面的仿真,使用的仿真器为Cadence公司的NC-Verilog。
表4 状态机状态描述
图4 I2C总线控制器状态机
本文设计的I2C总线控制器支持I2C协议和SMBus协议,二者都有4种工作模式,分别为主机发送模式、主机接收模式、从机发送模式和从机接收模式;且都支持7位地址传输模式和标准模式;此外,作为I2C设备还支持10位地址传输模式和快速模式,作为SMBus设备还支持PEC传输和超时检测。针对I2C和SMBus的兼容性,同时结合不同的工作模式和时序分别仿真验证。
表5 状态机跳转条件
图5是对I2C总线控制器与I2C外设模型进行仿真,验证I2C总线控制器的快速400 kHz模式和7位地址模式。将其配置为I2C主机发送模式,主时钟为36 MHz,那么相应的I2C外设就工作在从机接收模式。从仿真图中看到,发送器DR的第一个数据是从机的7位设备地址和1位写标志,第二个和第三个数据是发送到从机的数据。此外,当DR为空且在下一个字节的ACK阶段MCU仍然没有写数据到DR,则此时SR也为空,即图中i2c_txe与i2c_btf同时为高时,SCL总线会持续保持低电平,直到MCU写数据到DR,同时SCL总线被释放为高电平,且SCL与SDA必须满足数据建立时间;仿真结果表明主机的发送数据与从机的接收数据一致。
图5 I2C快速模式、7位地址模式的仿真波形
图6 是对I2C总线控制器与I2C外设模型进行仿真,验证I2C总线控制器的标准100 kHz模式和10位地址模式。将其配置为主机接收模式,主时钟为20MHz,主机DR的第一个数据是从机的10位设备地址的Header地址和1位写标志(11110100),第二个数据是从机的10位设备地址的Address地址(10010010),所以发送的从机10位设备地址是0x292;因为配置为接收模式,重新发送START和Header,同时改变传输方向为读标志(11110101),工作流程见图4;此外,i2c_rxne标志为高时表示一个字节接收完毕,等待MCU读取数据,一旦MCU完成读DR操作,该标志就硬件自动清除。
图6 I2C标准模式、10位地址模式的仿真波形
图7 是对I2C总线控制器与SMBus外设模型进行仿真,验证SMBus的PEC功能。将其配置为SMBus工作速度10 kHz,7位地址模式,主时钟为8 MHz;仿真中主机和从机都使能了PEC功能,从地址字节以及读写位开始进行串行CRC计算,计算得到的字节就是本字节的校验结果,将其存入PECR,再接着对数据字节的每一位进行串行CRC计算,计算得到的字节就是前面所有信息字节的校验结果,将其更新到PECR,依次计算得到最后的校验结果,存入PECR,同时发送器将PECR作为最后一个字节发送到SDA总线,而接收器将最后一个字节接收存入DR,同时与接收器的PECR进行比较,从仿真结果判断二者的数据是一致的。
图7 SMBus工作速度10 kHz、7位地址模式、带PEC校验的仿真波形
图8 是对I2C总线控制器与SMBus外设模型进行仿真,验证SMBus的超时检测功能。将其配置为SMBus工作速度100 kHz,7位地址模式,主时钟为8 MHz,根据公式(5)配置 I2C_timeoutr为 0x13880;从仿真图中看到,主机在地址响应阶段,MCU没有写入数据到DR,硬件一直保持SCL低电平,发生时钟拉伸现象,当累积时钟拉伸超时计数器计数到0x13880时,主机发生时钟低电平扩展累计时间超时,那么I2C_timeout标志置高,同时硬件自动产生一个STOP条件,传输结束。
图8 SMBus工作速度100 kHz、7位地址模式、超时检测的仿真波形
本设计在功能仿真正确之后,进一步确定其可实现性和时序满足性。利用Synopsys公司的综合工具Design Compiler,在0.11 μm eFlash工艺下对本设计进行综合,得到如下性能:门数约4571,动态功耗为0.0137mW/MHz,同时对综合网表也进行了全面的验证。
5 结论
本文实现了一种片上兼容SMBus协议的I2C总线控制器的设计,该设计基于APB总线,采用模块化设计,层次分明,编写的Verilog HDL代码是可综合的,且与目前SOC系统中广泛使用的AMBA总线系统具有良好的兼容性;该控制器有多种工作模式,同时支持I2C和SMBus的通信格式和通信时序,在节省硬件资源的同时还节省了芯片管脚资源;最后,通过仿真验证了该控制器的总线通信稳定性。