基于USB2.0的TMS320VC5402 HPI自举
时间:11-25
来源:互联网
点击:
软件设计
DSP应用程序设计
实现TMS320VC5402 HPI自举的前提是生成DSP应用程序的分段Hex代码文件,在CCS中可用汇编语言,C语言等编写应用程序源代码,经汇编、链接、编译后,生成可执行的公共目标文件格式(COFF)的文件,COFF文件不能用于HPI自举引导,而需要利用TI公司的文件格式转换工具hex00.exe,将COFF文件转换为Hex格式文件。格式转换的关键是正确编写Hex命令文件,下面讨论如何编写这种命令文件,例如将包含text段的源程序链接、编译生成test.out文件,编写命令文件时,可利用hex500.exe将test.out转换为对应text段的Hex文件,命令文件test为.cmd如下:
-i //生成Intel格式
test.out //输入文件
ROMS
{
PAGE 0:ROM1:org=0x2000,Length=0x2000,romwidth=16,memwidth=16,
files={test1.hex} //text段的起始地址为0x2000
} //如有多端就可增加多个ROM SECTIONS
{text:paddr=0x2000} //如有多端就可增加多个部分
在DOS环境下,利用hex500.exe转换命令文件test.cmd,就可得到test1.hex文件,通过CY7C68013把test1.hex文件写入DSP内部RAM,再把程序的入口地址写入0x7F处,便可完成自举。
USB固件程序设计
Cypress公司提供有USB的辅助开发工具:EZ-USB Control Panel,GPIF Designer。通过GPIF Designer可以生成GPIF波形图及相应的C源代码gpif.c。Cypress公司同时提供了固件程序框架,因而可把gpif.c加入固件程序框架进行开发,从而提高开发效率。本方案中,固件程序设计的重点是对GPIF的编程,以便生成符合HPI接口的时序的波形描述代码,以用于控制数据传输,HPI自举需要的GPIF控制波形描述符为:单字节写(两种),FIFO写。HPIA、HPIC的初始化需要单字节写控制时序,程序代码写入HPID需要FIFO写控制时序,若要实现二者的数据通信,还需要单字节读、FIFO读等控制波形描述符。
HPIC、HPIA的初始值是在EZUSB Control Panel中通过制造商请求工具栏由EP0发送的,固件程序中还要有相应的请求处理程序,以完成具体的设置,如假定HPIC请求类型的ID为0xB6.HPIC=0x0101(BOB位为1),则请求工具栏的具体参数应为:Req=0xB6,Value=0x0000,Index=0xBEEF,Length=2,Dir=0,Hex Bytes=0101,固件中应加入的请求处理程序为:
case 0xB6:
{EPOBCL=0; //EP0使能
while(EP01STAT&bmEP0BSY); //等待EPO数据接收完毕
while(!HPI_RDY); //等待HPI处理完毕
IOA=0x00; //选择HPIC寄存器
GPIFWFSELECT=0x1E; //选择写低字节的单字节写控制波形
while(!(GPIFTRIG&0x80))
{;}
XGPIFSGLDATLX=EP0BUF[0]; //写低字节数据
GPIFWFSELECT=0x4E; //选择写高字节的单字节写控制波形
while(!(GPIFTRIG&0x80))
{;}
XGPIFSGLDATALX=EP0BUF;//写高字节数据
break;}
设置程序下载的首地址(HPIA值)的请求处理程序与设置HPIC的程序基本相同,只需按照请求类型的ID,来改变访问寄存器的地址即可,访问HPIA时,HCNTL[1:0]=10b,即IOA=0x08。
访问HPID下载程序数据时,可采用大端点EP2自动打包方式(AUTOIN=1),即将数据发送到端点后,自动传到FIFO中,等待写HPID条件具备,再启动GPIF,以将程序数据写入HPID,访问HPDI可采用地址自动增加模式(HCNTL[1:0]=01b),写数据前,地址自动加1,这样,数据便可以经过DSP内部DMA自动写入内部RAM,写HPID的程序如下:
if(GPIFTRIG&0x80) //GPIF接口是否处于空闲状态
{if(!(EP24FIFOELGS&0x02)) //自动向量是否可以访问EP2FIFO中数据
{IOA=0x04; //选择HPID寄存器,且访问时地址自动增加
while(!HPI_RDY); //等待HPI处理完毕
SYNCDELAY;
GPIFTCB1=EP2FIFOBCH; //写入的字节数
SYNCDELAY;
GPIFTCB0=EP2FIFOBCL;
SYNCDELAY;
GPIFTRIG=GPIF_EP2; //启动写数据
SYNCDELAY;
While(!(GPIFTRIG&0x80) //等待写入完毕
{;}
SYNCDELAY;}}
这样程序数据就可以分段通过端点2写入DSP内部RAM,最后再把入口地址写入0x7F,以完成HPI自举,值得注意的是,采用此种方式访问HPID时,写入HPIA的初值为程序入口的一个地址,例如,写test1.hex时,应设定HPIA=0x1fff。
为缩短开发周期,本设计采用开发包中通用驱动(ezusb.sys)和EZUSB Control Panel进行开发、调试、也可以对通用驱动、控制面板的源程序在VC++环境(需要DDK的支持)下进行二次开发,以便编译出开发者满意的驱动程序和上位机程序。
DSP应用程序设计
实现TMS320VC5402 HPI自举的前提是生成DSP应用程序的分段Hex代码文件,在CCS中可用汇编语言,C语言等编写应用程序源代码,经汇编、链接、编译后,生成可执行的公共目标文件格式(COFF)的文件,COFF文件不能用于HPI自举引导,而需要利用TI公司的文件格式转换工具hex00.exe,将COFF文件转换为Hex格式文件。格式转换的关键是正确编写Hex命令文件,下面讨论如何编写这种命令文件,例如将包含text段的源程序链接、编译生成test.out文件,编写命令文件时,可利用hex500.exe将test.out转换为对应text段的Hex文件,命令文件test为.cmd如下:
-i //生成Intel格式
test.out //输入文件
ROMS
{
PAGE 0:ROM1:org=0x2000,Length=0x2000,romwidth=16,memwidth=16,
files={test1.hex} //text段的起始地址为0x2000
} //如有多端就可增加多个ROM SECTIONS
{text:paddr=0x2000} //如有多端就可增加多个部分
在DOS环境下,利用hex500.exe转换命令文件test.cmd,就可得到test1.hex文件,通过CY7C68013把test1.hex文件写入DSP内部RAM,再把程序的入口地址写入0x7F处,便可完成自举。
USB固件程序设计
Cypress公司提供有USB的辅助开发工具:EZ-USB Control Panel,GPIF Designer。通过GPIF Designer可以生成GPIF波形图及相应的C源代码gpif.c。Cypress公司同时提供了固件程序框架,因而可把gpif.c加入固件程序框架进行开发,从而提高开发效率。本方案中,固件程序设计的重点是对GPIF的编程,以便生成符合HPI接口的时序的波形描述代码,以用于控制数据传输,HPI自举需要的GPIF控制波形描述符为:单字节写(两种),FIFO写。HPIA、HPIC的初始化需要单字节写控制时序,程序代码写入HPID需要FIFO写控制时序,若要实现二者的数据通信,还需要单字节读、FIFO读等控制波形描述符。
HPIC、HPIA的初始值是在EZUSB Control Panel中通过制造商请求工具栏由EP0发送的,固件程序中还要有相应的请求处理程序,以完成具体的设置,如假定HPIC请求类型的ID为0xB6.HPIC=0x0101(BOB位为1),则请求工具栏的具体参数应为:Req=0xB6,Value=0x0000,Index=0xBEEF,Length=2,Dir=0,Hex Bytes=0101,固件中应加入的请求处理程序为:
case 0xB6:
{EPOBCL=0; //EP0使能
while(EP01STAT&bmEP0BSY); //等待EPO数据接收完毕
while(!HPI_RDY); //等待HPI处理完毕
IOA=0x00; //选择HPIC寄存器
GPIFWFSELECT=0x1E; //选择写低字节的单字节写控制波形
while(!(GPIFTRIG&0x80))
{;}
XGPIFSGLDATLX=EP0BUF[0]; //写低字节数据
GPIFWFSELECT=0x4E; //选择写高字节的单字节写控制波形
while(!(GPIFTRIG&0x80))
{;}
XGPIFSGLDATALX=EP0BUF;//写高字节数据
break;}
设置程序下载的首地址(HPIA值)的请求处理程序与设置HPIC的程序基本相同,只需按照请求类型的ID,来改变访问寄存器的地址即可,访问HPIA时,HCNTL[1:0]=10b,即IOA=0x08。
访问HPID下载程序数据时,可采用大端点EP2自动打包方式(AUTOIN=1),即将数据发送到端点后,自动传到FIFO中,等待写HPID条件具备,再启动GPIF,以将程序数据写入HPID,访问HPDI可采用地址自动增加模式(HCNTL[1:0]=01b),写数据前,地址自动加1,这样,数据便可以经过DSP内部DMA自动写入内部RAM,写HPID的程序如下:
if(GPIFTRIG&0x80) //GPIF接口是否处于空闲状态
{if(!(EP24FIFOELGS&0x02)) //自动向量是否可以访问EP2FIFO中数据
{IOA=0x04; //选择HPID寄存器,且访问时地址自动增加
while(!HPI_RDY); //等待HPI处理完毕
SYNCDELAY;
GPIFTCB1=EP2FIFOBCH; //写入的字节数
SYNCDELAY;
GPIFTCB0=EP2FIFOBCL;
SYNCDELAY;
GPIFTRIG=GPIF_EP2; //启动写数据
SYNCDELAY;
While(!(GPIFTRIG&0x80) //等待写入完毕
{;}
SYNCDELAY;}}
这样程序数据就可以分段通过端点2写入DSP内部RAM,最后再把入口地址写入0x7F,以完成HPI自举,值得注意的是,采用此种方式访问HPID时,写入HPIA的初值为程序入口的一个地址,例如,写test1.hex时,应设定HPIA=0x1fff。
为缩短开发周期,本设计采用开发包中通用驱动(ezusb.sys)和EZUSB Control Panel进行开发、调试、也可以对通用驱动、控制面板的源程序在VC++环境(需要DDK的支持)下进行二次开发,以便编译出开发者满意的驱动程序和上位机程序。
DSP 单片机 嵌入式 USB 总线 收发器 PIC 电路 C语言 Cypress 相关文章:
- F1aSh存储器在TMS320C3X系统中的应用(11-11)
- 基于PIC18F系列单片机的嵌入式系统设计(11-19)
- DSP在卫星测控多波束系统中的应用(01-25)
- 基于PCI总线的双DSP系统及WDM驱动程序设计(01-26)
- 利用Virtex-5 FPGA实现更高性能的方法(03-08)
- DSP与单片机通信的多种方案设计(03-08)