OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4244|回复: 1

分享自己写的NRF24L01代码,包含协议栈

[复制链接]

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-8-25 11:23:01 | 显示全部楼层 |阅读模式
本帖最后由 Theone 于 2017-8-25 11:30 编辑

之前一直想使用一种新的风格写代码,就是将硬件配置与平台区分开,同时与应用部分也区分开。当更换平台后,只需要修改使用到的硬件资源就可以正常跑了。第一次尝试,可能写的有些乱,封装的不是很好。有更好想法的人可以提出来进行改进。以下是移植文档:

[mw_shl_code=c,true]//1.把两个C文件包含到相应的工程目录中
//2.如果提示u8等未定义,请在NRF24L01.h文件中添加相应的定义头文件
//3.修改NRF_USER.c文件中的USER_Config_NRF_Device函数,将所用到的硬件资源修改为你所在平台的引脚跟外设。默认的是原子的F4平台。
//4.修改NRF_USER.c文件中的USER_Init_RCC函数,将所用到的外设时钟开启。
//5.修改NRF_USER.c文件中的USER_Init_IRQ函数,将所用到的中断资源进行初始化。
//6.将USER_NRF_IRQ与USER_NRF_TIM_IRQ两个中断函数放到对应的中断函数里边。如果不想使用外部中断处理数据,可在该函数中注释外部中断的配置。定时器中断还没有用到。
//7.
//发送函数示例:
        NRF_Data.TX.Data.Protocol.MoreData = 0;//表示该数据帧后没有数据了
    NRF_Data.TX.Data.Protocol.Type = 1;//数据类型为1,自己定制协议内容,写逻辑把
    NRF_Data.TX.Data.Protocol.Length = 2;//数据帧数据长度为2,最大帧数据长度28
    NRF_Data.TX.Data.Protocol.TotalLength = 2;//数据包数据长度为2,理论最大(64K-1)
    NRF_Data.TX.Data.Protocol.Content[0] = 2;//第一个数据
    NRF_Data.TX.Data.Protocol.Content[1] = 3;//第二个数据
        NRF_Tx_Data((_nrf_data_packet_*)&NRF_Data.TX);
        
//接收函数示例:(数据接收在中断部分处理)
        value = NRF_Get_Status();
        if (value & (1 << RX_IT))
        {
                //接收中断
                channel = (value & 0x0e) >> 1;
                NRF_Rx_Data((_nrf_data_packet_*)(&NRF_Data.RX[channel]));
        }
        
//main函数中处理数据,这只是通道0,其他的类似
        if(NRF_Data.RX[0].Update_Flag == TRUE)
        {
                NRF_Data.RX[0].Update_Flag = FALSE;
                for (i = 0; i < NRF_Data.RX[0].Data.Protocol.Length; i++)
                {
                        //处理接收到的真正数据部分
                }
                UART1_Send("\r\n");
        }
//8.数据帧协议结构体

/*
*        Type:判断数据包类型
*        MoreData:判断完整的数据包是否发送完成,如果不为1,则表示数据包还未发送完成,还有更多的数据需要发送。多个数据帧组合成一个完整的数据包,数据包的逻辑还没写,有能力的自己写吧。
*        Length:数据帧的数据长度
*        TotalLength:数据包长度
*        Content:数据帧数据内容
*/
typedef struct
{
    u8 Type : 7;
    u8 MoreData : 1;
    u8 Length;
    u16 TotalLength;
    u8 Content[NRF_DATA_LENGTH-4];
}_nrf_protocol_;//真正的发送协议

typedef union
{
    u8 Raw[NRF_DATA_LENGTH];
    _nrf_protocol_ Protocol;
}nrf_protocol;//对协议进行封装,使用Raw可按字节读取或发送

typedef struct
{
    u8 Update_Flag;
    nrf_protocol Data;
}_nrf_data_packet_;//将协议封装成数据包。加入更新标志位,如果接收完成一帧数据,使用标记位判断

volatile _nrf_data_ NRF_Data = {
    { 0 },//TX_Data
    {
        { 0 },//RX_Data[0],接收通道0
        { 0 },//RX_Data[1],接收通道1
        { 0 },//RX_Data[2],接收通道2
        { 0 },//RX_Data[3],接收通道3
        { 0 },//RX_Data[4],接收通道4
        { 0 },//RX_Data[5],接收通道5
    },
};//该结构体是所有发送与接收通道的第一次数据存放区域

//9.位段操作指针
/*
*        GET_BITBAND_READ_POINTER(GPIO,PIN)
*        这个宏定义会返回一个能够才做IO口电平状态的指针,原理就是位段操作,让一个指针指向操作该io口的位段地址,然后改变值,就可以改变io口状态了
*/

























[/mw_shl_code]

nrf24l01.zip

4.29 KB, 下载次数: 234

源码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-1-7
在线时间
9 小时
发表于 2017-8-25 21:05:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表