关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > 利用I2C总线实现ATmega88的在应用编程

利用I2C总线实现ATmega88的在应用编程

作者:时间:2012-12-05来源:网络收藏

2 PC端编程软件设计
2.1 Intel Hex文件格式
的目标程序代码是采用IntelHex文件格式保存的。Intel Hex文件包含了目标代码及相应的地址信息,这些实现必需的信息由PC机端的上位机程序提取,并重新以页面为单位装帧后发送给Bootloader便可实现Flash的编程。
Intel Hex文件格式将二进制的目标机器代码以ASCII码的文本形式记录,在文件中,每一行都是一个由十六进制机器码或数据常量组成的Hex记录。记录格式如表1所列。

本文引用地址:http://www.eepw.com.cn/article/159653.htm

d.JPG


每条Hex记录都是以“:”开头的,表1中所述的每个字节在记录中是由两个ASCII码表示的,这样的两个十六进制数为一个字节;长度表示的是记录中数据项的长度;地址为数据项在Flash中的起始地址;记录的类型总共有6种,分别为数据记录(00)、文件结束记录(01)、扩展段地址记录(01)、开始段地址记录(03)、扩展线性地址记录(04)、开始线性地址记录(05)。数据是与记录类型相对应的可变长度的数据组。校验字节计算如下:首先,将每条记录中除记录头和校验外所有ASCII码以2个ASCII码转换为1个字节的形式转换为二进制。然后计算上述二进制字节的累加和,最后将累加和的低字节取反加1即为校验字节。
ATmega88目标代码的Hex文件由数据记录和文件结束记录两种类型的记录构成。上位机程序在解析过程中以行为单位读取文件中的记录,并根据上述记录的格式进行解析,获得Flash每一页面的地址和相应的数据,遇到文件结束记录后则停止解析。
2.2 的PC机串口模拟
PC机端的编程软件是通过与ATmega88的Bootloader通信的,在微控制器中是广泛存在的,一般的微控制器都集成了I2C总线控制模块。但PC机基本没有I2C总线接口,需要专用的USB转I2C总线协议芯片或其他接口的I2C总线模块才能实现PC机与微控制器之间的I2C总线通信。这种方法成本高且实现麻烦,本文给出了一种利用PC机串口的握手信号模拟I2C总线的方法,相比专用协议转换芯片或模块的方法,这种方法更加简单、高效。为了实现PC机RS232串口与微控制器I2C总线的电平匹配,设计了如图2所示的接口电路。

a.JPG


图2中,PC机串口的RTS输出用来模拟I2C总线的SCI,时钟信号;DTR输出模拟I2C总线的SDA输出数据信号;CTS输入用于接收SDA输入数据。PC机串口的RS232的高电平为15 V,低电平为-15 V;I2C总线的高电平为+5 V,低电平为0 V。因此,将的握手信号转换成I2C总线信号时需要进行相应的电平转换,PC机串口RS232电平与I2C总线FTL电平之间的转换是由电阻R1、R2和5.1V稳压管D1、D2实现的。
当RTS输出+15 V高电平时,由于电阻和稳压管的作用,SCL端电平被稳定在+5.1 V;而当RTS输出-15 V低电平时,由于二极管D2导通,SCL电平被钳位在-0.7 V。这样,便实现了±15 V的RS232电平到0~5 V CMOS电平的转换;电阻同时也起着限流作用。DTR输出到SDA信号的电平转换也是同样的原理,而当SDA处于输入状态时,由于CMOS电平可以满足RS232电平的输入容限,因此无需进行电平转换。
由于用PC机串口模拟I2C总线时仅仅用到了串口的握手信号,而没有用到串口的波特率、数据长度、奇偶校验等设置功能及输入/输出缓冲区的管理功能,本文直接采用Windows提供的API函数实现串口编程。串口的打开和关闭分别采用CreateFile函数和CloseHandle函数实现。RTS和DTR信号高低电平的控制由EscapeCommFunction函数将串口作为文件操作实现,调用该函数后程序要有一定时间的延时以实现通信波特率的控制。CTS的电平状态则由GetCommModemStatus函数查询得到。
在实现了RTS、DTR的电平控制与CTS电平状态的获取后,借鉴单片机用I/O口模拟I2C总线的方法,可以通过控制RTS、DTR电平与查询CTS状态来模拟I2C总线。在总线的时序处理与读写操作方面,两种方法的唯一不同在于;用单片机I/O口模拟I2C总线时,I2C总线的SDA信号由输出模式转换到输入模式是通过将单片机I/O口从输出转换为输入实现的;由于串口握手信号无法实现双向通信,因此,SDA信号的输入功能是通过将DTR置高电平后读取CTS状态实现的,之所以将DTR置高电平是因为微控制器端的I2C总线的集电极开漏输出结构需要DTR置高后才能输出高电平,这类似于I2C总线上拉电阻的功能。
2.3 上位机程序设计
PC端上位机程序的主要功能为:解析应用程序的Hex格式文件,并从中提取Flash中每一页面的地址与数据信息;设置串口号与所需升级的ATmega88的I2C总线地址,利用串口的握手信号模拟I2C总线通信,将Hex文件中的程序代码准确无误地发送给相应地址的Bootloader以实现应用程序的在线更新。
根据上述功能设计了如图3所示的上位机程序界面,开发环境采用Borland C++builder 5.0,串口操作通过Windows API接口函数实现。

b.JPG


I2C总线通信的波特率设置为10 kbps,这是通过每次EscapeCommFunction函数调用后运行相应时间的延时函数实现的,这样也可以使RTS和DTR信号在改变电平后有足够的稳定时间。点击“烧录程序”按钮后,上位机程序通过I2C总线向相应地址的ATmega88发送复位命令,然后循环发送Flash第一页的数据帧;ATmega88接收到复位命令利用看门狗复位或人工上电复位后,跳转运行Bootloader程序,开始接收数据帧并对相应的Flash页面进行编程。Bootloader接收到一帧数据后将I2C总线拉低,使总线处于忙状态,此时上位机一直查询SDA状态直到SDA恢复高电平后再操作I2C总线,这样便实现了有效的通信流量控制。Bootloader对数据帧进行校验后对flag进行标记,上位机发送完数据帧等I2C总线空闲后,读取flag并根据其状态重发数据帧或发送下一帧数据,这样便实现了通信的差错控制,保证写入程序代码的正确性。所有Flash页面编程完毕后,上位机程序关闭串口,Bootloader在2 s内接收不到数据帧后,就能跳转去运行升级后的应用程序。

结语
本文给出了一套完整的利用I2C总线实现的方法,包括Bootloader程序、I2C总线的模拟、上位机程序及相关的通信协议。该方法应用于四旋翼飞行器的无感无刷直流电机驱动板,成功通过I2C总线实现了4个的在线调试与升级。该方法经过少量针对具体微控制器的代码修改后也可用于其他AVR系列微控制器的


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭