微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > ARM和WinCE6.0下nRF24L01的驱动设计

ARM和WinCE6.0下nRF24L01的驱动设计

时间:05-28 来源:互联网 点击:

要实现发送数据写入发送缓冲区并发送的功能。主要核心代码如下:

(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 接收测试

采用MSP430F149开发板和nRF24L01模块搭建发射端,然后利用该发射端每秒发送32个字节的数据,数据内容为1~32。ARM接收端接收到数据并将它显示到LCD上。

5.2 发送测试

用MSP430F149开发板和nRF24L01模块搭建接收端,然后利用MSP430F149的串行口将接收到的数据发送到计算机,通过串口调试助手就可以观察到ARM端发送来的数据。

结语

驱动程序的编写是嵌入式系统开发的重要核心步骤。文中详细阐述了nRF24L01驱动程序和测试程序的开发,通过测试该驱动程序能够较好地完成无线通信的功能,满足实际需求。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top