基于TWI接口实现AVR单片机主从机通信论文
基于TWI接口实现AVR单片机主从机通信【摘要】atmel公司的twi(two-wire serial interface)接口具有硬件实现简单、软件设计方便、运行可靠和成本低廉的优点。
提出了一种以avr单片机atmega8为平台基于twi接口的主从机通信的实现方法,给出了该系统主从机进行通信的硬件结构和软件设计。
该方法对于简化硬件电路、提高系统可靠性、缩短开发周期、降低成本是可行的。
【关键词】avr;twi;主机模式;从机模式master-slave communication of avr microcontroller based on twi interfacezhou yong-gang(the 41st institute of china electronics technology group corporation, qingdao shandong, 266555)【abstract】the twi interface of atmel corporation has simple hardware, software design has the advantages of convenient, reliable operation and low cost. this article presents the design of master-slave communication system for avr microcontroller based on twi interface on the platform of atmega8,give the structure of the system’s hardware and software design. the method is feasible to simplify the hardware circuit, improve system reliability, shorten development cycles, reduce costs.【key words】avr; twi; master mode; slave mode0 引言avr atmega系列单片机片内集成两线串行接口twi模块。
采用twi协议,设计者可通过两根双向总线,即一根时钟线scl和一根数据线sda,最多连接128个从设备[1]。
实现总线连接时唯一需要增加的外部设备是两条总线上的上拉电阻。
所有与总线相连的设备都需要定义各自的设备地址。
实际上,twi接口时序与常见的i2c 总线是兼容的,因此,只需要控制相关寄存器,就能够实现通过twi 传输数据,twi通信工作于主从模式,把系统任务进行了合理的分工,节省了硬件资源,减少了工作量,从而使编程简单,开发更容易。
1 twi接口简介twi总线是简单同时强大而灵活的通信接口,具有最高达400khz 的数据传输率。
twi总线协议可仅用两根线将不同的设备互连到一起。
支持主机和从机操作、多主机仲裁。
avr单片机的twi模块由以下几个子模块构成[2]:1.1 scl和sda引脚当cpu对应的端口设置为scl和sda引脚时,可以设定相应i/o 口内部上拉电阻有效,这样可以省略外部的上拉电阻。
1.2 波特率发生器twi工作于主机模式时,时钟信号scl的周期由比特率发生器控制。
具体由twi状态寄存器twsr的预分频系数以及比特率寄存器twbr设定,scl的频率计算公式如公式(1):scl frequency=■(1)其中,twbr为twi波特率寄存器的值;twps为twi状态寄存器预分频位的值。
在主机模式下,twbr的值应大于10,否则可能会产生不正确的输出。
1.3 总线接口单元该单元包括数据与地址移位寄存器twdr,起始/终止信号(start/stop)控制器和总线仲裁判定硬件电路。
1.4 地址匹配单元地址匹配单元将检测从总线上接收到的地址是否与twar寄存器中的7位地址相匹配。
一旦地址匹配成功,控制单元将按照得到的通知作出相应的响应。
1.5 控制单元控制单元监听总线twi总线,并根据twi控制寄存器twcr的设置作出相应的响应。
当twi总线上产生需要应用程序干预处理的事件时,twi中断标志位twint置位,时钟线scl被拉低,暂停twi 总线上的数据传输。
1.6 twi寄存器twbr:twi比特率寄存器。
twcr:twi控制寄存器。
twsr:twi状态寄存器。
twdr:twi数据寄存器。
twar:twi(从机)地址寄存器。
2 twi总线的使用avr的twi接口是面向字节和基于中断的。
所有的总线事件,如接收到一个字节或发送一个start信号等,都会产生一个twi中断。
由于twi接口是基于中断的,因此twi接口在字节发送和接受过程中,不需要应用程序的干预[3]。
twi状态寄存器twsr包含了表面当前twi总线状态的值。
应用程序可以读取twsr的状态码,判别此时的状态是否正确,并通过设置控制寄存器,决定在下一个twi 总线周期twi接口的工作[4]。
twi可以工作于4种不同的模式,即主机发送模式(mt)、主机接收模式(mr)、从机发送模式(st)、从机接收模式(sr)。
当twi 上出现多个主机时,就会发生多主机仲裁。
除了依靠自身硬件的检测外,还可以通过软件读取twsr状态寄存器判断自己在总线中的精确状态,以便为下一步动作提供更精确的诊断依据。
主机模式下,主机可向从机发送或接收数据。
为了进入主机模式,必须先发送start信号;紧接着的地址包格式决定是进入主机发送模式或者主机接收模式。
如果发送sla+w,则进入主机发送模式;如果发送sla+r,则进入主机接收模式。
从机模式下,从机只需要监听twi总线,如果接收到sla+r并回复ack后,则进入从机发送模式;如果接收到sla+w并回复ack 后,则进入从机接收模式。
3 系统硬件设计图1 系统硬件结构在交流电源分配柜中,采集板负责采集交流电压、交流电流、交流频率和30熔丝告警信息,采集数据后发送到显示板;显示板具备告警门限设置、数据显示以及数据上传服务器等功能。
采集板和显示板的cpu均采用atmega8芯片。
基于twi接口的硬件电路实现非常方便,只需要将两片atmega8芯片的scl和sda引脚通过上拉电阻与+5v电源相连接即可。
硬件电路如图1所示。
4 系统软件设计采集板cpu采集数据后,通过twi总线发送数据到显示板cpu,显示板cpu接收数据后,给采集板cpu回复相应的数据。
显示板cpu 在用户重新设定告警门限后,需要设定值发送给采集板进行设定。
因此在该系统中采集板cpu工作于主机发送和主机接收模式,显示板cpu工作于从机接收和从机发送模式。
4.1 主机模式在主机模式[5]下,主机通过发送start信号启动总线,确认start信号发送后,发送从机地址和写标志位等待从机响应,得到从机的响应后,发送数据到从机。
同时在总线空闲时,主机每隔一段时间发送从机地址和读标志位进入主机接收模式,接收从机的告警门限值,接收完后设定主机的门限值。
主机在初始化后,需要执行包括主机读、主机写程序,并把读取到数据从缓冲区中转存。
为了保证twi总线的稳定运行,只有主机发送模式(mt)和主机接收模式(mr)程序是不够的,还必须有一定的系统总线状态错误处理程序[6],以防止twi总线在受到外界干扰时出现故障。
考虑本文所设计的系统是主机与从机不会实时发生变化的总线网络系统,所以对于主机而言还要有容错处理程序。
中断流程图如图2所示。
图2 主机模式中断流程图4.2 从机模式在从机模式[7]下,由于从机也需要处理不通的事件,需要采用中断的方式处理接收和发送数据,这样可以有效的提高程序的运行程序。
通过检测twsr状态码,进行不同的处理。
从机在被寻址后,回复主机,判断是否进入从机接收模式或从机发送模式。
进入从机接收模式时,在ram中开辟一块数据缓冲区,用于接收数据;进入从机发送模式时,将需要发送的数据装入发送缓冲区,中断程序在自动响应主机进行数据发送。
中断流程图如图3所示。
图3 从机模式中断流程图5 结束语利用twi接口实现avr单片机主从机通信,简化了硬件和软件设计,缩短了系统开发周期。
在twi通信程序中增加了容错处理程序,使总线运行稳定可靠,提高了系统的抗干扰能力。
在通信中采用了twi中断,合理安排事件处理时间,有效提高了程序的运行效率。
【参考文献】[1]atmega8 datasheet[z]. atmel corporation.[2]马潮,詹卫前,耿德根,等.atmega8原理及应用手册[m].北京:清华大学出版社,2002.[3]郭祥军.avr单片机的twi总线的原理及应用[j].单片机与嵌入式系统应用,2006(8):37-39.[4]楚天鹏,郑华耀.twi接口多机通信的实现[j].装备制造技术,2008(6):96-98.[5]avr315: using the twi module as i2c master[ol]. .[6]汪海波,王卓然,耿德根,等.深入浅出avr单片机[m].北京:中国电力出版社,2008.[7]avr311: using the twi module as i2c slave[ol]. .[责任编辑:王洪泽]。
AVR单片机通信技术研究与分析
AVR单片机通信技术研究与分析李奇【摘要】研究了单片机SPI串口通信,并以AT90S8535与AT90S4434为例,将其两单SRAM的数据进行交换,数据块首地址分别为BLOCK0和BLOCK1,长度分别为LENGTH0和LENGTH1,两机所用晶振频率均为4 MHz.将AT90S8535设定为主控方式,AT90S4434为从控方式.两机通过SPI进行LENGTH个字节的数据交换.作出硬件连接和软件实现.【期刊名称】《应用能源技术》【年(卷),期】2017(000)001【总页数】4页(P39-42)【关键词】AVR单片机;串行通信;SPI【作者】李奇【作者单位】全球能源互联网研究院,北京102211【正文语种】中文【中图分类】TP274计算机与外界之间的信息交换我们称为通信,而最简单的通信方式就是使用串行通信。
串行通信是CPU与外界进行信息交换的一种方式,是指数据按顺序进行位传输的一种方式。
在设计通信接口时,必须根据需要选择标准接口,并考虑传输介质、电平转换等问题。
采用标准接口后,能够方便的把PC机、单片机和外设、测量仪器等有机的连接起来,从而构成一个测控系统。
标准异步串行通信接口有以下几类:(1)RS-232C(RS-232A,RS-232B)。
(2)RS-449(RS-422,RS-423和RS-485)。
(3)20 mA电流环。
(4)USB通用接口。
为了保证可靠性高的通信要求,在选择接口标准时,须注意以下两点:(1)通信速度和通信距离。
(2)抗干扰能力。
为了更好的了解各种接口标准的工作过程,下面对RS-232C、RS-422和RS-485标准进行介绍。
RS-232C接口标准是在1969年由美国电气工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准,所以RS-232C是PC机与通信工业中使用最早的一种串行接口标准。
在短距离、较低波特率串行通信中得到了广泛的应用。
基于AVR单片机的通信系统设计
基于AVR单片机的通讯系统设计摘要在当前社会,通信技术已经深入到各行各业中。
在本次系统设计中,将通信技术与单片机技术结合,完成了一个电压信号采集及通信过程。
系统设计过程中,了解通信技术中的相关通信方式及协议,用AVR单片机完成系统功能,分别完成硬件设计、软件设计及系统测试工作,达到对整个通信系统的控制。
本文以ATMEGA8单片机为控制核心,利用直流电压信号模拟输入信号,采集输入信号,将采集到的数据经数字信号处理后传给上位机分析并保存。
工作过程:1、单片机初始化所用到的功能模块的控制字,等待上位机的开始采集命令。
2、接收到上位机的命令后,从PC0(ADC0)端口采集电压信号,完成模数转换;3、读取转换后的数据,根据A/D转换器的输入/输出关系确定实际的电压信号值;4、将电压信号值保留一位小数,进行BCD编码后,通过异步通信方式发送给上位机;5、上位机通过GUI界面将数据实时显示出来,并可人为的保存采集的结果;关键字:AVR;ATMEGA8;电压采集;通信;MAX232AbstractIn moden time, technology has been penetrated into a large number of industry,under this environment。
It is useful to design the system which combine communication-technology with SCM technology to achieve a process of collect voltage and communication。
During the period of system designing,what is communication pattern and protocol must be known,on this basis,using A VR SCM to finish the function what we need in this system,which include circuit design、software design and test work。
the_driver_for_TWI(I2C)_in_AVR
PDF 文件使用 "pdfFactory Pro" 试用版本创建
台湾全科科技股份有限公司
case TW_START: case TW_MT_ARB_LOST: default: return twst; }
成都:028-85215068,85215083
武汉:027-87332305,87332306,87332651
PDF 文件使用 "pdfFactory Pro" 试用版本创建
台湾全科科技股份有限公司
#include <util/twi.h> //定义 AVR 的主频 #define F_CPU 8000000UL //定义 TWI 的时钟速率 #define TWI_SCL 400000UL // 定义重复开始的次数 #define MAX_ITER 200 //初始化 AVR TWI void twi_init(void) { TWBR = (F_CPU / TWI_SCL - 16) >> 1; TWCR = _BV(TWEN); } /* TWI 的随机读,返回值为 0x09 表示成功;其他的值表示失败,并反映了失败的原因 device_addr 为 TWI 从机地址; is_double_addr 是指访问的存储单元地址是否为双字节,0 为单字节,非零为双字节; word_addr 为要访问的存储单元的地址; type_size 为用户数据缓存区的数据类型大小; len 为用户希望访问的数据个数, user_buf 为用户数据缓存区的起始地址 */ uint8_t twi_random_read(uint8_t device_addr, uint8_t is_double_word_addr,\ uint16_t word_addr, size_t type_size, uint16_t len, void *user_buf) { uint8_t twcr, twst, n=0; restart: if (n++ >= MAX_ITER) { return 0x14; } begin: // 发送 START TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); loop_until_bit_is_set(TWCR, TWINT); switch ((twst = TW_STATUS)) { case TW_REP_START:
基于TWI接口实现AVR单片机主从机通信
基于TWI接口实现A VR单片机主从机通信【摘要】Atmel公司的TWI(Two-wire Serial Interface)接口具有硬件实现简单、软件设计方便、运行可靠和成本低廉的优点。
提出了一种以A VR单片机ATmega8为平台基于TWI接口的主从机通信的实现方法,给出了该系统主从机进行通信的硬件结构和软件设计。
该方法对于简化硬件电路、提高系统可靠性、缩短开发周期、降低成本是可行的。
【关键词】A VR;TWI;主机模式;从机模式Master-slave Communication of A VR Microcontroller Based on TWI Interface ZHOU Yong-gang(The 41st Institute of China Electronics Technology Group Corporation,Qingdao Shandong,266555)【Abstract】The TWI interface of ATMEL Corporation has simple hardware,software design has the advantages of convenient,reliable operation and low cost. This article presents the design of master-slave communication system for A VR microcontroller based on TWI interface on the platform of ATmega8,give the structure of the system’s hardware and software desi gn. The method is feasible to simplify the hardware circuit,improve system reliability,shorten development cycles,reduce costs.【Key words】A VR;TWI;Master mode;Slave mode0 引言A VR ATmega系列单片机片内集成两线串行接口TWI模块。
基于I_2C总线的单主多从单片机之间的通信
作者在程序流程的每个关键部分都设置了错误查询和错 误处理,使得 I2C 程序能够从错误中自动恢复,避免了由于 I2C 通信导致的错误而使得系统无法正常工作,文中还给出了部分 发送子程序和编程注意事项。对于图 2 和图 3 的 I2C 通信流 程,作者已在多个科研项目中进行了编程使用。实践证明,按上 述流程编写 I2C 通信程序,主从单片机之间的通信非常可靠。
技
1 引言
随着单片机控制系统的不断扩大以及控制功能不断增多, 有限的单个单片机通用 I/O 口已不能满足同一系统中控制多个 受控对象需要,随着 I2C 总线研究的深入,用 I2C 总线扩展单片 机 I/O 口的方法在全自动、半自动仪器的开发领域得到了广泛 应用,本文介绍了一个测试系统通过 I2C 总线扩展 I/O 口实现 了系统的多个功能。给出了系统的硬件连接以及 Atmega128 与 三个 Atmega168 之间的软件通信流程图。
2 系统的硬件结构
图 1 是作者所研究的测试系统的整体框图,本系统中主要 芯片 PHILIPS 公司的 LPC2292,在此系统中键盘上其中三个按 钮分别控制三个电机,系统的主要功能是 LPC2292 将扫描到的 键盘信息发给 Atmega128 单片机,Atmega128 单片机通过 I2C 总线寻址 Atmega168,并向被寻址的 Atmega168 发送电机控制 命令,最后,电机根据 Atmega168 控制策略正常运行。电机启动 同时,数据采集模块也开始正常运行,数据采集模块把采到数 据送到 LPC2292 的 A/D 转换接口,然后将 ADC 输出的数据发 送到 LCD。系统中的拨码开关用于设置相应的 Atmega168 单片 机的地址,当单片机 Atmega128 接收到 LPC2292 发来的控制命 令时,通过 I2C 总线寻址 Atmega168,当某个 Atmega168 的地址 与 Atmega128 广播地址相同时,它就开始根据 Atmega128 发送 的命令控制电机开始工作。
TWI接口和TWI接口器件使用
TWI接口和TWI接口器件使用A VR单片机的很多型号也具有两线制接口,即TWI接口。
实际上TWI接口时序和常I2总线是兼容的。
我们这本书结合讲的单片机Atmega16就有这种接口。
这种接口的见的C使用也十分广泛。
比如本文会结合介绍的EEPROM A T24C64;MAXIM公司的温度传感器(查出型号);有的A/D转换器;菲利普还有专门的用这种总线的I/O扩展芯片。
TWI电路接线简单,占用I/O,并且可以很多期间共享一个总线,使用比较方便,系统也很简洁。
A VR单片机用硬件实现了这种总线的时序,省去了很多编程工作。
同时支持一条总线多个主设备的通讯。
我们只需要控制相关寄存器就能实现通过TWI传输数据。
很大程度I2的基本知上减少了我们的工作量,从而使代码更简洁,开发更容易。
下面我们会介绍CI2接口的EEPROM的例识,A VR的TWI接口的功能和使用,给出一个用TWI接口读写C子,最后给出适用于A VR-GCC编译器的示例程序。
I2总线的基本知识一、CI2总线的信号线有两条,一条是时钟线SCL,另一条是数据线SDA。
总线连接起来的时候,C需要两个上拉电阻,器件内部这两个信号引脚是集电极开路(或者是漏极开路)的。
这样总线上的器件只要有一个输出低电平总线就会被拉低(实际上就是所谓线与的逻辑),这主要用于总线仲裁。
I2总线上,有几个状态表示特殊的总线信号。
1.在C开始和停止信号时序如下图所示:图上可以看出,在SCL位高电平时SDA的变化将产生总线开始和停止信号。
SDA从高电平跳变到低电平表示开始,从低电平跳变到高电平表示停止。
数据的建立和有效:上图表示在传输数据时,SCL高电平的时候,SDA上的数据不能变化,因为前面已经说明,这是数据的变化将会认为是开始或者结束的信号。
在SCL低电平时数据可以改变。
2.主器件和从器件总线上可以有很多设备但是同时只能有一个主设备进行传输,从设备都有设备地址,当总线上的地址和从设备设置的地址一致时,传输在主设备和被寻址的从设备之间进行,其他设备相当于和总线分离。
基于AVR单片机的USB主从机设计
SlC &T H0OY CN E E E NL0 C
圆
基于 AVR单片机的 USB主从机 设计
杨 日星 闭金杰 ( 广西 师范 大学物理与 电子工程学院 广西桂林 5 0 ) 4 4 1 0 摘 要: V 以A R单 片 A m g 3 作 为主控 C U IP 3 2 为 U B O G 机 T e a2 P ,S 1 6 作 S - T 袖理接 口芯 片, 基于标准的 U B . 协议, S 20 设计 了一种 U B主机 S 和从机 功能 , 使之 满足 US B数据存 储与交换的需求 , 可应 用于便 携式仪器设备 高速接 口扩展 。 也 关键词 : me a 2 IP 6 O G U B主从机 G C程序设计 AT g 3 S 1 2 T S 3 C 中图分类号 : P T 3 文 献标 识码 : A 文章编号 : 6 2 7 l 2 0 ) la 一 0 7 0 l 7 -3 9 ( 0 8 ] ( ) 0 2 — 1 参考文献 2.Fra bibliotek2系统 软件结构
n】Ph l s e c n u t r i p S mio d c o Co a y. i mp n I Pl 6 S ng e hi Uni r a S i l S 3 2 i l —c p ve s l era 221 . . AT g 3 me a 2的初始 化 BUS On—The —GO o r le 2 0 1. c nt ol r. 0 4. A Tme a系列 单 片 机 的 内 部 模块 比较 g 丰 富 , 用资 源也 很 多 , 始 化 单 片 机 , 可 初 就 [1Ph lp S mio d c o C mp n 2 ii s e c n u t r o a y. I Pl 6 USB On S 32 The —GO 0TG) ( 是 对 I O 口、定 时 器 、时 钟 、看 门 狗等 进 / sngl-c i i e h p c ontol r. 00 1 r l e 2 2. 0. 行设置 。 2 2 2 S 3 2主机 端 的初 始化 . . I P1 6 [】佟长福 . 3 AVR单片 机 GCC程序 设计I J N . 当 I P 3 2 电后 , S l6 上 主机 控 制器 驱 动程 北京 航 空 航 天 大学 出版 社 , 0 6, . 2 0 1 的处 理 。 序 ( D) 须 通 过一 系列 的 硬件 初 始 化 步 HC 必 1 IP 6 的管脚说 明 2 s 1 2 3 骤 来 配 置 主 机 控 制 器 , 而 进 入 可 操 作 状 从 I Pl 6 S 3 2的 P r l口主 /从机 功能是 通 态 : 测 主机 控 制 器是 否存 在 ( M C 实 ot 检 由 U 过I D、OT M0 E两 管 脚电 平的 高低 组 合 G D 现 , 过 MCU 向 Hc c a c 通 S r t h寄 存 器内 写入 来确 定的 : O G DE管脚 接低 , 当 T MO 无论 I 某 个 值 , 从该 寄 存 器 中读 取 , D 再 将读 出值 与 电平 如何 , 该 芯 片的 P r l 《 o t 口只能作 O G T 写 入 数 值进 行 比 较 , 相 等 , 可说 明主 机 若 则 A~ g 3 f Jf l a2g c} mc l !化 使用 ; 果 l 如 D接 低 , OTGMODE接高 , 芯 控 制 器 存 在 ; 之 则 出错 , 主 机控 制 器 存 该 反 无 IP 3 2l}』 干 匕 S 16 l 的 , 1 = f J 片 的 POr tl口 就 作 主 机 使 用 ; D 接 高 , 在 ) 软 件 设 置 主 机 控 制 器 , 将 其 设 为 I 。 即 IP 3 2 }端 蚋 训 蚧 化 S l6 从 I 【 0TGM0DE也 接高 时 , 则该芯 片 的 Po t r l口 RE E 状 态 。 ST 怍从机使用。 2. 3 S 3 2从机 端的 初始 化 2. I Pl 6 控 制 I Pl 6 S 2芯 片 , 基本 同时 也是 最 3 最 从机 端 的 初 始 化 设 计 主 要 是 通 过 I /O 让P D T {J 1 l 1 I 述 为重要的操作就是对该芯片的 C s、RD、 口 。 照 I P1 6 数 据手 册 中 DC初 始化 命 按 S 32 ’ w R、A0 l 、A 的控制 。其 中, S C 代表 片选 , 令 , 相应 的 寄 存 器进 行 各 个 端 点 的配 置 。 对 做 擎 : l , l 2段 状S 低电平有 效 。RD代 表读信 号 , 低有效 。WR 包 括设置端 点使 能位 、端点 大小 、方 向、是 j , f 他 j 命 3分 波 { . 代表 写 信 号线 , 有效 。A0代 表 传 输信 号 否 是 双 向缓 冲 等 等 。 低 符j 1 4i 设 。 5 j . I 芟 : ; . 是 数 据 信 号还 是 命 令 信 号 。 Al 表 控 制 2. 代 3系统的功 能设计
一种基于AVR单片机的树状菜单界面的设计_陈慧
一种基于AVR 单片机的树状菜单界面的设计陈 慧,王宏远(华中科技大学电信系,湖北省武汉市430074)【摘 要】 介绍了一种基于AVR 高速单片机的控制电路及其软件设计。
该电路硬件集成度高、功能强大、接口丰富。
软件采用一种针对AVR 单片机特点的树状菜单界面的设计方法,代码简洁,流程清晰,可以方便地增删菜单界面,易于修改、维护和移植,并引入了Tw in 节点的概念,使其更适宜在多通道输入/输出系统中应用。
该电路已在多个系统中应用。
关键词:AVR 单片机,树状菜单,Tw in 节点中图分类号:TP332.3收稿日期:2005-01-17;修回日期:2005-03-21。
0 引 言现在越来越多的系统采用多通道输入/输出系统,系统控制部分日益复杂庞大,因此将其控制电路分离出来也越来越有必要。
以前系统大多采用基于51系列单片机的控制电路,但受其自身功能的限制,必须外扩很多芯片,例如RAM 、EEPROM 、A /D 芯片,造成硬件电路复杂、稳定性差,而且有些功能不易扩展,例如网络接口,所以一般C51系列单片机的控制电路只提供了RS -232/R S -485接口。
另外,C51系列单片机工作速度较慢,也使得系统整体性能受限。
AVR 是美国AT MEL 公司生产的增强RI SC (精简指令集计算机)、内载Flash 存储器的高性能8位单片机,它采用哈佛结构,速度非常快。
ATm ega128是AVR 系列中功能最强的单片机,用它做控制电路能够极大地提高系统的性能和扩展系统的接口。
1 ATm ega128的特性A t m ega128是一款高性能低功耗的AVR 8位微控制器,是AT M EL 公司于2001年推出的m ega 系列AVR 单片机中的代表性产品之一,其特性如下[1]:a )先进的RI SC 结构:133条功能强大的指令,大部分在单时钟周期内完成,32×8个通用工作寄存器+外设控制寄存器,最高可工作在16MH z 下,具有16×106条指令/s 的性能;片内带有执行时间为2个时钟周期的硬件乘法器。
毕业设计(论文)-基于JTAG ICE的AVR单片机开发系统的软件设计
基于JTAG ICE的AVR单片机开发系统的软件设计[摘要]本课题介绍基于JTAG ICE 的AVR单片机开发系统的软件设计。
系统采用C语言编程方法。
课题以自主研发的AVR单片机开发平台为基础。
使用了ICC AVR、AVR Studio和串口调试等软件,为系统各个模块及整体开发程序,进而讲述了本系统的各项功能。
其中串口调试软件是使用VC++自主开发。
整个开发平台有显示、按键、ADC、DAC、蜂鸣器、红外、串行通信、I2C通信、SPI通信等模块。
各个模块都编写有相应的例程。
通过这些例程结合开发系统可以很容易地学会 AVR的各种功能。
另外,在学会各个模块化功能的基础上,编写了一个开发系统整体程序。
把系统上面所有的资源尽量都用上,使读者对此系统有更深入的了解。
经过对此AVR单片机开发系统的讲解,读者会对中高档单片机有一个深刻的了解,对以后工作或学习ARM等更高端产品都会有很大帮助。
在以后的推广中,可以替代51单片机的位置。
使用户在单片机领域提高一个档次。
[关键词]AVR单片机;ICC AVR;AVR Studio;开发平台;串口调试The AVR JTAG ICE-based MicrocontrollerDevelopment System Software DesignAutomation Specialty ZHANG Zhao-weiAbstract:This topic describes the AVR JTAG ICE-based microcontroller development system software design. System uses the C language programming. Subject to independent research and development of the AVR microcontroller development platform. Use the ICC AVR, AVR Studio and serial debugging software modules for the system and the overall development process, and then described the features of this system. One serial port debugging software is developed using VC + +. Showing the entire development platform, buttons, ADC, DAC, buzzers, infrared, serial communication, I2C communication, SPI communication module. The preparation of each module has a corresponding routine. Development system through the combination of these routines can easily learn various functions of AVR. In addition, learn the various modular features based on the preparation of a development system as a whole program. The system all of the above resources have to spend as much as possible, so that readers have a deeper understanding of the system. After this brief AVR microcontroller development system, high-grade readers will have a profound understanding of microcontroller, after work or study on ARM and other more high-end products will be of great help. Promotion in the future, you can replace 51 single-chip location. Allows the user to improve a grade in the SCM area.Key words: AVR microcontroller; ICC AVR; AVR Studio; development platform; serial debug目录1 引言 (1)1.1 课题背景及意义 (1)1.2 国内外研究现状 (1)1.3 论文组织结构 (2)1.3 本章小结 (2)2 关键技术分析 (2)2.1 系统所用到的软件介绍 (2)2.2 ICC A VR软件介绍 (2)2.3 A VR Studio软件介绍 (5)2.4 串口调试软件的介绍 (8)2.5 本章小结 (9)3 系统主要功能模块设计 (9)3.1 系统包含的模块 (9)3.2 按键扫描程序 (10)3.3 模数转换(ADC)程序 (11)3.4 数模转换程序 (11)3.5 12864液晶程序 (12)3.6 24C02IIC通信协议程序 (12)3.7 串口通信程序 (14)3.8 本章小结 (15)4 系统软件架构 (15)4.1 系统整体程序+12864液晶显示 (15)4.2 系统整体程序+1602液晶显示 (17)4.3 本章小结 (18)5 系统测试 (18)5.1 系统测试工具 (18)5.2 系统测试方法及分析 (19)5.3 本章小结 (19)结束语 (20)参考文献 (21)附录..................................................................................................... 错误!未定义书签。
IAR For AVR 两线串行接口 TWI 应用
发送:1,设定数据传输波特率2,发送START信号,等待应答==》《== 应答信号3,发送芯片地址,等待应答==》《==应答信号4,发送数据的绝对地址,等待应答==》《==应答信号5,发送要写入的数据,等待应答==》《==应答信号6,发送STOP信号,释放总线==》数据写入成功接收:1,设定数据传输波特率2,发送START信号,等待应答==》《== 应答信号3,发送芯片地址,等待应答==》《==应答信号4,发送数据的绝对地址,等待应答 ==》《==应答信号5,发送RESTART信号,等待应答==》《==应答信号6,发送芯片地址并注明读操作,等待应答==》《==应答信号7,读取数据,等待应答==》《==应答信号8,发送STOP信号,释放总线==》数据读操作成功#include <iom16.h>#define uchar unsigned char#define uint unsigned int//########################################################### /*串口初始化函数*/void Uart_Init(void){UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许发送和接收UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据位+1位停止位UBRRH=0x00;//设置波特率寄存器低位字节UBRRL=47;//9600//设置波特率寄存器高位字节DDRD_Bit1=1;//配置TX为输出(很重要)}//########################################################### /*发送一个字符数据,查询方式*/void Uart_Transmit(uchar data){while(!(UCSRA&(1<<UDRE)));//while(UCSRA_UDRE==0); /* 等待发送缓冲器为空*/UDR = data; /* 发送数据*/}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#include <iom16.h>#include "IAR_DELAY.H"#define uchar unsigned char#define uint unsigned intvoid Uart_Init(void);void Uart_Transmit(uchar data);//变量声明#define EEPROM_BUS_ADDRESS 0xA0//器件地址/*从器件地址位定义:______________________________________-------------*//*AT24C02| 1 | 0 | 1 | 0 | A2 | A1 | A0 | R/~W |------------*///主机发送模式时各状态字的后续动作#define TW_START 0x08 //开始信号已发出#define TW_REP_START 0x10 //重复开始信号已发出#define TW_MT_SLA_ACK 0x18 //写字节已发出并受到ACK信号#define TW_MT_SLA_NACK 0x20 //写字节已发出并受到NACK信号#define TW_MT_DATA_ACK 0x28 //数据已发出并受到ACK 信号#define TW_MT_DATA_NACK 0x30 //数据已发出并受到NACK 信号#define TW_MT_ARB_LOST 0x38 //丢失总线控制权//主机接收模式时各状态字的后续动作#define TW_MR_ARB_LOST 0x38//丢失总线控制权,未收到应答信号#define TW_MR_SLA_ACK 0x40//读命令已发出并受到ACK#define TW_MR_SLA_NACK 0x48 //读命令已发出并受到NACK#define TW_MR_DATA_ACK 0x50 //数据已收到,ACK已发出#define TW_MR_DATA_NACK 0x58 //数据已收到,NACK已发出#define IIC_Start() TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)// TWINT位通过写1进行清零,一旦清零则TWI开始工作,当相应硬件工作完成后 TWINT位会重新置位为1//TWSTA位会让硬件在总线上产生一个START的信号,声明自己希望成为主机//TWEN位使能TWI功能,将PC0和PC1管脚切换到第二功能上来,如果清零则为中断TWI的传输#define IIC_Stop() TWCR =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN) // TWSTO位在主机模式下,会让硬件在总线上产生一个STOP得信号,并且SCL和SDA两个引脚位高阻态#define IIC_Wait() while(!(TWCR&(1<<TWINT))) // TWINT位经过一次置位使硬件TWI开始工作,然后再检测TWCR寄存器的TWINT位是不是被置位,如果置位为1则表示工作完成可以向下进行//################################################################### ###########/*I2C总线单字节写入*/unsigned char twi_write(unsigned char addr, unsigned char dd){TWBR =10;//设定波特率/*start 启动*/IIC_Start();//硬件发送START信号,并且清零TWINT位,使能硬件TWI,使TWI 开始工作IIC_Wait();//等待发送START完成 TWINT位置位if((TWSR&0xF8)!=0x08) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0/*SLA_W 芯片地址*/TWDR=EEPROM_BUS_ADDRESS;//芯片地址0xA0,赋值给数据寄存器TWDR,等待发送TWCR=(1<<TWINT)|(1<<TWEN);//对控制寄存器TWCR的TWINT位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕TWINT重新置位if((TWSR&0xF8)!=0x18) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0/*addr 操作地址*/TWDR=addr;//将写入数据的绝对地址,赋值给数据寄存器TWDR,等待发送TWCR=(1<<TWINT)|(1<<TWEN);//对控制寄存器TWCR的TWINT位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕TWINT重新置位if((TWSR&0xF8)!=0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回0/*dd 写入数据*/TWDR=dd;//将要写入的数据,赋值给数据寄存器 TWDR,等待发送TWCR=(1<<TWINT)|(1<<TWEN);//对控制寄存器TWCR的TWINT位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕 TWINT重新置位if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0/*stop 停止*/IIC_Stop();//数据传输完成,发送STOP信号,释放对总线的控制return 1;//写入数据成功,返回1 ,用来判断是否成功写入数据}//################################################################### /*I2C总线单字节读取*/unsigned char twi_read(unsigned char addr){unsigned char Receive_Byte;TWBR=2;//设定波特率/*start 启动*/IIC_Start(); //硬件发送START信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作IIC_Wait(); //等待发送START完成 TWINT位置位if ((TWSR & 0xF8) != 0x08) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0/*SLA_W 芯片地址*/TWDR = EEPROM_BUS_ADDRESS; //芯片地址 0xA0 ,赋值给数据寄存器 TWDR ,等待发送TWCR=(1<<TWINT)|(1<<TWEN); //对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送 TWDR寄存器中的数据IIC_Wait(); //等待数据发送完毕 TWINT重新置位if ((TWSR & 0xF8) != 0x18) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0/*addr 操作地址*/TWDR=addr;//将写入数据的绝对地址,赋值给数据寄存器 TWDR ,等待发送TWCR=(1<<TWINT)|(1<<TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送 TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕 TWINT重新置位if ((TWSR & 0xF8) != 0x28) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回0/*restart 重启动*/IIC_Start();//硬件发送 RESTART 信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作IIC_Wait();//等待数据发送完毕 TWINT重新置位if((TWSR&0xF8)!=0x10) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回0/*SLA_R 芯片地址*/TWDR = 0xA1; //芯片地址 0xA0 并注明是读取操作(最后一位为1),赋值给数据寄存器 TWDR ,等待发送TWCR=(1<<TWINT)|(1<< TWEN);//对控制寄存器TWCR的TWINT位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕TWINT重新置位if((TWSR&0xF8)!=0x40) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回0/*读取数据*/TWCR=(1<<TWINT)|(1<<TWEN);//对控制寄存器TWCR的TWINT位软件写1进行清零,然后使能TWI硬件接口,让TWI进行工作,发送TWDR寄存器中的数据IIC_Wait();//等待数据发送完毕TWINT重新置位if((TWSR&0xF8)!=0x58) return 0; //检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回0Receive_Byte = TWDR; //读取到的数据放到局部变量里/*stop 停止*/IIC_Stop();//数据传输完成,发送STOP信号,释放对总线的控制return Receive_Byte; //将读取到的数据作为函数的输出}//################################################################### /*主函数*/void main(void){uchar c,d;Uart_Init();//串口初始化delay_us(20);Uart_Transmit(0x55); //测试串口c = twi_write(0x51,0xf8); //在地址0x51里写入数据0x22Uart_Transmit(c); //将返回值发送到串口测试是否写入成功delay_ms(2);d = twi_read(0x51); //将地址0x51里的数据读出来Uart_Transmit(d); //将读取到的数据发送串口while(1);}。
