通过IIC总线实现ATmega88的在线编程
点击数:7615 次 录入时间:03-04 11:50:32 整理:http://www.55dianzi.com 仪器仪表读写器
由于用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接口函数实现。

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总线实现ATmega88微控制器在应用编程的方法,包括Bootloader程序、I2C总线的PC串口模拟、上位机程序及相关的通信协议。该方法应用于四旋翼飞行器的无感无刷直流电机驱动板,成功通过I2C总线实现了4个ATmega88微控制器的在线调试与升级。该方法经过少量针对具体微控制器的代码修改后也可用于其他AVR系列微控制器的在应用编程。
上一页 [1] [2]
本文关键字:在线 仪器仪表读写器,电子知识资料 - 仪器仪表读写器