在mini2440上面搞定CC2500物理层驱动
时间:11-19
来源:互联网
点击:
来,这也是基本上所有的协议栈解析协议的方法。
硬件上,我们采用的是mini2440开发板,和实验室的CC2500节点(把单片机焊掉,然后把mini2440的相应管脚接到上面)。
Mini2440方面,我们用的是CON8这个引脚,具体连线如下:
EINT8对应S3C2440的GPG0引脚,连接到了CC2500的GDO2
EINT11对应S3C2440的GPG3引脚,连接到了CC2500的CSN
EINT13对应S3C2440的GPG5引脚,连接到了CC2500的SO
EINT14对应S3C2440的GPG6引脚,连接到了CC2500的SI
EINT15对应S3C2440的GPG7引脚,连接到了CC2500的CLK
EINT19对应S3C2440的GPG11引脚,连接到了CC2500的GDO0
除此之外,还有3.3V电源和GND
为什么要用驱动呢?简单的说,就是为了在linux下完成用户空间和内核空间的交互。本质上,驱动就是完成了两件事情:第一,初始化SPI接口,并且通过SPI和CC2500完成通信。第二,完成读写函数,read和write,通过读写函数的接口来对CC2500进行操作。
附件里面有几个文件,这里简单讲解一下:
Common.h主要是包含了很多linux的头文件,并且对一些数据类型做了定义
CC2500.h里面主要是对CC2500的寄存器做了一些定义,没啥东西
Driver.h主要是定义了很多和CC2500进行通信,并且利用CC2500进行发送和接收的内容
Phy.h主要是完成了一些诸如信道设定、通信速率等功能,并且把CC2500里的数据读到环形缓冲区里面
CC2500.c这个就是完成设备注册、读写函数、iocontrol等功能
这样有了一个整体的把握之后,不用看很多代码,学会使用就好。
那么,这个驱动怎样使用呢?主要是通过read/write/ioctl三个接口来实现的。
在应用程序中read/dev/CC2500这个文件,如果有数据,会返回相应的数据。其中,返回的数据中第一个字节为数据的长度(不包括该字节本身),后面为相应的数据。
如果是写文件的话,只需要向/dev/CC2500中写入相应的数据即可。写入的时候需要注意,第一个字节同样为数据长度(不包括该字节本身),后面跟相应的数据。当写入的字节合适的时候,驱动会自动执行发送函数。如果写入的字节数量和写入的数据第一个字节不匹配的时候,会返回错误。
ioctl主要有这样几种命令:
CC2500_IOC_PHY_DETECT_STATUS
表示将CC2500的状态变为RX
CC2500_IOC_PHY_GET_BAUDRATE
读取CC2500的波特率,返回的是1,2,3,4,分别是2.4k,10k,250k,500k的波特率
CC2500_IOC_PHY_SET_BAUDRATE
设定CC2500的波特率,后面的参数是1,2,3,4,分别是2.4k,10k,250k,500k的波特率
CC2500_IOC_PHY_GET_TXPOWER
获取发送功率,返回的是在发送功率表{0x00, 0x50, 0x44, 0xC0, 0x84, 0x81, 0x46, 0x93, 0x55, 0x8D, 0xC6,0x97, 0x6E, 0x7F, 0xA9, 0xBB, 0xFE, 0xFF }中的数组下标
CC2500_IOC_PHY_SET_TXPOWER
设定发送功率,参数的是在发送功率表{0x00, 0x50, 0x44, 0xC0, 0x84, 0x81, 0x46, 0x93, 0x55, 0x8D, 0xC6,0x97, 0x6E, 0x7F, 0xA9, 0xBB, 0xFE, 0xFF }中的数组下标
CC2500_IOC_PHY_GET_CHANNEL
获取频段,参数是频段表{0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,0xB0, 0xC0, 0xD0, 0xE0, 0xF0 }中的数组下标
CC2500_IOC_PHY_SET_CHANNEL
设定频段,参数是频段表{0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,0xB0, 0xC0, 0xD0, 0xE0, 0xF0 }中的数组下标
这里的应用层主要是将mac层实现了。其实,mac层的作用也很简单,主要是对要发送的包进行封装,接收回来的包进行包的解析。这一部分的内容还不全面,仅仅是将原来的程序移植过来,还有很多需要改动的地方,有待补充。因此,这里只是提供源代码,具体的说明请参见程序内部
1首先修改/opt/FriendlyARM/mini2440/linux-2.6.32.2/drivers/char/Kconfig
加入如下几句话:
config CC2500_DRIVER
tristate "CC2500 driverfor FriendlyARM Mini2440 development boards"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
this is CC2500 driver forFriendlyARM Mini2440 development boards
2修改Makefile,让CC2500的驱动可以编译。
加入如下几句话:
obj-$(CONFIG_CC2500_DRIVER) +=CC2500inuse.o
CC2500inuse-objs :=./CC2500.in_use/cc2500.o ./CC2500.in_use/phy.o./CC2500.in_use/driver.o
其中,CONFIG_CC2500_DRIVER需要和Kconfig中的configCC2500_DRIVER
保持一致。
CC2500inuse-objs这句话,意思是CC2500inuse.ko是由哪几个文件组成的。这样就实现了模块化的处理。
需要注意的是,CC2500inuse-objs和冒号之间需要有个空格,不然会出错误。这个地方我搞了好久。
具体的Makefile的格式也可以参考这两篇文章:
http://blog.csdn.net/tommy_wxie/article/details/7282463
http://hi.baidu.com/wjq_qust/blog/item/97ddbdfdfb2e541309244d30.html
硬件结构
硬件上,我们采用的是mini2440开发板,和实验室的CC2500节点(把单片机焊掉,然后把mini2440的相应管脚接到上面)。
Mini2440方面,我们用的是CON8这个引脚,具体连线如下:
EINT8对应S3C2440的GPG0引脚,连接到了CC2500的GDO2
EINT11对应S3C2440的GPG3引脚,连接到了CC2500的CSN
EINT13对应S3C2440的GPG5引脚,连接到了CC2500的SO
EINT14对应S3C2440的GPG6引脚,连接到了CC2500的SI
EINT15对应S3C2440的GPG7引脚,连接到了CC2500的CLK
EINT19对应S3C2440的GPG11引脚,连接到了CC2500的GDO0
除此之外,还有3.3V电源和GND
Linux下驱动编写
为什么要用驱动呢?简单的说,就是为了在linux下完成用户空间和内核空间的交互。本质上,驱动就是完成了两件事情:第一,初始化SPI接口,并且通过SPI和CC2500完成通信。第二,完成读写函数,read和write,通过读写函数的接口来对CC2500进行操作。
附件里面有几个文件,这里简单讲解一下:
Common.h主要是包含了很多linux的头文件,并且对一些数据类型做了定义
CC2500.h里面主要是对CC2500的寄存器做了一些定义,没啥东西
Driver.h主要是定义了很多和CC2500进行通信,并且利用CC2500进行发送和接收的内容
Phy.h主要是完成了一些诸如信道设定、通信速率等功能,并且把CC2500里的数据读到环形缓冲区里面
CC2500.c这个就是完成设备注册、读写函数、iocontrol等功能
这样有了一个整体的把握之后,不用看很多代码,学会使用就好。
驱动接口使用
那么,这个驱动怎样使用呢?主要是通过read/write/ioctl三个接口来实现的。
在应用程序中read/dev/CC2500这个文件,如果有数据,会返回相应的数据。其中,返回的数据中第一个字节为数据的长度(不包括该字节本身),后面为相应的数据。
如果是写文件的话,只需要向/dev/CC2500中写入相应的数据即可。写入的时候需要注意,第一个字节同样为数据长度(不包括该字节本身),后面跟相应的数据。当写入的字节合适的时候,驱动会自动执行发送函数。如果写入的字节数量和写入的数据第一个字节不匹配的时候,会返回错误。
ioctl主要有这样几种命令:
CC2500_IOC_PHY_DETECT_STATUS
表示将CC2500的状态变为RX
CC2500_IOC_PHY_GET_BAUDRATE
读取CC2500的波特率,返回的是1,2,3,4,分别是2.4k,10k,250k,500k的波特率
CC2500_IOC_PHY_SET_BAUDRATE
设定CC2500的波特率,后面的参数是1,2,3,4,分别是2.4k,10k,250k,500k的波特率
CC2500_IOC_PHY_GET_TXPOWER
获取发送功率,返回的是在发送功率表{0x00, 0x50, 0x44, 0xC0, 0x84, 0x81, 0x46, 0x93, 0x55, 0x8D, 0xC6,0x97, 0x6E, 0x7F, 0xA9, 0xBB, 0xFE, 0xFF }中的数组下标
CC2500_IOC_PHY_SET_TXPOWER
设定发送功率,参数的是在发送功率表{0x00, 0x50, 0x44, 0xC0, 0x84, 0x81, 0x46, 0x93, 0x55, 0x8D, 0xC6,0x97, 0x6E, 0x7F, 0xA9, 0xBB, 0xFE, 0xFF }中的数组下标
CC2500_IOC_PHY_GET_CHANNEL
获取频段,参数是频段表{0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,0xB0, 0xC0, 0xD0, 0xE0, 0xF0 }中的数组下标
CC2500_IOC_PHY_SET_CHANNEL
设定频段,参数是频段表{0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,0xB0, 0xC0, 0xD0, 0xE0, 0xF0 }中的数组下标
应用层程序编写
这里的应用层主要是将mac层实现了。其实,mac层的作用也很简单,主要是对要发送的包进行封装,接收回来的包进行包的解析。这一部分的内容还不全面,仅仅是将原来的程序移植过来,还有很多需要改动的地方,有待补充。因此,这里只是提供源代码,具体的说明请参见程序内部
如何配置内核文件
1首先修改/opt/FriendlyARM/mini2440/linux-2.6.32.2/drivers/char/Kconfig
加入如下几句话:
config CC2500_DRIVER
tristate "CC2500 driverfor FriendlyARM Mini2440 development boards"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
this is CC2500 driver forFriendlyARM Mini2440 development boards
2修改Makefile,让CC2500的驱动可以编译。
加入如下几句话:
obj-$(CONFIG_CC2500_DRIVER) +=CC2500inuse.o
CC2500inuse-objs :=./CC2500.in_use/cc2500.o ./CC2500.in_use/phy.o./CC2500.in_use/driver.o
其中,CONFIG_CC2500_DRIVER需要和Kconfig中的configCC2500_DRIVER
保持一致。
CC2500inuse-objs这句话,意思是CC2500inuse.ko是由哪几个文件组成的。这样就实现了模块化的处理。
需要注意的是,CC2500inuse-objs和冒号之间需要有个空格,不然会出错误。这个地方我搞了好久。
具体的Makefile的格式也可以参考这两篇文章:
http://blog.csdn.net/tommy_wxie/article/details/7282463
http://hi.baidu.com/wjq_qust/blog/item/97ddbdfdfb2e541309244d30.html
mini2440CC2500物理层驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)