由于MCU (微控制器)在可靠性、体积、功耗、性价比等方面都具有明显的优势,所以由其组成的上下位机形式的仪器(下位机部分),已经在许多工业控制和数据采集系统中得到广泛应用。在实际应用中,如果一片MCU芯片的功能不能满足实际需求时,就需要进行扩展。在本文中,我们使用两片C8051F020微控制器通过SMBus(System Management Bus)系统管理总线进行扩展,使其满足了15路模拟量输入(AD)、6数字量输入、2路开关量输出以及1路PWM波输出的设计要求。
1 系统硬件构成
整个系统的装置示意图如图1所示。我们选择美国Silicon公司的微控制器(MCU)C8051F020(简称F020)作为应用系统的CPU。C8051F020是一种混合信号SOC型8位单片机,它有一个8通道的、转换速率为100Kbps的12位ADC,以及一个8通道的、转换速率为500Kbps的8位ADC;2个l2位DAC;64KB FlashRom,4KB RAM;有22个中断源和5个定时器/计数器; 内部有两个增强型全双工UART、SPI总线和SMBus总线。
CP2101是美国Silicon公司推出的USB-UART桥接电路。该电路的集成度高,内置USB2.0全速功能控制器、USB收发器、晶体振荡器、EEPROM及异步串行数据总线(UART),支持调制解调器全功能信号,全部功能集成在一个5mm×5mm IC中。在PC机上安装CP2101的驱动程序以后,CP2101就作为PC机的一个虚拟COM 口(VCP),对它的操作与对PC机的COM口操作完全一样,因此无需修改现有的COM 口应用就可以实现通过USB向基于CP2101的器件传输数据,保证了对已有的串口通讯程序的兼容。其数据传输的波特率范围为300b/s~921.6kb/s。
2 SMBus总线
SMBus总线标准最早由Intel公司于1995年发布,它以Philips公司的I2C总线为基础,面向于“不同系统组成芯片与系统其他部分间的通讯”。SMBus接口的工作电压可以在(3.0~5.0)V之间,总线上不同器件的工作电压可以不同。SCL串行时钟线和SDA串行数据线是双向的,因此两条线上都需要上拉电阻或类似电路将它们连到电源电压,在没有数据传输时,两条线都处于高电平。典型的SMBus配置如图2所示。SMBus采用多种线路条件作为器件的握手信号。在一次数据传输过程中,SDA只能在SCL为低电平时改变。在SCL为高电平时,SDA发生改变则开始和停止信号。
SMBus协议有两种可能的数据传输类型:从主发送器到所寻址的从接收器(写)和从被寻址的从发送器到主接收器(读)。这两种数据传输都由主器件启动,主器件还提供串行时钟。一次典型的SMBus数据传输包括一个起始条件(START)、一个地址字节(位7~1:7位从地址;位0:R/W 方向位)、一个或多个字节的数据和一个停止条件(STOP)。每个接收的字节(由一个主器件或从器件)都必须用SCL高电平期间的SDA低电平来确认(ACK)。如果接收器件不确认,则发送器件将读到一个“非确认”(NACK),这用SCL高电平期间的SDA高电平表示。
所有的数据传输都由主器件启动,可以寻址一个或多个目标从器件。主器件产生一个起始条件,然后发送地址和方向位。在数据传输结束时,主器件产生一个停止条件,结束数据交换并释放总线。图3示出了一次典型的SMBus数据传输过程。
3 系统通信的设计
系统的任务主要对模拟量进行AD转换,对数字量进行计数,并将这些数据最终要传给上位微机进行显示与数据处理,上位机根据其处理结果控制PWM波的频率及占空比。
3.1 上下位机的数据通信
由于我们使用了USB-UART桥接电路CP2101,因而上下位机的程序仍是按照UART形式编写。为保证双方传输的数据准确可靠,程序中使用软件握手:上位机首先给下位机传波特率参数,其值为600H,300H,180H,C0H,60H,0CH之一,下位机对收到波特率参数进行验证,如果为其中之一,则发送字节AAH给上位机,并更新下位机波特率,反之认为是噪声干扰,丢弃此数据,再重新等待接收。上位机收到AAH字节后,就更新新的波特率,然后向下位机发送控制命令子,如采样通道选择,单端方式还是差分方式,开关量的状态,采样周期和采样时间等,以及是否要求从下位机工作,如果要求从下位机工作,还要正确建立主从下位机的通信,之后再向上位机发应答字节55H。协议还采用超时重发功能,可自动连接5次。
3.2 主从下位机的SMBus通信
为使SMBus通信程序便于编写,我们规定第1片为主片,第二片为从片。SMBus的工作由下列寄存器中的内容决定: 状态寄存器(SMBOSTA)、控制寄存器(SMBOCN)、地址寄存器(SMBOADR)和数据寄存器(SMBODAT)。要通过SMBus通讯协议实现两片芯片之间的数据通信,关键在于如何利用单片机中的状态寄存器中的状态码,通过软件编程来实现对状态码的查询。每一个状态码都对应一个当前的通信状态和将要执行的操作,因此,根据所得到的状态码来确定当前的通信状态,以实现相互间的通信。
在编程时,SMBus通信协议是利用中断查询状态码的方式实现的,为使双方的通信可靠,也规定了软件握手:初始化后,从片等待主片的命令字节33H,从片收到33H后给主片发CCH应答字节,主片收到CCH字节后,根据上位机要求给从片发送相应的命令字节(采样周期,采样时间,采样通道,开关量状态等),然后发送BBH字节个主片,并启动相应AD转换,主片收到BB后才进行AD转换,保证主片与从片对模拟量的同步采样。
4 系统软件设计
考虑到系统灵活性,我们编程使得通道选择、采样时间、采样周期、数字量输入、开关量的控制、PWM波的频率及占空比、从下位机的工作情况等由用户在上位机上指定,然后以命令字传给下位机,具体为:用4个字节分别表示两片MCU的AD通道是否被选中,每个字节位上为l表示该通道被选中,否则不选该通道。用3个字节存放采样周期,其最小单位为10微妙,5个字节存放采样时间,一个字节用于开关量,2个字节用于存放PWM波的频率,2个字节用于存放占空比值,1个字节用于表示数字量输入是否被选中。对于输入的数字量,输入是涡轮流量计来的脉冲,输入脉冲数的确定是采样引脚电平变化的方法来确定的。为保证小流量时的精度,按4秒钟所计脉冲数,通过其转换关系来确定流量。其中引脚电平采样的时间设为100微妙。为减轻下位机的任务,其采集的原始数据直接送给上位机进行处理,保证下位机有高的采样速率和高的传输速率。图4给出了下位机主片的工作流程图。
5 结束语
我们使用了自身带有AD转换电路及SMBus通信总线接口C8051F020微控制器,实现了两片MCU之间数据的高速可靠的数据通信。而且还使用了USB-UART桥接电路,保证了下位机与上位机有高的数据传输率。并且,在上位机软件设计时考虑到应用系统的通用性,可根据实际需求选用不同的传感器,并在上位机上进行相应的选择,就能得到所需的测量数据及曲线,使得该应用系统有较强的通用性。