黄剑波
安徽理工大学电气与信息工程学院,安徽 淮南 232001
ATmega128为基于AVR RISC结构的8位低功耗CMO S微处理器。由于其先进的指令集以及单周期指令执行时间,ATmega128的数据吞吐率高达1MIPS/MHz,从而减缓系统在功耗和处理速度之间的矛盾。我们研究的对象主要是基于ATmega128的综合开发系统,研究内容包括TWI接口与AT24C01的通信功能实现,USART接口与PC的通信功能实现,SPI接口控制相关数码管的数据显示的功能实现。
SPI总线是由MOTOROLA公司提出的一种同步串行外设接口。本次研究的开发板采用的是4根信号线,即两条控制信号线 (低电平有效)和SCLK以及两条数据信号线SDI和SDO。
通过将需要的从机的 引脚拉低,主机启动一次通讯过程。主机和从机将需要发送的数据放入相应的移位寄存器。主机在SCK引脚上产生时钟脉冲以交换数据。主机通过将从机的 拉高实现与从机的同步。
TWI协议允许系统设计者只用两根双向传输线就可以将128个不同的设备互连到一起。这两根线一是时钟SCL,一是数据SDA。外部硬件只需要两个上拉电阻,每根线上一个。所有连接到总线上的设备都有自己的地址。TWI 协议解决了总线仲裁的问题。
TWI总线进行数据传输时,SDA线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL线的时钟信号时低电平时才能改变。
TWI总线协议规定,在SCL线是高电平时,SDA线从高电平向低电平切换表示其实条件;当SCL是高电平时,SDA线由低电平向高电平切换表示停止条件。
发送到SDA线上的每个字节必须是8位。每次传输可以发送的字节数量不受限制,每个字节后跟一个响应位(ACK)。首先传输的是数据的最高位。
USART分为了三个主要部分:时钟发生器,发送器和接收器。控制寄存器由三个单元共享。时钟发生器包括同步从机操作用来与外部输入时钟进行同步的逻辑,以及波特率发生器。XCK ( 发送器时钟)引脚用于同步发送模式。发送器包括单个写缓冲器,串行移位寄存器,奇偶发生器以及处理不同的帧格式所需的控制逻辑。写缓冲器可以保持连续发送数据而不会在数据帧之间引入延迟。由于接收器具有时钟和数据恢复单元,它是USART 模块中最复杂的。恢复单元用于异步数据的接收。除了恢复单元,接收器还包括奇偶校验,控制逻辑,移位寄存器和两个接收缓冲器UDR。接收器支持与发送器相同的帧格式,而且可以检测帧错误,数据过速和奇偶校验错误。
对于TWI串口来说,它所要实现的功能就是对AT24C01进行访问,包括对指定单元写入内容0xaa,并将该单元内容读取。
(1)TWI通信初始化
在这一部分,我们采用了“twi_init(void)”函数以实现TWI通信的初始化。函数具体实现是首先对TWI控制寄存器——TWCR进行设置,将其所有比特位置为0,以禁止TWI。在这之后,对TWI比特率寄存器——TWBR设置比特率,设置为01100100.然后将TWI状态寄存器——TWSR的所有的比特位置为0,其目的主要是令TWSR的后三位比特位为0,选择不分频,和系统钟保持一致。然后通过对TWI(从机)地址寄存器——TWAR赋值以设置从机地址。最后,再将TWCR寄存器的TWEN比特位——TWI使能位置位,启动TWI。
(2)TWI通信开始
在这一部分,我们采用了“TWIstart(void)”函数以实现TWI通信的开始。函数实现的功能就是发送帧格式中的START信号。函数具体实现是首先将TWCR寄存器的TWEN,TWSTA,TWINT置为1,发送START信号。这里需要注意的是TWINT的特殊,TWINT标志的清零必须通过软件写“1”来完成,只要这一位被清零,TWI立即开始工作。然后用“while (!(TWCR & (1< (3)TWI写数据 这一部分当中,我们采用了“unsigned char TWIwt(unsigned char data)”函数实现TWI写数据。我们需要进行两步操作:将数据装入TWDR寄存器,启动数据发送;等待TWINT置位。ATmega128向AT24C01写入一个字节的数据,数据类型可以包括从机地址,AT24C01的地址单元,写入地址单元的内容。函数具体实现是首先将数据装入到TWDR寄存器,然后将TWINT清零,启动发送数据,并且用“while (!(TWCR & (1< (4)TWI读数据 同写数据类似的,我们采用了“unsigned char TWIrd(void)”函数实现TWI读数据。处理器从AT24C01某个地址单元读取数据。首先将TWCR寄存器的TWEN,TWEA,TWINT置为1,TWEA标志控制应答脉冲的产生,在主机/ 从机接收模式下接收到一个字节的数据时接口发出ACK脉冲。在等待TWINT置位后完成数据的读取。 (5)TWI停止 本部分我们运用了“T W I s t o p(v o i d)”函数完成TWI串口通信停止。通过将TWCR寄存器的TWEN,TWSTO,TWINT置为1,发送STOP 信号。在写入值时 TWINT 位要置位,这非常重要。给TWINT写"1”清除此标志。TWCR寄存器中的TWINT置位期间TWI不会启动任何操作。一旦TWINT清零,TWI启动STOP信号的传送。注意TWINT在STOP状态发送后不会置位。 TWI的写操作和读操作的流程图分别如下图1,图2所示: 图1 AT24C01写流程图 图2 AT24C01读流程图 ATmega128具有两个USART,USART0和USART1。本次我使用的是USART0。USART的硬件图如下所示: 图3 USART串口连接图 在USART0的初始化实现了对波特率9600,8位数据位,一位停止位,无校验位等要求的设定。数据位是8位,所以USART端口发送数据的方式是按字节发送。 USART0端口的数据发送有查询方式和中断方式两种,这里我们采用了查询方式。数据发送结束标志有“USART发送结束”和“USART数据寄存器空”两种,我们采用的是“USART数据寄存器空”。这两种结束标志的区别主要体现在发送缓冲器(UDRn)中的数据是否被送出,在数据没有被送出的情况下,不能使用“USART发送结束”标志。 USART0端口的数据发送我们采用了异步方式。 SPI与74HC595的硬件连接如下图所示 图4 SPI串口连接图 由上图我们可以看到处理器A T m e g a 1 2 8的S P I串口通信中的 接到7 4 H C 5 9 5口的R C L K口,ATmega128的SPI串口通信中的SCK接到74HC595口的SRCLK,ATmega128的SPI串口通信中的MOSI接到74HC595口的SER,处理器ATmega128的SPI串口通信中的MISO接到74HC595口的SRCLR上。PC7接到使能口上。本次课题串口通信中只实现主出从入。 (1)SPI初始化 这一部分当中,我们采用了“spi_init(void)”完成SPI的初始化。通过对端口B数据方向寄存器DDRB赋值,将MOSI,SCK,SS设置为输出,之后对SPI控制寄存器——SPCR赋值,使能SPI,选择主机模式,并且设置传送速度。 (2)SPI主机发送数据 “SPI_MasterTransmit(char Data)” 可以完成SPI主机发送数据的操作。将数据写入SPI数据寄存器——SPDR,串行发送结束后,SPIF置位。 (1)HC595初始化 我们采用“void HC_595_init(void)”将HC595初始化。主要需要完成 的方向和值的设置。首先将 设置为输出,赋值为1以禁止其启动。初始化PORTB的值使得数码管的选通全部禁止,并将SPI的主从同步信号设置为高电平。之后调用SPI的初始化程序,最后将数码管的显示数据设为16即不显示。 (2)HC595写数据 送数据的操作比较简单,主要通过调用函数实现。首先通过调用函数设置 的值以启动从机SPI通信,然后调用SPI主机发送数据函数“SPI_MasterTransmit(char Data)”,最后调用函数将PB0( )设置为1,恢复到初始状态。 (3)HC595显示整形数据 这部分函数主要实现的功能是待显示数据通过处理后,分别将百位,十位,个位存储在相应的单元中。在程序中,存储单元指的是数组Seg7_Led_Buf[]。 (4)HC595刷新显示 这部分函数主要实现的功能:4个数码管依次选通显示相应数值,显示的数值通过查表,通过SPI接口发送。由于刷新显示程序的运行时间比较短,可以保证数码管的稳定显示。 本次研究运用编程实现处理器通过串行接口与外设之间的联系。显示结果表明处理器与外设之间通信状况良好,显示延迟小,数据准确,对于运用此系统进行后续的开发具有重要的意义。 [1]马潮. AVR单片机嵌入式系统原理与应用实践[M]. 第一版.北京:北京航空航天大学出版社,2007 [2]金钟夫. AVR ATmega128单片机C程序设计与实践[M]. 第一版.北京: 北京航空航天大学出版社,2008 [3]朱飞,杨平. AVR单片机C语言开发入门与典型实例[M]. 第一版.北京:人民邮电出版社,20102.2 USART串口通信模块的功能实现
2.3 SPI串口通信模块的功能实现
2.4 数码管显示模块功能实现
3 结语