在mini2440上面搞定CC2500物理层驱动
时间:11-19
来源:互联网
点击:
- 写在前面
最近基本搞定了CC2500在linux下面的驱动,在这个过程中遇到了好多问题,特此总结出来和大家分享。但是需要注意的事情是:
第一,本文不负责程序的具体讲解,诸如每一行程序都讲什么:这个在程序的里面有注释。本篇文章更侧重于从整体结构上让大家对于linux下的CC2500DE驱动有一个整体的了解,如果到时候需要深入研究的时候,再来看具体的代码;
第二,很多师弟师妹没有习惯在linux下编程,或曰,在操作系统下面写程序;并且,对于本专业的东西理解并不扎实。但是,文章中不可能就每一个涉及到的概念都大加讲解。因此,这篇文章还是需要有一些基础才能来阅读的,如果遇到什么不明白的地方,请及时来问我,或者跟帖,或者自己查资料。毕竟,这个驱动花费了我半个多月的时间,其中遇到的问题,不可能在一篇文章中就讲得清清楚楚。
背景知识
如果大家看过实验室的WSN方面的程序,可能会被其中的架构搞得天昏地暗。这里,简单的帮助大家把实验室的WSN的软件、硬件方面捋一捋。
说到软件,就不能不说硬件。我们的节点由两部分组成,一个是单片机,一个是CC2500的射频模块。射频模块通过SPI接口和单片机进行通信。除了SPI模块用到的4条线,实际上CC2500还需要告诉单片机“我接收到一个数据”,这个地方CC2500可以通过配置GDO来实现。我们这里采用的CC2500的GDO0作为单片机的一个外部中断,当接收到数据的时候,GDO0就会变为低电平,然后触发CC2500的中断,从而接收数据。
那么,CC2500究竟是如何来进行数据发送、接收的呢?其实很简单。如果大家稍微用过一点可以控制的芯片就会知道,很多芯片内部都有寄存器,CC2500之所以能够完成发送、接收的功能,就是通过配置寄存器来完成的。比较重要的配置有信道、波特率、信号强度等等,另外,CC2500还有64bytes的RXFIFO和64bytes的TXFIFO,他们的作用就是用来发送和接收。当配置CC2500结束之后,如果用来发送,那么就把数据放在TXFIFO里面,然后把CC2500的状态变为发射状态,数据就自动发送出去了。同样的道理,当RXFIFO里面接收到了数据之后,CC2500就会如前所说,发出一个中断,通知单片机来读取数据。
单片机通过SPI接口读出了CC2500中的数据,就需要进行简单的处理了。我们的节点是遵循802.15.4协议的,如果有兴趣,大家可以去看一看这个协议的内容。对于我们来说,比较重要的就是帧的结构。下面这个是物理层帧的结构:
字节:4 | 1 | 1 | 可变 | |
先导码 | 帧定界符 | 帧长度(7位) | 保留位(1位) | 负载内容 |
同步头 | PHY头 | PHY负载 |
简单的讲,因为是无线通信,没有一个时钟的存在,因此本质上所有的无线通信都是一个异步的通信。那么,就需要发送和接收的双方首先对数据进行同步——这个就是同步头的作用。随后的是PHY的头,很简单,就是一个长度。换句话说,每个帧不能够超过2的8次方减一个数据(127个)。随后就是负载的内容了,简单吧?另外,由于CC2500是一个802.15.4兼容的芯片,这一部分内容都已经固化在芯片里面了,像同步头这种东西,都是芯片帮我们完成(当然也可以自行配置)。我们只需要把写入的数据大小和数据内容写入即可。
虽然简单,但是还有一个问题:每次从CC2500中读取了数据,存放到哪里呢?有的同学可能想的比较简单,比如建立一个大数组,收到多少个数,放在里面就行了。但是,这样就会遇到问题:如果收到了两个包,上层来不及处理怎么办?建立两个大数组?更多的包呢?当然,我们可以通过建立好多个数组来解决这个问题。但是,从效率上讲,这个是非常笨的一个办法。因此,我们建立了一个环形缓冲区PHY_RX_BUFFER,来解决这个问题。环形缓冲区的具体原理不过多涉及,可以自行百度。
另外一个问题就是,如果我们从CC2500中接收到了数据,那么应该怎样才能告诉上层来进行处理呢?这里就要用到操作系统的消息机制了。如果确定接收到了一个数据,那么就给上层发送一个消息,来通知上层。上层接收到这个消息,就会知道接收到了数据。
当从CC2500读取到了数据,因为物理层没有什么东西,我们就直接通知MAC层来处理数据。MAC层的结构如下:
字节:2 | 1 | 0/2 | 0/2/8 | 0/2 | 0/2/8 | 可变 | 2 |
帧控制域 | 序列号 | 目的PAN标示符 | 目的地址 | 源PAN标示符 | 源地址 | 帧负载 | FCS |
地址域 | |||||||
MAC帧头 | MAC负载 | MFR |
具体内容可以参见老师的《无线传感器网络技术与工程应用》这本书,这里不再详细的讲,大概内容就是,会有一系列的帧头,然后是帧数据,最后有校验。而我们最关心的就是帧的内容。但是,帧头也比较麻烦,因此我们需要首先对帧头进行处理,把数据给“剥离”出
mini2440CC2500物理层驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)