论文部分内容阅读
摘 要:在市场经济的今天,一个嵌入式产品的上市时间决定了该产品的价值。而数据下载是嵌入式产品调试的必经环节,这就要求有一种方便快速的数据下载方式。在自主设计的SoC数据下载电路系统的前提下,通过Cypress公司CY7C68013的GPIO提供了上位机数据源,实现了该系统的软件设计。
关键词:嵌入式系统 GPIO 数据下载
中图分类号:TP39 文献标识码:A 文章编号:1007-3973(2012)012-076-02
1引言
对于目前大多数使用ARM内核的嵌入式芯片都是使用JTAG的数据下载方式。而对于一些使用无JTAG的内核的芯片则数据的下载乃至调试都十分麻烦。在此,笔者针对内部通信使用AMBA总线协议的芯片设计了一个数据下载系统模块。由于USB协议有效快速的特点,通过USB单片机将在PC上编译的代码数据下载到SoC芯片中。
本文主要阐述USB单片机如何从PC主机接收到下载数据并将下载数据传输到SoC芯片中。
2CY7C68013芯片
由Cypress 公司推出的智能USB接口CY7C68013控制芯片,是第一款集成USB2.0协议的微控制器,支持12Mb/s 的全速传输和480Mbps的高速传输,可使用4种传输方式:控制传输、中断传输、块传输和同步传输;完全适用于USB2.0,并兼容USB1.1。CY7C68013 芯片包括l个8051 处理器、1个SIE、1个USB 收发器、8.5KB 片上RAM、4KBFIFO 内存以及l 个通用可程序设计界面(GPIF)。CY7C68013是全面集成的解决方案,占用电路板空间少,开发时间短。
Cypress 公司CY7C68013 提供给用户固件函数库Ezusb.lib 和固件框架。免去了用户自己编写一些通用性比较强、模式化的程序。如果不提供,则很难写出如此高效,结构紧凑的程序。实际上此框架和CY7C68013 的内部结构关系十分密切,如果没有足够的内部数据也不可能写得出来。在框架的基础上,用户只需在相应的地方写上相应的代码即可完成USB 的相关工作。图1为Cypress提供的固件框架的流程图。
首先设置所有内部状态,对芯片的寄存器进行初始化,然后调用用户初始化程TD_Init(),打开需要的中断,下面重新枚举USB设备,软件模拟断开连接,并重新连接到PC。在重新连接到PC之前,设置成由固件响应处理PC发送的USB请求。在重枚举之后进入一个循环的执行程序:(1)调用用户功能函数TD_Poll(),需要完成的用户功能代码在此处编写。(2)当端点0接受到USB命令时,调用任务处理函数SetupCommand()。(3)判断USB内核是否收到总线挂起事件,如果有的话调用用户终止函数Suspend()。接下来检测是否收到唤醒事件Resume,有两种方式进行唤醒,一是通过WAKEUP引脚,另一个是USB总线上检测到唤醒状态。如果检测到唤醒事件的话,调用用户函数TD_Resume()。
Cypress公司的开发包的Target文件夹下,提供了基本的USB固件开发的框架。这里提供了对各种USB请求、中断处理以及寄存器定义的封装。这些固件封装包括以下几个程序文件:
fw.c:USB固件程序的主文档,其中包含main()函数,以及一些任务调度、SETUP命令的处理等。
periph.c:其中包含了USB初始化和任务处理函数,在这里添加自己的任务代码。
dscr.a51:汇编档,包含了USB设备的各种描述符。
lp.h:头文件,包含EZ-USB的通用常量、宏、数据类型和库函数的原型。
lpregs.h:EZ-USB的寄存器声明和位标志定义。
syncdly.h:包含同步延时的宏定义,用于一些需要同步延时的寄存器。
EZUSB.lib:EZ-USB的库函数文件。
USBJMPTB.obj:提供了中断服务向量跳转表。
3下载系统中单片机固件设计
USB单片机设备的固件程序与PC端上位机通信完成如下功能:(1)检测USB单片机SoC芯片的连接;(2)控制SoC芯片进入数据下载状态;(3)通过PC端应用程序传输需下载的数据;(4)应用程序发出需读取地址信息,固件程序将读取的数据传送回PC;(5)应用程序控制SoC退出下载模式,重新启动,正常执行程序。
本设计中,检测SoC的连接状态;控制SoC芯片进入数据下载状态;控制SoC退出下载模式并重新启动;以及写入最后一个下载数据和读取最后两个数据此五项功能使用USB端点0进行通讯,为自定义设备请求命令,首先在lp.h中添加自定义设备请求。在fw.c中添加对自定义请求的回应。当收到PC发送过来的设置包时,会产生收到有效设置数据的中断,在中断函数ISR_Sudav()中,使GotSUB=1从而进入命令处理函数void SetupCommand(void),并且清除中断。在void SetupCommand(void)中,根据SETUPDAT[1]的值来鉴别不同的请求命令。在peirph.c文件中,分别为这五个请求DR_CheckConnect(),DR_EnterDownload(),DR_LastWrite(),DR_LastRead(),DR_ResetSoC()添加请求处理子程序的代码。
本设计的SoC硬件下载电路部分是根据JTAG协议发展变化而来,有效的利用了JTAG的思想实现了数据下载的目的。单片机与SoC芯片的连接图如图2所示。通过单片机的GPIO实现了对SoC的信号和数据传输。
首先在初始化的时候,配置I/O引脚E,低4个口为输出,输出信号TCK,TMS,TDI,TRST,高4为配置为输入,其中I/O引脚E的第5位设置为输入接收TDO。 当接收到SC_CheckConnect()命令时,读IOE.4口的状态,IOE.4口连接下拉电阻,在没有外部电路驱动时读IOE.4的值为0。SoC的TDO输出引脚接上拉电阻,在下载电路状态非shift-DR或者shift-IR时,SoC的TDO对应引脚为输入,引脚电平为高。当单片机和SoC连接后,单片机IOE.4的引脚电平为高。将读到的引脚状态通过EP0返回给PC,PC根据引脚的状态来确定SoC是否连接到单片机。
当接收到SC_EnterDownload()命令,首先单片机复位下载电路,使SoC下载电路进入确定的logic-reset状态,接着要使SoC进入数据下载状态,即使下载电路的指令寄存器为8’b10101110,在移入指令的同时,将捕获的固定指令值2’b10101010值返回给单片机。单片机将此值返回PC,PC检测返回的值判断确定是否进入下载状态,若没有收到正确的返回值,继续发送DR_EnterDownload(),当失败了5次后,在接口显示下载失败。
当接收SC_ResetSoC()命令时,向SoC发送PMU中软复位寄存器的地址,再发送写入数值0x1,具体控制总线进行总线上设备写操作的方法和下述下载数据方法雷同。
在用户函数TD_Poll()中执行核心的三个功能:(1)从PC通过USB接收将要下载到SoC中的下载数据,将这些数据通过GPIO,按制定的下载协议方式发送到SoC;(2)从PC通过USB接收将要读取的SoC的读取地址,将这些数据通过GPIO,按下载协议方式发送到SoC;(3)接收SoC移位出的TDO,选择出有效的存储地址的数据,并通过USB返回给PC。分别由下面三个函数和上述两个自定义命令函数来完成上述功能:
Void Send_wdata();
Void Send_raddr();
Void Return_rdata();
BOOL DR_LastWrite();
BOOL DR_LastRead();
这五个函数的运行由PC通过USB控制,需要下载到SoC中的数据PC先发送到端点2中,需要读取SoC的地址PC先发送到端点4中,端点6用返回PC要求读取的地址的数据。具体三个函数的触发是端点2,4中有来自PC的数据,PC已经读取端点6的数据现在端点6的EP6FIFOBUF为空可以放新的返回数据了。由于本设计独特的下载方式以及AMBA总线协议的要求,最后一个下载数据和最后两个地址数据的读取的命令由USB的端点0来接收,并通过 DR_LastWrite()和DR_LastRead()这两个函数来完成。
4结语
本文介绍了一个基于SoC的数据下载系统的固件设计方案。自主设计的下载模块针对所有内部使用AMBA总线通信的芯片都适用,体现了该下载系统的通用性。此外,系统没有使用另外的硬件(如CPLD)运用单片机GPIO实现了下载协议。
关键词:嵌入式系统 GPIO 数据下载
中图分类号:TP39 文献标识码:A 文章编号:1007-3973(2012)012-076-02
1引言
对于目前大多数使用ARM内核的嵌入式芯片都是使用JTAG的数据下载方式。而对于一些使用无JTAG的内核的芯片则数据的下载乃至调试都十分麻烦。在此,笔者针对内部通信使用AMBA总线协议的芯片设计了一个数据下载系统模块。由于USB协议有效快速的特点,通过USB单片机将在PC上编译的代码数据下载到SoC芯片中。
本文主要阐述USB单片机如何从PC主机接收到下载数据并将下载数据传输到SoC芯片中。
2CY7C68013芯片
由Cypress 公司推出的智能USB接口CY7C68013控制芯片,是第一款集成USB2.0协议的微控制器,支持12Mb/s 的全速传输和480Mbps的高速传输,可使用4种传输方式:控制传输、中断传输、块传输和同步传输;完全适用于USB2.0,并兼容USB1.1。CY7C68013 芯片包括l个8051 处理器、1个SIE、1个USB 收发器、8.5KB 片上RAM、4KBFIFO 内存以及l 个通用可程序设计界面(GPIF)。CY7C68013是全面集成的解决方案,占用电路板空间少,开发时间短。
Cypress 公司CY7C68013 提供给用户固件函数库Ezusb.lib 和固件框架。免去了用户自己编写一些通用性比较强、模式化的程序。如果不提供,则很难写出如此高效,结构紧凑的程序。实际上此框架和CY7C68013 的内部结构关系十分密切,如果没有足够的内部数据也不可能写得出来。在框架的基础上,用户只需在相应的地方写上相应的代码即可完成USB 的相关工作。图1为Cypress提供的固件框架的流程图。
首先设置所有内部状态,对芯片的寄存器进行初始化,然后调用用户初始化程TD_Init(),打开需要的中断,下面重新枚举USB设备,软件模拟断开连接,并重新连接到PC。在重新连接到PC之前,设置成由固件响应处理PC发送的USB请求。在重枚举之后进入一个循环的执行程序:(1)调用用户功能函数TD_Poll(),需要完成的用户功能代码在此处编写。(2)当端点0接受到USB命令时,调用任务处理函数SetupCommand()。(3)判断USB内核是否收到总线挂起事件,如果有的话调用用户终止函数Suspend()。接下来检测是否收到唤醒事件Resume,有两种方式进行唤醒,一是通过WAKEUP引脚,另一个是USB总线上检测到唤醒状态。如果检测到唤醒事件的话,调用用户函数TD_Resume()。
Cypress公司的开发包的Target文件夹下,提供了基本的USB固件开发的框架。这里提供了对各种USB请求、中断处理以及寄存器定义的封装。这些固件封装包括以下几个程序文件:
fw.c:USB固件程序的主文档,其中包含main()函数,以及一些任务调度、SETUP命令的处理等。
periph.c:其中包含了USB初始化和任务处理函数,在这里添加自己的任务代码。
dscr.a51:汇编档,包含了USB设备的各种描述符。
lp.h:头文件,包含EZ-USB的通用常量、宏、数据类型和库函数的原型。
lpregs.h:EZ-USB的寄存器声明和位标志定义。
syncdly.h:包含同步延时的宏定义,用于一些需要同步延时的寄存器。
EZUSB.lib:EZ-USB的库函数文件。
USBJMPTB.obj:提供了中断服务向量跳转表。
3下载系统中单片机固件设计
USB单片机设备的固件程序与PC端上位机通信完成如下功能:(1)检测USB单片机SoC芯片的连接;(2)控制SoC芯片进入数据下载状态;(3)通过PC端应用程序传输需下载的数据;(4)应用程序发出需读取地址信息,固件程序将读取的数据传送回PC;(5)应用程序控制SoC退出下载模式,重新启动,正常执行程序。
本设计中,检测SoC的连接状态;控制SoC芯片进入数据下载状态;控制SoC退出下载模式并重新启动;以及写入最后一个下载数据和读取最后两个数据此五项功能使用USB端点0进行通讯,为自定义设备请求命令,首先在lp.h中添加自定义设备请求。在fw.c中添加对自定义请求的回应。当收到PC发送过来的设置包时,会产生收到有效设置数据的中断,在中断函数ISR_Sudav()中,使GotSUB=1从而进入命令处理函数void SetupCommand(void),并且清除中断。在void SetupCommand(void)中,根据SETUPDAT[1]的值来鉴别不同的请求命令。在peirph.c文件中,分别为这五个请求DR_CheckConnect(),DR_EnterDownload(),DR_LastWrite(),DR_LastRead(),DR_ResetSoC()添加请求处理子程序的代码。
本设计的SoC硬件下载电路部分是根据JTAG协议发展变化而来,有效的利用了JTAG的思想实现了数据下载的目的。单片机与SoC芯片的连接图如图2所示。通过单片机的GPIO实现了对SoC的信号和数据传输。
首先在初始化的时候,配置I/O引脚E,低4个口为输出,输出信号TCK,TMS,TDI,TRST,高4为配置为输入,其中I/O引脚E的第5位设置为输入接收TDO。 当接收到SC_CheckConnect()命令时,读IOE.4口的状态,IOE.4口连接下拉电阻,在没有外部电路驱动时读IOE.4的值为0。SoC的TDO输出引脚接上拉电阻,在下载电路状态非shift-DR或者shift-IR时,SoC的TDO对应引脚为输入,引脚电平为高。当单片机和SoC连接后,单片机IOE.4的引脚电平为高。将读到的引脚状态通过EP0返回给PC,PC根据引脚的状态来确定SoC是否连接到单片机。
当接收到SC_EnterDownload()命令,首先单片机复位下载电路,使SoC下载电路进入确定的logic-reset状态,接着要使SoC进入数据下载状态,即使下载电路的指令寄存器为8’b10101110,在移入指令的同时,将捕获的固定指令值2’b10101010值返回给单片机。单片机将此值返回PC,PC检测返回的值判断确定是否进入下载状态,若没有收到正确的返回值,继续发送DR_EnterDownload(),当失败了5次后,在接口显示下载失败。
当接收SC_ResetSoC()命令时,向SoC发送PMU中软复位寄存器的地址,再发送写入数值0x1,具体控制总线进行总线上设备写操作的方法和下述下载数据方法雷同。
在用户函数TD_Poll()中执行核心的三个功能:(1)从PC通过USB接收将要下载到SoC中的下载数据,将这些数据通过GPIO,按制定的下载协议方式发送到SoC;(2)从PC通过USB接收将要读取的SoC的读取地址,将这些数据通过GPIO,按下载协议方式发送到SoC;(3)接收SoC移位出的TDO,选择出有效的存储地址的数据,并通过USB返回给PC。分别由下面三个函数和上述两个自定义命令函数来完成上述功能:
Void Send_wdata();
Void Send_raddr();
Void Return_rdata();
BOOL DR_LastWrite();
BOOL DR_LastRead();
这五个函数的运行由PC通过USB控制,需要下载到SoC中的数据PC先发送到端点2中,需要读取SoC的地址PC先发送到端点4中,端点6用返回PC要求读取的地址的数据。具体三个函数的触发是端点2,4中有来自PC的数据,PC已经读取端点6的数据现在端点6的EP6FIFOBUF为空可以放新的返回数据了。由于本设计独特的下载方式以及AMBA总线协议的要求,最后一个下载数据和最后两个地址数据的读取的命令由USB的端点0来接收,并通过 DR_LastWrite()和DR_LastRead()这两个函数来完成。
4结语
本文介绍了一个基于SoC的数据下载系统的固件设计方案。自主设计的下载模块针对所有内部使用AMBA总线通信的芯片都适用,体现了该下载系统的通用性。此外,系统没有使用另外的硬件(如CPLD)运用单片机GPIO实现了下载协议。