编辑: jingluoshutong 2019-11-22
―246― 基于 USB 设备的 COP 复位处理方法 曹振华,王宜怀,葛强(苏州大学计算机科学与技术学院,苏州 215006) 摘要:嵌入式系统中引入 COP 能保证系统能从故障点自动恢复正常运行.

COP 复位后采用简单的内存恢复方法即可使系统恢复正常运 行,但不适用于带有 USB 等特殊模块的系统.研究 USB 模块运行机制,设计带有 USB 模块的数据采集系统,提出一种基于寄存器恢复的 COP 复位处理方法,该方法能有效解决带有类似特殊模块的系统的 COP 复位问题. 关键词:通用串行总线协议 1.0;

系统正常操作监视模块;

JB8 单片机 COP Reset Processing Method Based on USB Device CAO Zhen-hua, WANG Yi-huai, GE Qiang (School of Computer Science and Technology, Soochow University, Suzhou 215006) 【Abstract】The introduction of Computer Operating Properly(COP) in embedded system can guarantee the normal operation of system, and automatically come back to the normal operation from failure. It does not require special treatment or only to use simple memory recovery after COP reset will be able to bring the system back to the normal running. If system includes some special module such as USB module, the above methods can not work. Take a data acquisition system as a example, the failure mechanism about USB module are discussed, and a countermeasures based on register recovery is given, which can effectively rescue system'

s similar paralys after COP reset. 【Key words】USB1.0;

Computer Operating Properly(COP);

JB8 MCU 计算机工程Computer Engineering 第35 卷第10 期Vol.35 No.10

2009 年5月May

2009 ・开发研究与设计技术・ 文章编号:1000―3428(2009)10―0246―02 文献标识码:A 中图分类号:TP311.52 COP(Computer Operating Properly),俗称看门狗,是一种 能保证系统从故障恢复点自动转入到正常运行轨道上来的机 制[1] .理论上只要单片机方程序都是自己的主动行为,系统 经过 COP 复位重新初始化后都可以正常工作. 但在含有特殊 模块(如USB 模块)的系统中,由于在模块中含有不能完全由 自己设定的参数和信息, 很难保证系统在 COP 复位后仍能正 常运行,因此,在COP 复位前后一定要对这些特殊模块的寄 存器进行专门的保护和设置.本文以

1 个包含 JB8 USB 模块 的数据采集系统为例,分析 USB 模块在 COP 复位后不能正 常工作的原因,并给出解决类似问题的思路和方法.

1 JB8 USB 模块及 COP 模块 JB8 单片机是飞思卡尔半导体公司生产的一款高性能低 价位单片机.除了内部集成 USB1.0 模块、COP 模块以外, 片内还集成了少量通用模块和 I/O 资源,便于用户的快速开 发[2-3] .JB8 单片机被普遍用于数据传输量较大的嵌入式产品 设计中.USB 技术的应用日渐增多,己得到了

450 多家技术 公司组成的技术联盟的支持[4] .它的高速性、稳定性、支持 即插即用、热插拔等优良特性,以及通信领域中依赖的串口 的市场淡出趋势, 无疑使 USB 会在不远的将来成为嵌入式领 域的标准接口之一. 本文设计一种基于 JB8 单片机的数据采集系统,利用 USB 接口与高端 PC 进行数据通信.在硬件设计中,JB8 单 片机通过 USB 电缆由 PC 机提供工作电源, 因此当 USB 设备 进行插拔时, 整个数据采集系统会掉电. 由于没有考虑到 USB 模块的特殊性,因此引入 COP 功能后未对 COP 复位进行特 殊处理. 系统运行中有时会提示读取不到 USB 设备描述符和 设备号,无法再继续通信,操作系统并不提示发现无法识别 的USB 设备,但冷复位之后系统会再次正常运行.

2 USB 模块在 COP 复位后出现的故障分析 为解决上述问题, 首先要理解 USB 工作过程中, 与USB 模块描述符等信息配置相关的高低两端之间的交互过程. 2.1 USB 模块信息配置过程 系统在 COP 复位后不能正常工作, 但冷复位后能正常工 作,而2种复位的最大区别在于 COP 复位系统不掉电,并且 内存信息不会丢失.USB 设备插到 PC 机USB 总线上以后, 相当于冷复位,高端 PC 机依靠其操作系统的定时检测机制, 能及时发现有 USB 设备已经插入到了 USB 总线上[5] ,然后 由高端 PC 操作系统主动发起 USB 设备的设备列举,此列举 是通过多次 USB 中断与低端 MCU 交互完成的,PC 端操作 系统首先通过硬件默认的地址 0x00 与低端 MCU 交互,索取 USB 设备的设备描述符、设备号等相关信息,并在设置的过 程中分配给每个已经检测到的 USB 设备一个独立的地址来 区分不同的 USB 设备.低端 MCU 方接收到高端分配的这个 地址后,会将自己的默认的

7 位地址 0x00 改成这个新地址, 保存在寄存器中,高端 PC 操作系统也会把这些信息保存到 自己的设备表中,高低端之间即可进行数据通信. PC 机的 USB 总线上没有 USB 设备进行插拔时,操作系 统的定时检测机制检测不到所连接设备的变化,不会使自己 重新进行设备列举, 仍使用设备表中的设备信息(包括设备地 基金项目:国家科技部技术创新基金资助项目(04C2262232200503) 作者简介:曹振华(1980-),男,硕士研究生,主研方向:嵌入式应 用技术;

王宜怀,博士;

葛强,硕士研究生 收稿日期:2008-09-17 E-mail:[email protected] ―247― 址等)进行通信. 2.2 COP 复位后出现故障的原因分析 通过对寄存器配置过程的分析可知, 系统进行冷复位时, 高端 PC 的操作系统能检测到设备变动并进行设备列举,在 此后的数据通信中高低端都是用的最新的设备信息进行通信 的,所以系统能正常工作[6] .系统发生 COP 复位时,PC 操 作系统不会重新进行设备列举,操作系统维护的设备表也就 得不到更新.因此,操作系统与低端 MCU 数据通信时,仍 用这张没有更新过的表中的参数进行通信. 但由于低端 MCU 已经进行了 COP 复位,MCU 中USB 模块的参数(如地址寄 存器等)都已经变成了硬件默认的参数了(USB 模块相关寄存 器请参考 JB8 芯片手册). 因此高低端通信用到的参数就出现 了不一致的的现象.高端向某一低端设备索取设备描述符等 信息时,由于 PC 机操作系统的设备表中的这个设备信息已 没有低端设备信息与其对应,因此无法获取相关的信息,从 而出现上文提到的未能获得设备描述符等提示错误.但由于 不是在设备列举时发现的错误,因此并不报告无法识别的 USB 设备.

3 USB 模块在 COP 复位后的处理方法 利用热复位内存中的数据不会丢失(除了被覆盖的部分) 这种特性, 可以把系统正常运行时 USB 模块相关的数据保存 在热复位后不会被程序覆盖的特定内存区域内,热复位后, 再将记录在内存中的相关信息回复到相应的寄存器中,从而 解决热复位前后参数不一致的问题. 3.1 寄存器数据的保存 参考 JB8 芯片手册可知,USB 模块有

10 个相关寄存器, 其中状态寄存器不能人为干预, 数据寄存器与通信参数无关, 因此只需要记录和恢复其中的

8 个寄存器的值即可保证一致 性.在内存中开辟

8 个字节的临时变量结构体保存这些寄存 器在正常工作时的值,结构体定义代码如下: struct USB_reg {INT8U UCR0_reg;

//保存 UCR0 的值 INT8U UCR1_reg;

//保存 UCR1 的值 … INT8U UIR2_reg;

//保存 UIR2 的值 INT8U UADDR_reg;

//保存 UADDR 的值};

USB 模块相关信息的设置和修改的地方有

2 个: (1)进行 USB 模块初始化时设置的部分基本信息. (2)主程序初始化完 毕并开放总中断后,在相应高端 PC 操作系统的设备列举的 中断处理程序中设置的信息.按时间的先后可推断,在高端 PC 操作系统的设备列举完成时,即低端 MCU 退出中断时的 寄存器的值就是能保证系统能正常工作的数据.因此,可将 保存寄存器值的操作放到中断处理程序中 asm( cli );

语句 前,程序代码如下: //将8个USB 寄存器值保存到 USB_reg 中,此语句放在与高端 //交互的 USB 中断处理函数中. USB_reg->

UCR0_reg=UCR0;

//保存 UCR0 的值到 USB_reg 中USB_reg->

UCR1_reg=UCR1;

//保存 UCR1 的值到 USB_reg 中…USB_reg->

UIR2_reg=UIR2;

//保存 UIR2 的值到 USB_reg 中USB_reg->

UADDR_reg=UADDR;

// 保存UADDR 的值到//USB_reg 中asm( cli );

3.2 寄存器数据的恢复 为正确处理 COP 复位,可在主程序之前加一个 COP 复 位判断和热复位处理程序, 加入了 COP 复位处理程序后的软 件流程如图

1 所示. 图1加COP 复位处理程序后的软件流程 可将恢复 USB 寄存器值的语句封装成一个子函数 USB_ Recover,在主程序中如果判断是 COP 复位,除了进行一般 模块的初始化以外,在系统初始化过程中开放总中断之前, 只要调用 USB_Recover 程序恢复 USB 模块寄存器的值,即 可保证 USB 模块 COP 在复位前后参数的一致性.USB_ Recover 子函数实现代码如下: //功能:恢复

8 个USB 寄存器值 void USB_R........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题