天线|RF射频
直播中

刘京

7年用户 207经验值
私信 关注
[问答]

要不要NRF24L01代码,包含协议栈?

之前一直想使用一种新的风格写代码,就是将硬件配置与平台区分开,同时与应用部分也区分开。当更换平台后,只需要修改使用到的硬件资源就可以正常跑了。第一次尝试,可能写的有些乱,封装的不是很好。有更好想法的人可以提出来进行改进。以下是移植文档:
[C] 纯文本查看 复制代码
//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("rn");        }//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口状态了 */                        
nrf24l01.zip (4.29 KB )

回帖(1)

秦玫

2020-7-14 06:58:28
http://www.lzyec.com/Activity/UnitarySales?UserId=5499
举报

更多回帖

发帖
×
20
完善资料,
赚取积分