完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前一直想使用一种新的风格写代码,就是将硬件配置与平台区分开,同时与应用部分也区分开。当更换平台后,只需要修改使用到的硬件资源就可以正常跑了。第一次尝试,可能写的有些乱,封装的不是很好。有更好想法的人可以提出来进行改进。以下是移植文档:
[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个回答
|
|
http://www.lzyec.com/Activity/UnitarySales?UserId=5499
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2550 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2335 浏览 5 评论
3166 浏览 3 评论
2807 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2767 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
617浏览 1评论
863浏览 0评论
975浏览 0评论
630浏览 0评论
456浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 13:07 , Processed in 1.265905 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号