在mini2440上面搞定CC2500驱动
最近基本搞定了 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 协议的,如果有兴趣,大家可以去看一看这个协议的内容。对于我们来说,比较重要的就是帧的结构。下面这个是物理层帧的结构:
-
写在前面
最近基本搞定了 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位) |