Upload
others
View
28
Download
0
Embed Size (px)
Citation preview
NetUSB-2401开发指南V3.0 作者:刘春伟 胡文明 翁建永
陈佳 高良 李凡 陈林波
NetUSB-2401模块是本公司自行研发的PC端无线数据收发
模块,其并配备CYPRESS公司的USB SLAVE芯片EZUSB_FX2LP68013
和射频芯片RF2401,以2.4Ghz(2400~2485Mhz)的无线频段进行
无线数据传输,并通过USB2.0协议同PC进行高速通信,保证了
高速通信质量,并且可以在无线通信协议上实现严格的数据校
验机制,保证数据的可靠通信。
NetUSB-2401 模块可进行本机地址和发送地址的配置(以
及2401全部寄存器的配置),实现多点PC和PC,PC和电子系统的
数据传输。只要PC上都配有本公司的NetUSB2401无线USB模块和
相应的应用软件,即可实现PC和PC间的无线数据传输,实现方
便,简单;若要实现PC和电子系统的数据传输,应该在电子系
统上配置本公司的RF2401模块,即可实现。
本文介绍了PC和电子系统的数据传输时,电子系统上应该配
备的RF2401模块的驱动函数。
一、模块介绍
NetUSB-2401
特点:
(1) 2.4Ghz 全球开放ISM 频段免许可证使用
(2) 最高工作速率1Mbps,高效GFSK 调制,抗干扰能力强,特
别适合工业控制场合
(3) 可以多点通信和跳频通信需要
(4) 内置硬件CRC 检错和点对多点通信地址控制
(5) 低功耗1.9 - 3.6V 工作,待机模式下状态仅为1uA
(6) 收发模式切换时间 < 200us
(7) 可软件设地址,只有收到本机地址时才会输出数据(提供
中断指示),可直接接各种单片机使用,软件编程非常方便
二、原理简介
NetUSB-2401采用了RF2401芯片进行无线传输,默认情况下,一
次传输的有效载荷数据包的大小为28 字节,地址宽度为2 字节, CRC
校验启用,CRC模式16位 (PAYLOAD +ADDR_W+CRC_L = 32 BYTES)。
这些默认参数可以通过pc端的NETUSB.DLL提供的API进行设置。
NetUSB2401为设备间通信提供一个基础环境。
三、驱动函数说明
本公司已经做好了非常方便移植的驱动头文件,只要在您的工
程中包含NRF2401.C文件,并在主函数中包含NRF2401.H头文件,即
可实现。
该驱动是以AT89C2051 单片机进行制作的,您只需修改
NRF2401.H和NRF2401.C文件中的部分代码,即可快速的实现不同微
处理器的移植工作,并且在NRF2401.H文件中已经做了详细的介绍,
这里,我们再做简单地介绍。
以下是可能需要修改的部分:
在NRF2401.H文件中:
1. 模块引脚接口定义部分,可自行修改引脚配置,但切记不要修改
宏定义的变量名。
2. 若想在 I/O口有方向寄存器的单片机 上进行移植,请定义I/O的
位的方向,并在NRF2401.C文件中相关地方去掉有关的方向设置
语句的注释符。
在NRF2401.C文件中:
1 TxAddress[] 数组,其存放了发送目标的地址,可进行修改其中
数值来选择发送目标。
2.定义本机地址部分,定义了本机的地址,可进行修改其中数值来
配置本机地址,但切 记不要修改宏定义的变量名
3 .600us 的延时函数,若您需要在其它微处理器上进行移植,则需
要修改该函数,实现600US的延时
以下是函数的声明:
1. Config2401 函数,其实现了初始化NRF2401,并配置好本机地址
等工作,在您的主函数开始时,需要调用一下
2. unsigned char nRF2401_RxPacket( unsigned char *RxBuf) 函
数,实现无线接收数据。RxBuf[]数组大小应为有效数据宽度
(DATA1_W),默认情况下,应为28字节。函数返回0,则代表没有数据
可以接收和接收数据失败,函数返回1则代表成功接收数据。接收道
得数据存放在RxBuf[]数组中。
3. void nRF2401_TxPacket( unsigned char *TxBuf)函数,实现无
线发送数据。需要发送的数据存放于TxBuf[]数组中,数组长度应该
与2401配置得有效数据宽度(DATA1_W)一致,默认应该为28字节。
如果发送数据少于配置得有效数据宽度(DATA1_W)(比如28字节),
那么在有发送数长度之外的数据是无效数据,接收方接收到的数据
包还是一个长度为配置有效数据长度(DATA1_W)的数据包。 函数
无返回值。
4. void SetTxMode(void)函数,设置无线收发器为发送状态,在
发送数据,即nRF2401_TxPacket前调用。
5. void SetRxMode(void)函数,设置无线收发器为接受状态,在
进行数据接收前,通过调用此函数,让无线收发器为接收数据状态。
在接收函数,即nRF2401_RxPacket前调用。
四、下位机通信部分参考电路图
五、PC端编程环境设定说明
用户在PC端编程可以选用VC++、VB、Delphi、C++Builder、
Visual C#、 Java等可以调用标准C 语言接口函数的编程工具进行
编程。
VC7 下编程环境下设置:
(1).在(VC7)"项目->属性->链接器->输入->附加依赖项"中加入
NetUSB.lib 或在
(VC6)"Project->Settings->Link->Object/library" 中加入
NetUSB.lib
(2).在你的程序中包含头文件NetUSB.h , 即#inlcude " NetUSB.h"
注:以上假定NetUSB.lib, NetUSB.h, NetUSB.DLL 都在当前目录,
如果不是请更改路径设置。
六、PC端编程环境设定说明
函数说明:
1)设置回调函数(数据接收)
原型:void NetUSB_SetCallback(NETUSB_PFUNC pFunc) 说明:每
次有数据收到,就调用pFunc,回调函数的类型为 voidCallback
(unsigned char* buff, size_t n) 返回值:没有返回值。
2)初始化USB,并启动监听线程
原型:int NetUSB_Init(HANDLE handle , int ps) 说明: 在使用
NetUSB 设备前,调用此函数进行初始华,同时启动了监听线程,当
有数据包收到时,将回调NetUSB_SetCallback 设置的回调函数。 其
中,handle为窗口句柄,ps 无线发送数时每个数据包的大小,单位
为字节,这个数值应该要和NETUSB参数设置的有效载荷数据宽度一
致。 返回值: 0 表示调用成功,-1表示调用失败。
3)停止监听线程(可恢复)
原型:int NetUSB_StopListen() 说明:调用此函数停止监听线程,
此时有数据到达时,将不回调NetUSB_SetCallback 设置的回调函
数。但此时,NetUSB 设备前的发送不受影响。 返回值: 0 表示调
用成功,-1表示调用失败。
4)重新启动监听
原型: int NetUSB_ResumeListen() 说明: 用于重新启动监听线
程。只能用于因NetUSB_StopListen()的调用而停止线程的重新启
动。 返回值: 0 表示调用成功,-1表示调用失败。
5)主机向USB 发送数据,继而USB 将数据通过无线收发器发送数据
原型:int NetUSB_Send(char* buf, long length) 说明:发送缓
冲区buf 中length 字节的数据。调用前,length 表示将要发送的
自己长度;
返回值: 0 表示调用成功,-1表示调用失败。 注意,在一次发送还
没结束,即函数还没返回时,不能再次调用此函数.(尤其发送大块数
据时需要注意,函数具有自动分包的机制,将数据分成若干个包,消
耗时间将有所延长)
6)清理NetUSB
原型:int NetUSB_Fini() 说明:必须重新调用 NetUSB_Init 后,
才能使用NetUSB。 返回值: 0 表示调用成功,-1表示调用失败。
7)配置设备地址
原型:int NetUSB_SetAddress(char* buf, bool b) 说明:buf 中
保存配置地址,以字符串形式提供,比如 “DD CC CC BB AA”, 其
中 DD表示地址的最高位字节,AA 表示最低位字节,各字节间用空
格分割。
b ==true,配置本端接收地址 Rx; b==false,配置发送目标地址
Tx。返回值: 0 表示调用成功,-1表示调用失败。
8)测试USB 硬件是否和软件相互连接
原型: int NetUSB_Check( );
说明: return 0 表示连接正常; return -1 表示连接不正常,应该
重新连接NETUSB(通过调用NetUSB_ReConnecting函数)。
9)重新连接设备
原型: int NetUSB_ReConnecting 说明: 一般NetUSB_Check 返回
-1 时候调用 返回值:函数返回值没意义。
10)设置pc 端发送的每个数据包大小
原型: int NetUSB_PacketSize(int ps=28); 说明: 参数ps 和 int
NetUSB_Init(HANDLE handle , int ps) 中的ps意义一致。PS不能
超过无线收发器接收发送的最大有效载荷数据包产度,具体参见各
收发器Datasheet。 返回值: 0 表示调用成功,-1表示调用失败。
11)配置 2401 全部配置寄存器 原
型: int NetUSB2401_RfSettingConfig(nRf2401Setting nfr); 说明:
// 配置 2401 寄存器(具体信息见下述结构体) 返回值: 0 表示调用
成功,-1 表示调用失败。
struct nRf2401Setting // 2401 配置寄存器结构体
{unsigned char TEST_2; // Reserved for testing (芯片测
试用,无需修改)
unsigned char TEST_1; // Reserved for testing
unsigned char TEST_0; // Reserved for testing
unsigned char DATA2_W; // Length of data payload section
Rx channel 2
unsigned char DATA1_W; // Length of data payload section
Rx channel 1
unsigned char ADDR2_4; // Up to 5 byte address for Rx
channel 1
unsigned char ADDR2_3;
unsigned char ADDR2_2;
unsigned char ADDR2_1;
unsigned char ADDR2_0;
unsigned char ADDR1_4; // Up to 5 byte address for Rx
channel 1
unsigned char ADDR1_3;
unsigned char ADDR1_2;
unsigned char ADDR1_1;
unsigned char ADDR1_0;
unsigned char ADDR_W; // Number of address bits(both Rx
channels)
unsigned char CRC_L; // 8 or 16 bit CRC
unsigned char CRC_EN; // Enable on-chip CRC
generation/checking
unsigned char RX2_EN; // Enable two channel receive mode
unsigned char CM; // Communication mode( Direct or
ShorckBurst)
unsigned char RFDR_SB; // RF data rate (1Mbps requires 16Mhz
crystal)
unsigned char XO_F; // Crystal frequency
unsigned char RF_PWR; // Rf output power
unsigned char RF_CH; // Frequency channel
unsigned char RXEN; // Rx or Tx operation
};
12)配置2401全部配置寄存器
原型: int NetUSB2401_RfSettingConfig2(char* buf); 说明:为
方便其他语言,参数使用一个指针,指针指向的内存必须至少
有25 字节的配置值:
[TEST_2,TEST_1,TEST_0,DATA2_W,DATA1_W,ADDR2_4,ADDR2_3,ADDR
2_2,ADDR2_1,ADDR2_0,ADDR1_4,ADDR1_3,ADDR1_2,ADDR1_1,ADDR1_
0,
ADDR_W,CRC_L,CRC_EN,RX2_EN,CM,RFDR_SB,XO_F,RF_PWR,RF_CH,RX
EN] 共25 个字节,必须严格安装顺序! 其中,开始三个字节为测试用,
在本设置中可以随便设置. 返回值: 0 表示调用成功,-1表示调用
失败。
13)配置 Frequency channel (Channel RF 频率)
原型:int NetUSB2401_SetRF_CH(unsigned char RF_CH=0x2); 说明:
Channel rf =2400Mhz +RF_CH * 1.0 Mhz 返回0,表示成功, -1表示
失败
七、示例程序
1) 初始化:使用VC6.0 建立一个基于对话框的工程,然后在
BOOLCDemoDlg::OnInitDialog() 函数的加入如下代码进行初始
化:
// TODO: Add extra initialization here
NetUSB_SetCallback(CallbackFunc,28);
NetUSB_Init(this->GetSafeHwnd()); 其中,CallbackFunc 为一
个回调函数,在本实例中,为 static void CallbackFunc
(unsigned char* buf, size_t n) { // buf 为缓冲区,n为buf 中
的有效字节数 }
这样,NetUSB已经初始化,并开始工作,当有时间到达时,我们可
以在CallbackFunc中进行处理。 一旦有数据接收到,CallbackFunc
被调用,演示程序将显示收到的数据,十六进制显示,如下:
2)发送: 在界面上放置一个Button,双击,产生一个函数,
在其中加入
unsigned char buf[]
={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
;
long len=sizeof(buf);
NetUSB_Send(buf,len); 这样,当NetUSB_Send返回时,主机就
向USB发送了buf中的数据,同时,NetUSB确保数据通过无线发送成
功。(第一字节为数字2,在演示板上右LED灯闪烁)
注意,在发送长的数据包时,要灯数据发送完成,即发送程序返回,才
能再次发送数据.
3)设置地址: unsigned char buf=“cc cc cc cc AA”; long length
=strlen(buf)+1;
NetUSB_SetAddress(buf, true); 如上函数,就设置了本NetUSB
接收的地址。
4)程序退出清理工作 比如在此VC演示程序中 void
CConfigPaneDlg::PostNcDestroy() {
// TODO: Add your specialized code here and/or call the base
class
NetUSB_Fini();
CDialog::PostNcDestroy();
}
补充说明1:
NetUSB第一次在电脑上使用的时候,需要拷贝dirver到硬盘,
然后选择USb.inf 进行pc 端驱动的安装,和普通驱动安装一样;
补充说明2:
PC 端动态库 NETUSB.DLL,可以在C、C++,delphi,c#等编程语
言或环境中使用,我们提供delphi和vc演示程序。