一种基于USB的通用无线传输接口设计
发布时间:2008/5/29 0:00:00 访问次数:537
摘 要:本文介绍了一种基于微处理器lpc2210的usb接口的设计,并使用射频收发芯片nrf2401设计了usb接口的无线通信模块。阐述了该系统的工作原理、硬件构成及软件设计方案。实现了基于usb接口的无线串行通信。
关键词:lpc2210;usb;nrf2401;cy7c63231
引言
usb为usb设备与usb主机之间大量的数据传输提供了高速、可靠的传输协议。而射频通信以其优点也应用在越来越多的场合,本文所设计的usb无线串行接口电路由nrf2401单片射频收发器、lpc2210微控制器和usb接口芯片组成。本系统充分利用usb的数据传输功能,设备连接方便,系统可用于进行无线串行数据双向传输,可在仪器仪表、计算机遥测/遥控、家庭网络等系统中应用。
硬件设计
整个硬件电路设计可以分为两个部分: 使用带并行总线的usb接口器件pdiusbd12 设计lpc2210的usb接口;使用cypress公司的usb外围控制芯片cy7c63231设计射频芯片nrf2401的usb接口。两个部分通过usb口相接。
采用philips公司的并行usb接口芯片 pdlusbdl2,符合usb1.1版本规范。 这里以lpc2210微控制器与pdiusbd12构成usb设备。
pdiusbd12使用lpc2210外部存储控制的bank2部分,其地址如下:数据地址 0x82000000,命令地址 0x82000001。rst_usb、susp为lpc2210输出引脚,pdiusbd12中断信号为中断输入信号,且为外部中断0。c1、c2和x1为pdiusbd12提供工作所需的时钟输入;发光二极管goodlink在正常通信时闪烁;pdiusbd12的ad0连接到lpc2210的a0。当lpc2210在a0引脚输出1时,表示输出到pdiusbd12数据总线d0 ~ d7上的数据为命令字,当a0引脚输出0时,表示输出到pdiusbd12数据总线d0 ~ d7的数据为数据字。
表1? usb驱动程序软件包6个api函数
cy7c63231是8位risc微处理器,特别适用于usb嵌入式设计,工作电压是5v。nrf2401是单片射频收发芯片,工作模式有4种:收发模式、配置模式、空闲模式和关机模式。所有配置工作,工作模式选择和收发数据都通过用电压调整芯片lp2980im5-3.3产生nrf2401的工作电压3.3v,同时,sn74lvc4245可实现控制口3.3v和5v的电平转换,使工作在不同电压水平的这两种芯片正常连接。
软件设计
pdiusbd12驱动软件构架
为了增强驱动软件的可移植性,且容易维护,采用分层的方法编写pdiusbd12的驱动程序。在lpc2210应用?c/os-ii操作系统的基础上综合考虑usb协议、pdiusbd12硬件接线、?c/os-ii的结构来组织驱动软件的构架,图4所示为usb驱动程序软件分层结构。
usb驱动程序软件包提供给用户6个api函数,这6个函数都在usb应用层中定义。这6个函数如表1所示。????
下面以接收和发送数据任务为例来说明怎样使用表1的api函数,例子演示了一个任务,从端点2发送1024个字节。部分源代码如下:
#define rw_nums 1024 //任务收发数据字节数
void taskrec1(void *pdata)
{ #if? os_critical_method == 3? /* allocate storage for cpu status register */
os_cpu_sr cpu_sr;
#endif
int8u buff[rw_nums]; //接收及发送缓冲区
int8u ack = 0x01; //应答主机数值
int8u err; //函数返回值
pdata = pdata;? /* prevent compiler warning */
for (;;){
ossempend(taskrec1_sem,0,&err);??? //等待taskstart的命令
err = writeport1(1,&ack,200);????????? //应答usb主机
if (err == usb_no_err){??????????
?//应答正确
err = readport2(rw_nums, buff,200);? //接收数据
ostimedly(1);????????????????????
//延时一个时钟周期
if (err == usb_no_err){??????????
?//接收正确
buff[0] = ospriocur;???????????????
//标识该任务
err = writeport2(rw_nums, buff,200); //发送数据
?????????????????????????? }
?????????????????????????? }
???????? }
}
cy7c63231软件设计
usb外围控制器cy7c63231控制nrf2401,同时与lpc2210的usb口相连,实现无线数据的接收和发送。nrf2401可以接收两个频段的数据,以接收无线数据为例,cy7c63231的程序主要分为:主程序usbtaskloop,它是一个无限循环,仅仅在中断的时候跳出,程序检测nrf2401的dr1和dr2引脚,当dr1上的电平为高时,产生中断,跳到receivech1子程序,当dr2上的电平为高时,产生中断,跳到receivech2子程序;usbsend程序负责从端口1向上位机发送数据;waitforack程序等待上位机对端口1的应答信号;receivech1和receivech2程序分别从nrf2401的通道1和通道2接收数据,最后调用dataout,把数据传给上位机;dataout程序将接收到的字节发送给上位机,然后调用waitforack;prg2401程序段负责对nrf2401进行操作控制,能够通过设置不同的参数使nrf2401工作在三种不同的工作模式。限于篇幅,该部分的程序源代码不在此详述。
结语
本系统采用32 位嵌入式微处理器
摘 要:本文介绍了一种基于微处理器lpc2210的usb接口的设计,并使用射频收发芯片nrf2401设计了usb接口的无线通信模块。阐述了该系统的工作原理、硬件构成及软件设计方案。实现了基于usb接口的无线串行通信。
关键词:lpc2210;usb;nrf2401;cy7c63231
引言
usb为usb设备与usb主机之间大量的数据传输提供了高速、可靠的传输协议。而射频通信以其优点也应用在越来越多的场合,本文所设计的usb无线串行接口电路由nrf2401单片射频收发器、lpc2210微控制器和usb接口芯片组成。本系统充分利用usb的数据传输功能,设备连接方便,系统可用于进行无线串行数据双向传输,可在仪器仪表、计算机遥测/遥控、家庭网络等系统中应用。
硬件设计
整个硬件电路设计可以分为两个部分: 使用带并行总线的usb接口器件pdiusbd12 设计lpc2210的usb接口;使用cypress公司的usb外围控制芯片cy7c63231设计射频芯片nrf2401的usb接口。两个部分通过usb口相接。
采用philips公司的并行usb接口芯片 pdlusbdl2,符合usb1.1版本规范。 这里以lpc2210微控制器与pdiusbd12构成usb设备。
pdiusbd12使用lpc2210外部存储控制的bank2部分,其地址如下:数据地址 0x82000000,命令地址 0x82000001。rst_usb、susp为lpc2210输出引脚,pdiusbd12中断信号为中断输入信号,且为外部中断0。c1、c2和x1为pdiusbd12提供工作所需的时钟输入;发光二极管goodlink在正常通信时闪烁;pdiusbd12的ad0连接到lpc2210的a0。当lpc2210在a0引脚输出1时,表示输出到pdiusbd12数据总线d0 ~ d7上的数据为命令字,当a0引脚输出0时,表示输出到pdiusbd12数据总线d0 ~ d7的数据为数据字。
表1? usb驱动程序软件包6个api函数
cy7c63231是8位risc微处理器,特别适用于usb嵌入式设计,工作电压是5v。nrf2401是单片射频收发芯片,工作模式有4种:收发模式、配置模式、空闲模式和关机模式。所有配置工作,工作模式选择和收发数据都通过用电压调整芯片lp2980im5-3.3产生nrf2401的工作电压3.3v,同时,sn74lvc4245可实现控制口3.3v和5v的电平转换,使工作在不同电压水平的这两种芯片正常连接。
软件设计
pdiusbd12驱动软件构架
为了增强驱动软件的可移植性,且容易维护,采用分层的方法编写pdiusbd12的驱动程序。在lpc2210应用?c/os-ii操作系统的基础上综合考虑usb协议、pdiusbd12硬件接线、?c/os-ii的结构来组织驱动软件的构架,图4所示为usb驱动程序软件分层结构。
usb驱动程序软件包提供给用户6个api函数,这6个函数都在usb应用层中定义。这6个函数如表1所示。????
下面以接收和发送数据任务为例来说明怎样使用表1的api函数,例子演示了一个任务,从端点2发送1024个字节。部分源代码如下:
#define rw_nums 1024 //任务收发数据字节数
void taskrec1(void *pdata)
{ #if? os_critical_method == 3? /* allocate storage for cpu status register */
os_cpu_sr cpu_sr;
#endif
int8u buff[rw_nums]; //接收及发送缓冲区
int8u ack = 0x01; //应答主机数值
int8u err; //函数返回值
pdata = pdata;? /* prevent compiler warning */
for (;;){
ossempend(taskrec1_sem,0,&err);??? //等待taskstart的命令
err = writeport1(1,&ack,200);????????? //应答usb主机
if (err == usb_no_err){??????????
?//应答正确
err = readport2(rw_nums, buff,200);? //接收数据
ostimedly(1);????????????????????
//延时一个时钟周期
if (err == usb_no_err){??????????
?//接收正确
buff[0] = ospriocur;???????????????
//标识该任务
err = writeport2(rw_nums, buff,200); //发送数据
?????????????????????????? }
?????????????????????????? }
???????? }
}
cy7c63231软件设计
usb外围控制器cy7c63231控制nrf2401,同时与lpc2210的usb口相连,实现无线数据的接收和发送。nrf2401可以接收两个频段的数据,以接收无线数据为例,cy7c63231的程序主要分为:主程序usbtaskloop,它是一个无限循环,仅仅在中断的时候跳出,程序检测nrf2401的dr1和dr2引脚,当dr1上的电平为高时,产生中断,跳到receivech1子程序,当dr2上的电平为高时,产生中断,跳到receivech2子程序;usbsend程序负责从端口1向上位机发送数据;waitforack程序等待上位机对端口1的应答信号;receivech1和receivech2程序分别从nrf2401的通道1和通道2接收数据,最后调用dataout,把数据传给上位机;dataout程序将接收到的字节发送给上位机,然后调用waitforack;prg2401程序段负责对nrf2401进行操作控制,能够通过设置不同的参数使nrf2401工作在三种不同的工作模式。限于篇幅,该部分的程序源代码不在此详述。
结语
本系统采用32 位嵌入式微处理器