当前位置:首页 > 单片机 > 单片机
[导读]摘要:随着嵌入式WinCE系统的发展和近距离无线通信的广泛使用,有必要为近距离无线通信芯片编写驱动。由于nRF24L01在WinCE系统下驱动的缺乏,使得WinCE与nRF24L01芯片之间的直接通信成为困难。本文的驱动设计正好解决

摘要:随着嵌入式WinCE系统的发展和近距离无线通信的广泛使用,有必要为近距离无线通信芯片编写驱动。由于nRF24L01在WinCE系统下驱动的缺乏,使得WinCE与nRF24L01芯片之间的直接通信成为困难。本文的驱动设计正好解决了这一难题。

关键词:WinCE;nRF24L01;驱动程序

引言

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端口的初始化,接收完成同步事件和接收线程的创建主要的核心代码如下:


为了方便映射虚拟地址,在本驱动中将所用到的特殊功能寄存器的虚拟地址由自定义类CS3c2440SFR来进行组织。其中“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,0x01);

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,0x07);//设置发射速率为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 接收测试

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

5.2 发送测试

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

结语

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Arm CPU正在从根本上推动AI变革,并造福地球。Arm架构是未来AI计算的基石。​

关键字: ARM AI

近日,Arm推出了Arm® Ethos™-U85神经网络处理器(NPU)和Arm Corstone™-320物联网参考设计平台,旨在满足海量的数据处理和大规模计算,加速推进边缘AI的发展进程。

关键字: ARM

为了赶超云计算市场上的竞争对手,谷歌正试图通过定制的Arm服务器芯片降低云计算服务成本。

关键字: 谷歌 ARM 定制芯片

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM

随着汽车软件数量爆发式的增长,整个行业都需要重新思考汽车产品的开发流程。为此,Arm推出了丰富的硬件IP、新的系统IP,以及全新的汽车计算与计算子系统产品路线图,旨在为各种汽车应用实现性能、功能安全、可扩展等方面的支持。

关键字: ARM 汽车电子

知名移动芯片设计公司ARM最近迈出重要一步,它正式推出汽车芯片设计。ARM推出的芯片设计方案名叫Neoverse,随同芯片一起推出的还有面向汽车制造商、汽车供应商的新系统。

关键字: ARM 汽车芯片 芯片

随着通用人工智能的发展,数据中心的计算需求逐步提高。针对多模态数据、大模型的推理和训练需要更高的算力支持,而随着算力提升与之而来的还需更关注在功耗方面的优化。对于头部云计算和服务厂商而言,针对专门用例提高每瓦性能变得至关...

关键字: ARM 服务器 AI Neoverse CSS

一直以来,riscv架构都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来riscv架构的相关介绍,详细内容请看下文。

关键字: riscv ARM riscv架构

最新消息报道,知情人士透露Arm近日裁掉了中国70多名软件工程师,并会将部分职位转移到中国以外的地区。Arm通过“全球服务”部门已经将支持其中国客户的工作外包给安谋科技,该部门曾经拥有约200名员工。

关键字: ARM 裁员

凭借着在个人计算机领域的广泛应用打下的坚实基础,X86自始至终统治着整个服务器生态。而这并不是业界希望看到的,因此Arm服务器被给予厚望。业界期盼Arm能够带来新的服务器CPU替代:打破一个同质化的数据中心架构,实现更高...

关键字: ARM 服务器 AI
关闭
关闭