登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
单片机应用于方案
›
ARM和WinCE6.0下nRF24L01的驱动设计
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版
ARM和WinCE6.0下nRF24L01的驱动设计
[复制链接]
2157
0
ad***
管理员
发表在
电源技术
2014-4-4 15:22:16
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
引言
nRF24L01
是一款工作在2.4~2.5 GHz世界通用ISM频段的单片无线收发器芯片。它在无线数据通讯、无线门禁、遥感勘测、工业
传感器
和玩具中都有应用。
随着测控技术的发展,nRF24L01与
单片机
组成的系统进行无线测控的实例已经有很多,如基于nRF24L01的无线温度监测系统、基于nRF24 L01的近距离无线
数据传输
系统等等。近年来,随着
ARM
和嵌入式WinCE系统的迅速发展,由于在WinCE系统下nRF24L01和ARM的通信缺乏驱动,致使两者之间不能直接通信,一般的解决方法是借助于第三方单片机的串行口来进行两者的通信。这种方式的不足之处在于,由于要借助于第三方单片机,使得成本增加且通信速度下降。nRF24L01驱动的设计与实现正好添补了这一空白,使WinCE系统和nRF24L01可以直接通信进行无线数据收发。
1 WinCE流式驱动模型
在WinCE系统中有4种驱动模型,其中流式接口设备驱动模型和本地设备驱动模型是可以由用户来开发的。nRF24L01可以看作是一种流式接口设备,所以选用流式接口设备驱动模型来编写驱动较为合适。
1.1 流式接口驱动程序的体系结构
如图1所示,流式接口驱动程序的体系结构由5部分组成,分别是应用程序、FileSys.exe、设备管理器、流式接口驱动程序和硬件。
图1中阴影部分是由用户编写程序来完成,白色部分是由WinCE系统自身提供,用户不能修改。在应用程序使用文件API对设备进行访问时,文件API调用被操作系统转发到FileSys.exe进程中;若发现是对设备的访问,则FileSys.exe就会把操作交给设备管理器;然后,设备管理器根据具体操作调用不同流式接口驱动中提供的接口;最后,由流式接口驱动程序负责与硬件交互。
从体系结构中可知,流式接口驱动体系是把设备抽象作为文件进行操作的。所以编写流式接口驱动就是将文件操作应有的打开、关闭、读取、写入和移动文件指针的操作在驱动程序中以函数的形式实现,这些函数有其标准的定义形式,称之为流接口函数。但对于驱动程序而言除了和文件一样的标准操作外还需要驱动程序的加载、卸载等流接口函数。下面将介绍nRF24L01驱动中主要用到的流接口函数:
①
XXX
_Open()函数,功能是打开设备准备读写,对应的文件操作函数是CreatFile()。
②XXX_Close()函数,功能是关闭设备,对应文件操作函数是CloseHandle()。
③XXX_Init()函数,功能是初始化设备,在系统启动时由设备管理器渊用。
④XXX_Read()函数,功能是读取设备中的数据,对应文件操作函数为ReadFile()。
⑤XXX_Write()函数,功能是写入数据到设备中,对应文件操作函数为WriteFile()。
⑥XXX_IOControl()函数,功能是对设备发送控制命令,对应文件操作DeviceIOControl()。
其中XXX是驱动程序在注册表中注册的设备名称。
2 硬件设计
ARM芯片选择三星公司生产的
S3C2440
,该芯片工作频率为
400
MHz,最高可达533 MHz,可稳定运行WinCE 6.0操作系统。nRF24L01是通过
SPI
总线协议和单片机进行通信的,在WinCE 6.0中SPI通信的实现可以通过ARM的SPI接口,也可以通过GPIO端口软件模拟的方式实现。在本次设计中选用了GPIO端口软件模拟的方式。硬件连接如图2所示。
3 nRF24L01驱动的实现
3.1 主要实现的函数
(1)NRF_Init()设备初始化函数
在该函数中主要进行
GPF
端口的初始化,接收完成同步事件和接收线程的创建主要的核心代码如下:
为了方便映射虚拟地址,在本驱动中将所用到的特殊功能寄存器的虚拟地址由自定义类
CS
3c2440
SFR
来进行组织。其中“sfr”是类CS3c2440SFR的实例,D()是一个自定义宏,其源码为“#define D(v_add)(*(volatile unsigned long*)v_add)”。
(2)NRF_Open()函数
NRF Open()函数主要实现了对初始化是否成功的判断及对nRF24L01进行初始配制。核心代码如下:
SPI_Write_Bur(WRITE
REG
+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写本地默认地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //写接收端默认地址
SPI_RW_Reg(WRITE_REG+EN_AA,0
x01
);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,0);//设置信道工作为2.4 GHz,收发必须一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOADWIDTH);//设置接收数据长度
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x
07
);//设置发射速率为1 MHz,发射
功率
为最大值0 dB
(3)NRF_Read()函数
NRE_Read()函数实现了对接收缓冲区的读取并传送至应用程序。由于nRF24L01一次最多能接收32个字节的信息,所以该函数一次最多能传送32字节的信息。主要核心代码如下:
(4)NRF_Write()函数
NRE_Write()函数主要实现发送数据写入发送缓冲区并发送的功能。主要核心代码如下:
(5)NRF_IOControl()函数
NRF_IOControl()函数主要实现了对本机地址的配置、接收方地址的配置、发送模式和接收模式的配置等。
3.2 驱动设计重点
(1)如何实现特殊功能寄存器的虚拟地址映射
由于WinCE 6.0对虚拟地址的映射住安全性方面提高了要求,所以WinCE 6.0中地址映射不能再使用以前版本中常用的VirtualAlloc()和VirtualFree()函数来分配和释放虚拟地址,它们的使用会产生编译错误。解决方式是使用CEDDK库中的MmMapIoSpace()函数和MmUnmapIo Space()函数来实现虚拟地址的分配和释放。
(2)如何实现数据的接收
在数据接收中采用多线程编程,在设备初始化时调用CreateThread()函数创建一新线程对应线程函数DWORD AcceptThread()。
(3)AcceptThread()函数的实现
在该函数中主要进行中断配置、中断同步事件的创建、中断的撤除等。使用的API函数主要有:KernclIoControl()用来获取逻辑巾断号;InterruptInitialize()逻辑中断和同步事件关联;WaitForSingleObject()阻塞线程并等待中断同步事件发生,中断同步事件发生即接收完一次数据,则使接收完成同步事件有效,可通知应用程序数据已接收完成;(InterruptDone)函数中断结束,并撤除相应的中断标志位准备响应下次中断。
4 驱动测试程序
4.1 数据发送
数据发送步骤如下:
①调用CreateFile()函数打开设备,核心代码如下:
NRFdriver=CreateFilc(L“NRF1:”,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN EXISTING,0,NULL);
②通过DeviceIoControl()函数设置为发送模式并使用默认地址(默认地址在驱动程序中配置完成),核心代码如下:
DevlccIoControl(NRFdriver.IS SEND STATUS,NULL,0,NULL,0.NULL,NULL);
③调用WriteFile函数完成发送,核心代码如下:
WriteFile(NRFdriver,(LPCVOID)p,strL,NULL,NULL);
4.2 数据接收
数据接收步骤如下:
①打开设备,方法同4.1节步骤①。
②通过DeviceIocontrol()函数设置为接收模式并使用默认地址,核心代码如下:
DeviceIoControl(NRFdrivcr,IS_ACCEPT_STATUS,NULL,0,NULL,0,NULL,NULL);
③创建接收线程及与驱动中同名的接收完成同步事件,在接收线程中调用WaitForSingleObject()函数等待有效。如有效,则调用ReadFi le()函数读取数据并显示。核心代码如下:
以上驱动及测试程序均是在VC2008环境中完成。在WinCE6.0系统中运行测试程序还应该在注册表中导入如下注册信息:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NRF24L01]
“Prefix”=“NRF”
“Dll”=“NRFDriver.DLL”
以上内容中,驱动程序注册的设备名称为“NRF”,驱动程序名为“NRFDriver.dll”。
5 测试效果
5.1 接收测试
采用
MSP
430F149开发板和nRF24L01
模块
搭建发射端,然后利用该发射端每秒发送32个字节的数据,数据内容为1~32。ARM接收端接收到数据并将它显示到
LCD
上。
5.2 发送测试
用
MSP430F149
开发板和nRF24L01模块搭建接收端,然后利用MSP430F149的串行口将接收到的数据发送到计算机,通过串口调试助手就可以观察到ARM端发送来的数据。
结语
驱动程序的编写是嵌入式系统开发的重要核心步骤。文中详细阐述了nRF24L01驱动程序和测试程序的开发,通过测试该驱动程序能够较好地完成无线通信的功能,满足实际需求。
测控技术
,
玩具
相关帖子
无线遥控玩具汽车(附源码)
催醒器的电路图
玩具车遥控器
5功能遥控器PT8A977/978的应用电路
太工天成链条炉定量配风经济燃烧节能控制系统
ELPRO产品在城市管网中的应用
卓越TSC工业以太网交换机在长安自动化网络工程中的应用———卓
ELPRORTU产品在城市管网中的应用
路灯无线监控系统
航天测控通用测试平台GT9000的开发与应用———航天测控通用测试
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
VK1S38A SSOP24点阵数显LED驱动芯片/数码管
VK1S38A是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3
点阵LED数显屏驱动芯片/数码屏显示IC-VK162
VK1628是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线
数显屏驱动原厂-VK1668 SOP24抗干扰数显LED
产品品牌:永嘉微电/VINKA 产品型号:VK1668 封装形式:SOP24 概述 VK166
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
更多
精华推荐
VK1S38A SSOP24点阵数显LED驱动芯片/数码管
点阵LED数显屏驱动芯片/数码屏显示IC-VK162
数显屏驱动原厂-VK1668 SOP24抗干扰数显LED
抗干扰LED数码管显示屏驱动芯片/3线串行接
抗干扰能力强/点阵数显LED屏驱动/数码管驱
可支持14×4的点阵LED显示面板数码管LED驱
数显驱动器原厂-数显LED显示驱动芯片VK1620
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
更多
社区学堂
VK1S38A SSOP24点阵数显LED驱动芯片/数
点阵LED数显屏驱动芯片/数码屏显示IC-V
VK1S38A SSOP24点阵数显LED驱动芯片/数码管
VK1S38A是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3
点阵LED数显屏驱动芯片/数码屏显示IC-VK162
VK1628是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线
数显屏驱动原厂-VK1668 SOP24抗干扰数显LED
产品品牌:永嘉微电/VINKA 产品型号:VK1668 封装形式:SOP24 概述 VK166
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表