徐中龙,华竹平,李 佳,王玮冰
(1.中国科学院微电子研究所,北京100029;2.江苏物联网研究发展中心智能传感器工程中心,江苏无锡214135;3.无锡(太湖)国际科技园管理委员会,江苏无锡214135)
随着物联网的兴起,传感器之间的通信起到了关键的作用。针对特定的物联网应用,合理的选择传感器通信协议,有利于改善传感器系统的设计。传感器系统中一般对传感器数据传输速率要求不高,传感器中广泛使用的是同步串行数据接口:I2C总线接口和SPI总线接口。
I2C总线协议是PHILIPS公司于1987年开发的双向两线制同步串行总线协议。由于它具有连线少、允许多主机控制、具有总线仲裁和同步等特点,被广泛应用到各个领域,并已经成为一种世界性的工业标准[1]。I2C总线上数据的传输速率在标准模式下可达100 kbit/s,在快速模式下可达 400 kbit/s,在高速模式下可达 3.4 Mbit/s[2]。
SPI总线协议是Motorola公司开发的高速、同步串行总线协议,一般需要3~4根总线完成数据传输,SPI接口的传输速度可以达到5 Mbit/s。SPI接口技术是一种高速高效率的串行接口技术,主要用于扩展外设和进行数据交换[3]。
目前广泛使用的从机同步串行接口电路大多不具有兼容I2C总线和SPI总线数据传输的功能。有些从机同时具有I2C总线接口电路和SPI总线接口电路,但两种接口电路不仅浪费了内部逻辑资源,而且占用较多的信号接口。
本文通过分析I2C总线协议和SPI总线协议的特点,提出并设计了一种兼容I2C总线和SPI总线的通用从机同步串行接口电路,首先将该接口电路进行模块划分,然后对划分后的模块利用Verilog-HDL进行编码并通过Modelsim进行功能仿真,最终在Quartus II中下载到FPGA中进行验证,为传感器中的接口电路设计提供参考。
以一款目标物体温度探测传感器为例,本文设计并实现了一种通用从机同步串行接口电路。为了满足数据精度的需要,此传感器中内部寄存器数据为16 bit。此传感器中有5个寄存器,分别为物体电压寄存器、本地温度寄存器、配置寄存器、制造商ID寄存器、器件ID寄存器,其中物体电压寄存器、本地温度寄存器、制造商ID寄存器、器件ID寄存器为只读寄存器,配置寄存器的高八位为可读写部分,低八位为只读部分。
通用从机同步串行接口电路引脚如图1所示。其中CS为从机片选信号,A1、A0为从机地址选择端口,SCL为串行时钟线,SDA为串行数据线。
图1 通用从机同步串行接口电路引脚
1.1.1 接口电路用于I2C总线数据传输时的设计要求
发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,但是每个字节后必须跟一个应答位[4]。主机发送起始条件后,首先发送一个7位从机地址(用于选中当前要使用的从器件),紧接着发送1位的数据传输方向位(R/W)以指示是从从器件读取数据还是把数据写入从器件,数据传输由主机产生的停止条件结束[5]。当读写位即数据传输方向位(R/W)为1时,主机从传感器读取数据;当读写位即数据传输方向位(R/W)为0时,主机向传感器写入数据。
其中A1、A0与I2C总线从机地址的对应关系如表1所示。
表1 A1、A0与I2 C总线从机地址的对应关系
为了满足主机同传感器内部多个寄存器之间进行数据传输,主机对传感器进行写数据操作之前,必须首先向地址指针寄存器写入地址,指定写操作对应的寄存器,然后再向地址对应的寄存器写入数据;而主机对传感器进行读数据操作时,不向地址指针寄存器写入地址,直接读取地址指针寄存器相对应的寄存器数据。地址指针与传感器内部寄存器的对应关系如表2所示。接口电路将接收的8位地址指针数据存入地址指针寄存器,对传感器内部寄存器进行寻址。
表2 利用I2 C总线进行数据传输的地址指针与寄存器的对应关系
1.1.2 接口电路用于SPI总线数据传输时的设计要求
本次设计中采用的时钟极性CPOL和时钟相位CPHA[6]都为 1。
主机通过SPI总线接口与传感器内多个寄存器进行通信时,主机利用不同的读写指令来识别传感器内部不同寄存器。传感器先向主机发送地址寄存器对应的寄存器数据,紧接着传感器接收主机发送的读写指令,如果为读指令,传感器则将对应的寄存器数据发送给主机;如果为写指令,传感器则将接收的数据存入相应的寄存器。
利用SPI总线对该传感器内部寄存器进行读操作时,接口电路将读指令的低8位存入到相应的地址寄存器,然后再读取对应寄存器数据;利用SPI总线对该传感器内部寄存器进行写操作时,由于该传感器中只有配置寄存器可以写,因此将写状态字的中间8位数据存入到配置寄存器。读指令与内部寄存器的对应关系如表3所示,写指令与寄存器的对应关系如表4所示。
表3 利用SPI总线进行数据传输时读指令与寄存器的对应关系
表4 利用SPI总线进行数据传输时写指令与寄存器的对应关系
根据上述通用从机接口电路的设计要求,本设计中对该传感器接口电路划分为3个模块:起始和停止检测模块、并串和串并转化模块、控制模块。该接口电路的结构框图如图2所示。
图2 通用从机同步串行接口电路结构框图
起始和停止检测模块:I2C总线或SPI总线数据传输起始位和停止位检测。
并串和串并转换模块:利用此模块接收主机发送的串行数据和向主机发送串行数据。
控制模块:在起始和停止位的控制下向主机发送应答位和对并串和串并转换模块的并串和串并转换控制。
根据接收和发送数据时序分析,利用SCL上升沿接收主机发送的数据,利用SCL下降沿向主机发送数据。
起始和停止模块设计:在CS为1且SCL为1的情况下,SDA的下降沿为从机接口电路利用I2C总线数据传输的起始位,SDA的上升沿为从机接口电路利用I2C总线数据传输停止位;在CS为0的情况下,从机接口电路利用SPI总线进行数据传输。
并串和串并转换模块设计:利用SCL时钟的上升沿读入主机串行数据并转化为并行数据存入传感器内部相应的寄存器;利用SCL时钟的下降沿将传感器内部寄存器数据串行输出。
控制模块设计:该通用传感器同步串行接口电路利用I2C总线进行数据传输时,每次只能传输一个字节和接收或发送一位应答位;利用SPI总线进行数据传输时,每次可以传输16 bit数据。因此,控制模块可以利用计数器来实现。
由于本文传感器内部的寄存器为16 bit,因此该接口电路用于I2C总线数据传送需要分为高低字节分别进行传送。传感器接口电路用于I2C总线数据传输支持的数据格式如下:
a起始位+8 bit从机地址和读标志位+8 bit高字节数据+8 bit低字节数据+停止位
b起始位+8 bit从机地址和写标志位+8 bit地址指针+停止位
c起始位+8 bit从机地址和写标志位+8 bit地址指针+8 bit高字节数据+停止位
该接口电路用于SPI总线数据传输支持的数据格式如下:
a 16 bit读数据
b 16 bit读数据+16 bit写指令
c 16 bit读数据+16 bit读指令
d 16 bit读数据+16 bit读指令+16 bit读数据
该接口电路控制模块电路的状态机如图3所示。
图4所示为该接口电路用于I2C总线数据传输时格式a的功能仿真结果,图5所示为该接口电路用于I2C总线数据传输时格式c的功能仿真结果。
图3 通用从机同步串行接口电路控制模块状态机
图4 I2 C总线数据传输格式a的仿真结果(截图去彩)
图5 I2 C总线数据传输格式c的仿真结果(截图去彩)
图4、图5中所示的信号从上向下为片选信号CS,从机地址选择信号A1、A0,串行时钟信号SCL,串行数据信号SDA,地址指针寄存器PntrReg,配置寄存器Confg。从图4中可以看出,CS为1且A1和A0都为0时,主机向传感器发送起始位之后,紧接着发送的是7位从机地址7’b100_0000和读标志位1’b1,对传感器执行读操作;下一个SCL时钟下降沿传感器向主机发送低电平应答位;接下来传感器在SCL下降沿传感器向主机发送地址指针寄存器PntrReg数据8’b0000_0010对应的配置寄存器Confg 16 bit数据16’b1100_1010_0111_0011。从图5中可以看出,CS为0且A1和A0都为0时,主机向传感器发送起始位之后,紧接着发送的是7位从机地址7’b1000000和写标志位1’b0,对传感器执行写操作;;下一个SCL时钟下降沿传感器向主机发送低电平应答位;接下来主机向传感器寄存器地址指针寄存器写入数据8’b0000_0010;传感器发送应答位之后,主机向该地址指针对应的配置寄存器的高8位写一个字节数据8’b1100_1010。
以上结果说明,该接口电路利用该I2C总线进行数据传输时,可以正确实现数据格式a和数据格式c。由于I2C总线数据传输中数据格式b可以被包含在数据格式c中,因此可以利用该接口电路实现本文中的I2C总线数据传输。
图6所示为该接口电路用于SPI总线数据传输时格式b的功能仿真结果,图7所示为该接口电路用于SPI总线数据传输时格式d的功能仿真结果。
图6 SPI总线数据传输格式b的仿真结果(截图去彩)
图7 SPI总线数据传输格式d的仿真结果(截图去彩)
图6中所示的信号从上向下为片选信号CS,串行时钟信号SCL,串行数据信号SDA,电压寄存器Vobj,配置寄存器Confg。从上图中可以看出,传感器先向主机发送默认地址8’b0000_0000对应的电压寄存器Vobj16位数据16’b1000_1010_0010_0101,然后将接收16位写配置寄存器指令16’b0000_1011_0101_0000,最后可以看出将8 bit数据8’b1011_0101存到配置寄存器的高八位中。图7中所示的信号从上向下为片选信号CS,串行时钟信号SCL,串行数据信号SDA,电压寄存器Vobj,本地温度寄存器Tamb。从图7中可以看出传感器内部电压寄存器Vobj数据为16’b1000_1010_0010_0101,本地温度寄存器Tamb数据为16’b1000_0000_0000_1000。传感器先通过SPI总线接口向主机发送Vobj寄存器数据16’b1000_1010_0010_0101,然后接收16位读Tamb数据指令16’b1000_0000_0000_1000,然后传感器将16位Tamb数据16’b 1000_0000_0000_1000发送出去。
以上结果说明,该接口电路用于SPI总线数据传输时,可以正确实现SPI总线数据格式b和数据格式d。由于SPI总线数据传输中数据格式a和c可以被包含在数据格式d中,因此可以利用该接口电路实现本文所述的SPI总线数据传输。
本设计选用ALTERA公司的EP4CE15F17C8N器件。整个设计采用Verilog-HDL编码,利用Quartus II软件编译后,将生成的pof文件通过AS口下载到FPGA中。通过单片机模拟I2C总线数据传输时的数据格式a、b、c 和 SPI总线数据传输时的数据格式 a、b、c、d,可以成功实现单片机通过I2C总线和SPI总线与FPGA同步串行通信。
本文根据I2C总线协议和SPI总线协议的要求,设计了一种兼容I2C和SPI总线通用从机同步串行接口电路。首先将其进行模块划分,然后对各个模块分别设计与实现,最后对电路进行仿真、验证。与I2C总线接口电路、SPI总线接口电路相比,既可实现高速率数据传输,又可组成多主机、多从机的传感器网络。通用从机同步串行接口电路可通过I2C总线或SPI总线进行数据传输的灵活性的特点,在传感器中具有应用价值。
[1]陈穗光,葛建华.I2C总线接口协议设计及FPGA的实现[J].山西电子技术,2006(6):20-38.
[2]沈华,王俞心.基于FPGA的I2C总线主控器的设计与实现[J].航空计算技术,2007(6):109-111.
[3]易志明,林凌,郝丽宏,等.SPI串行总线接口及其实现[J].自动化与仪器仪表,2002(6):47-50.
[4]赵辉,董德存.I2C总线技术及其应用实例[J].微型电脑应用,2005(4):61-63.
[5]胡文静,李外云,刘锦高.I2C总线接口的FPGA实现研究[J].计算机工程与应用,2005(12):116-118.
[6]王珏文,金伟信,蔡兵,等.基于FPGA的SPI总线接口的实现[J].现代电子技术,2010(14):102-104.