基于AVR单片机的SPI接口设计与实现
打开文本图片集
摘要:利用AVR单片机和SPI接口在硬件、软件设计上的便利性,以ATmega128MCU与ADT7516、SI8902模数转换芯片之间的硬件设计和通信过程为基础,实现了电源监控电路中的参数采集和智能控制功能。测试表明SPI接口通信正常,AVR单片机控制稳定,满足对电源输出电路的实时监视和控制要求。同时给出了ATmega128芯片SPI接口的配置过程,以及模数转换芯片的配置过程、通信时序的实现方法。
关键词:串行外设接口;AVR单片机;模数转换器;数据采集;嵌入式系统
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)27-0238-03
1 引言
SPI(Serial Peripheral Interface,串行外设接口)是由Motorola公司设计的一种串行接口,具有电路简单、通信可靠、控制容易、通信速率快等优点,在嵌入式系统中应用广泛,单片机生产商包括Atmel、TI、MICROCHIP、FREESCALE等公司均提供具有SPI接口的单片机(MCU),允许MCU与各种外围接口设备以串行方式通信;同时各接口供应商提供了丰富的SPI外围接口产品,包括:LCD模块,Flash/EEPROM存储器,以及数模/模数转换器等器件。
下面以Atmel公司的ATmega128 MCU为例,利用其SPI接口对外围温控模数转换器(ADC) ADT7516、隔离模数转换器(ADC)SI8902进行参数配置和数据采集,实现对电源供电的管理,包括对各路电源电压、电流的监视,及各路电源的通断控制功能。
2 硬件电路设计
2.1 ATmega128串行外设接口(SPI)
ATmega128是Atmel公司推出的一款低功耗、高性能、多功能8位MCU,资源广泛,功能强大;结合多种监测电路,极大增强了嵌入式系统的可靠性;ATmega128提供了一个串行外设接口(SPI),它包括两条数据线:主机输出从机输入(MOSI),主机输入从机输出(MISO)和两条控制线:串行时钟线(SCK),片选控制线(SS)。
在电源供电管理电路中,ATmega128作为SPI接口的主控制设备,两种ADC芯片完全受ATmega128芯片的控制。
2.2 电路设计
电源供电管理电路实现直流电流12V、3.3V电压和电流等共16路参数检测,以及隔离28V电源电压和电流参数监测,设计中共采用了4片ADT7516、2片SI8902实现参数的模数转换。电路中,TPS24720(8片)和TPS2490配合ATmega128输出的控制信号用于对相应电源通路的通断控制,FM25H20用于存储电路的状态信息。
ATmeg128在任意时刻仅能与一个从设备进行通信,对于多个SPI从设备,采用三八译码器74LVC138实现多个从设备的片选使能,电源供电管理电路原理如图1示。
通过配置ATmega128三个GPIO管脚(PE4,PE5,PE6),作为74LVC138的A0、A1和A2输入端,三八译码器的输出连接于各个从设备的SS端,ATmega128 SPI接口的SS线连接于74LVC138的EN管脚用于使能该器件,对应关系如表1所示
3软件实现
软件设计包括ATmega128及从设备的初始化,以及参数采集和数据处理。
在ATmega128完成了初始化配置后,通过控制SPI接口向ADC发送控制字,完成相应ADC的初始化配置,从而控制ADC对模拟信号进行转换,转换结束后,将转换结果通过SPI接口回读到MCU。MCU对不同路电压、电流值按照预设的范围进行判断,并给出电源通路的通断控制命令。
3.1 ATmega128 SPI接口配置
ATmega128中与SPI接口有关的寄存器有控制寄存器(SPCR)、状态寄存器(SPSR)和数据寄存器(SPDR),这三个寄存器都为8位寄存器,通过对各寄存相应比特位的配置,可以实现对SPI接口的控制。软件设计中采用查询标志位的方式完成SPI通信的编程,使用的软件为AVR Studio4.18,编译环境为WinAVR 20100110,ATmega128初始化如下所示。
//MOSI、SCK、SS对应管脚初始化为输出,默认的MISO为输入
DDRB "= (1< //SS初始化位高电平 PORTB |=(1< //SPI使能,主控方式,Mode 3工作方式,其他配置为默认 SPCR |= (1< ATmega128初始化SPI接口时应该注意以下几点: a.正确配置ATmega128 SPI接口的工作模式,由ADT7516和SI8902的芯片手册可知,两种芯片都可以工作于Mode 3模式,FM25H20同样适用; b.当使能了SPI接口后,ATmega128并没有自动强制转换SPI接口的四个引脚的工作方式,因此应该将MISO配置成输入管脚,MOSI、SCK和SS配置成为输出管脚; c.当ATmega128工作于主控模式下,SS管脚并不受SPI硬件电路或寄存器的配置控制,因此使用时应该根据各被控芯片的SPI协议编程控制SS。 3.2 ADT7516数据通信 ADT7516是 Analog Devices公司推出的一款多功能转换器件,包括四通道10位ADC, 10位温度数字转换器,以及一个四通道的12位DAC;该芯片兼容SPI、I2C、QSPI、MICROWIRE接口,采用该芯片对电源管理模块上3.3V和12V电压、电流进行采集。 ADT7516工作模式默认下为I2C接口,初始化时需要先将通信接口转为SPI;其次,该芯片为了区分读写操作,在地址、指令和数据通信之前,必须由主控器件发送写命令码(0X90)或读命令码(0X91),同时在SS使能的周期内,只允许存在读、写命令码中的一种。 设计中ADT7516初始化为Single-channel模式,采用Vdd为参考电压,因此模数转换精度为Vdd/1024(3.3/1024≈0.003),满足0.01的采样精度要求。对连续的16次采样结果平均后作为有效采样值。ATmega128和ADT7516之间的读写时序如图2所示;通过读指令,ADT7516向ATmega128传输的Data1和Data2进行相应比特的组合得到10位转换结果。 其中,SS线的连续高低变换的目的是将默认的I2C接口转换为所需的SPI接口;Tc为模数转换时间,ADT7516需要满足Tc>=11.4ms的要求;当ATmega128发送读指令后,ADT7516需要ATmega128提供的时钟才能将转换结果发送给ATmega128,因此读指令后面数据0X00的发送只是为了提供SPI总线时钟,从设备ADT7516初始化以及读写操作如下所示: //Write Command+Address+Command PORTB&=~(1< Master_Send(0x90); //Write Command Master_Send(0xXX); Master_Send(0xXX); PORTB|=(1< //Write Command+Address PORTB&=~(1< Master_Send(0x90); Master_Send(0xXX); PORTB|=(1< //Read Command+Read Value PORTB&=~(1< Master_Send(0x91);//Read Command ainX_l = Master_Receive(0x00); PORTB|=(1< 实验过程中采用电子负载设备模拟实际系统中电压、电流,测试结果如表2所示,其中对12V、3.3V电压的监控是通过监控电阻分压值完成的;电流监控是对TPS24720输出的电压进行测量后转换为对应的电流值。 3.3 SI8902数据通信 SI8902是SILICON LABS公司推出的一款三通道10位隔离监控ADC,内置SPI接口,具有2.5KV或者5KV的隔离率,包含POR和UVLO功能。 SI8902模数转换的开始以及模式的配置都是通过SPI接口向SI8902的配置寄存器发送配置数据,在等待一定的转换时间后,ATmega128读取转换后的数据;SI8902有两种工作模式,分别为Demand Mode和Burst Mode,本文采用Demand Mode模式;采用Vdd为参考电压,因此模数转换精度为Vdd/1024(3.3/1024≈0.003),满足0.01的采样精度要求。需要明确的是,SI8902在发送转换结果之前会将ATmega128发送的配置数据传送到SPI总线上,因此ATmega128和SI8902之间的读写时序如3图所示;MISO线上的Data1和Data2在进入ATmega128后进行相应比特的组合得到10位转换结果。 其中,Tc为模数转换时间,ADT7516需要满足Tc>=8us的要求;MOSI线上发送的三字节0XFF数据是为了提供时钟给MISO线,从而保证ATmega128读取转换结果,0XFF的选取需要排除SI8902已存在配置数据。需要特别注意的地方是,由于SI8902的MISO管脚不是Open-drain输出,因此需要对该管脚进行三态输出缓存(如图1上使用的TI公司的SN74LVC1G125DBV),从而消除该芯片对SPI总线的无效占用,保证主控芯片可以和任何被控芯片进行通信。因此SI8902初始化以及读写操作如下所示: PORTB&=~(1< Master_Send(0xXX);//CNFG_0 Command Byte CNFG=Master_Receive(0xFF); AINX_h= Master_Receive(0xFF);//ADC_H Byte AINX_l = Master_Receive(0xFF);//ADC_L Byte PORTB|=(1< 实验过程中采用电子负载设备模拟实际系统中电压、电流,测试结果如表3所示,其中对交流电路中28V电压的监控是通过监控电阻分压值完成的;电流监控是对TPS2492输出的电压进行测量后转换为对应的电流值。 4数据处理 ATmega128分时使能各个ADT7516和SI8902芯片,并将其中一路电源通路的10Bits电压、电流转换结果进行逻辑运算控制通断状态。为了满足控制的实时性,采样出的一组转换结果立马和设定好的上下门限进行比较,输出通断控制信号ON/OFF,此后再使能剩余的模数转换器。当转换结果介于上下门限之间,说明该电源通路的电压、电流满足系统需求,因此通断控制信号ON/OFF使能TPS24720或TPS2492完成对该通路的输出,否则控制信号ON/OFF禁止TPS24720或TPS2492输出相应电源通路。根据系统的需求,各电压、电流的上下门限如表4、表5所示;同时TPS24720、TPS2492自身也有过流和过压保护,两种方式结合增强了对该通路的监控和系统的保护。最后再将各通路的电压、电流采样值和各通路的通断情况通过UART接口发送到PC机进行显示,并存储到NVRAM中供后续查询操作。 5结束语 本文主要讨论了ATmega128与ADT7516、SI8902的SPI通信过程,通过AVR Studio4.18和WinAVR软件的配合使用,研究了两种模数转换芯片驱动程序的设计过程和注意点。该系统转换结果准确,转换时间快速,可以满足系统的要求。通过对各个通路电压、电流的监测可以有效地监控电源管理模块的工作状态,有效的保护电源管理模块对系统内部其他模块的供电需求。 参考文献: [1] Atmel corporation. ATmega128(L) Complete Datasheet [OL]. http://. [2] Analog Devices,Inc. ADT7516 Datasheet [OL]. http://. [3] Silicon Laboratories.SI8902 Datasheet [OL]. http:// . [4] 张桂香,姚存治.基于ATmega128单片机的智能供电测控系统设计[J].电力自动化设备,2009,29(8): 136-139. [5] 马潮.AVR单片机嵌入式系统原理与应用实践[M].北京:北京航空航天大学出版社,2012.424-445. [6] 王耿,王金明.SPI接口控制器设计与实现[J].电子质量,2010(1):4-5. [7] 王宗刚,潘峥嵘.基于AVR单片机的SPI接口的实现[J].自动化与仪器仪表,2011(2):114-115. [8] 王耿,王金明.SPI接口控制器设计与实现[J].电子质量,2010(1):4-5.