实例介绍
【实例简介】
发一份自己调试好的nRF24L01库, 网上的动不动都不好使 自己写的多通道的 |
【实例截图】
【核心代码】
-
#include "nRF24L01Drv.h"
-
#include "USART.h"
-
#include "stdio.h"
-
#include "config.h"
-
#include <intrins.h>
-
#include "spi.h"
-
-
/**
-
* 1.改多路方法:
-
* NUM_USED_PIPE 改为使用的路数, RX_ADDRESS 分别指定 RX的地址,
-
* RX_PLOAD_WIDTH 改为每一路的PAYLOAD
-
* NRF24L01_RxPacket 里面知道是哪一路在接收
-
*
-
*
-
* 2. 发送时自动将CONFIG 备份,然后切换TX后再切换回去
-
* 并且备份RX_ADDR_P0
-
*
-
* 3. 通道0,1 支持40位地址写入, 但是通道2,3,4,5只支持1位写入,其他地址与1通道相同
-
*
-
* 4. NRF24L01_TxPacket 支持写入TX_PLOAD_WIDTH 个字节
-
*
-
* 5. NRF24L01_RxPacket 第一个参数是PIPE_NUMBER, 第二个参数是 读入的 buffer
-
*
-
*
-
* **/
-
#define NUM_USED_PIPE 3
-
-
const u8 TX_ADDRESS[TX_ADR_WIDTH] = {0x35, 0x30, 0x30, 0x30, 0x35};
-
const u8 RX_ADDRESS[6][RX_ADR_WIDTH] = {{0x33, 0x30, 0x30, 0x30, 0x33}, {0x34, 0x30, 0x30, 0x30, 0x33}, {0x35, 0x00, 0x00, 0x00, 0x00}};
-
u8 RX_PLOAD_WIDTH[6] = {0x02, 0x02, 0x02, 0x00, 0x00, 0x00};
-
-
u8 SPI_RW(u8 tr_data)
-
{
-
u16 bit_ctr;
-
for (bit_ctr = 0; bit_ctr < 8; bit_ctr ) // output 8-bit
-
{
-
NRF_MOSI = (tr_data & 0x80); // output 'uchar', MSB to MOSI
-
tr_data = (tr_data << 1); // shift next bit into MSB..
-
NRF_SCK = 1; // Set SCK high..
-
tr_data |= NRF_MISO; // capture current MISO bit
-
NRF_SCK = 0; // ..then set SCK low again
-
}
-
return (tr_data); // return read uchar
-
}
-
-
/*********************************************/
-
/* 函数功能:给24L01的寄存器写值(一个字节) */
-
/* 入口参数:reg 要写的寄存器地址 */
-
/* value 给寄存器写的值 */
-
/* 出口参数:status 状态值 */
-
/*********************************************/
-
u8 NRF24L01_RW_Reg(u8 reg, u8 value)
-
{
-
u16 status;
-
-
NRF_CSN = 0; // CSN low, init SPI transaction
-
status = SPI_RW(reg); // select register
-
SPI_RW(value); // ..and write value to it..
-
NRF_CSN = 1; // CSN high again
-
-
return (status); // return nRF24L01 status uchar
-
}
-
/*************************************************/
-
/* 函数功能:读24L01的寄存器值 (一个字节) */
-
/* 入口参数:reg 要读的寄存器地址 */
-
/* 出口参数:value 读出寄存器的值 */
-
/*************************************************/
-
u8 NRF24L01_Read_Reg(u8 reg)
-
{
-
u8 reg_val;
-
-
NRF_CSN = 0; // CSN low, initialize SPI communication...
-
SPI_RW(reg); // Select register to read from..
-
reg_val = SPI_RW(0xFF); // ..then read registervalue
-
NRF_CSN = 1; // CSN high, terminate SPI communication
-
-
return (reg_val); // return register value
-
}
-
/*********************************************/
-
/* 函数功能:读24L01的寄存器值(多个字节) */
-
/* 入口参数:reg 寄存器地址 */
-
/* *pBuf 读出寄存器值的存放数组 */
-
/* len 数组字节长度 */
-
/* 出口参数:status 状态值 */
-
/*********************************************/
-
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 len)
-
{
-
u16 status, uchar_ctr;
-
-
NRF_CSN = 0; // Set CSN low, init SPI tranaction
-
status = SPI_RW(reg); // Select register to write to and read status uchar
-
-
for (uchar_ctr = 0; uchar_ctr < len; uchar_ctr )
-
pBuf[uchar_ctr] = SPI_RW(0xFF); //
-
-
NRF_CSN = 1;
-
-
return (status); // return nRF24L01 status uchar
-
}
-
/**********************************************/
-
/* 函数功能:给24L01的寄存器写值(多个字节) */
-
/* 入口参数:reg 要写的寄存器地址 */
-
/* *pBuf 值的存放数组 */
-
/* len 数组字节长度 */
-
/**********************************************/
-
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
-
{
-
u8 status, u8_ctr;
-
NRF_CSN = 0;
-
status = SPI_RW(reg); //发送寄存器值(位置),并读取状态值
-
for (u8_ctr = 0; u8_ctr < len; u8_ctr )
-
SPI_RW(*pBuf ); //写入数据
-
NRF_CSN = 1;
-
return status; //返回读到的状态值
-
}
-
-
/*********************************************/
-
/* 函数功能:24L01接收数据 */
-
/* 入口参数:rxbuf 接收数据数组 */
-
/* 返回值: 1 成功收到数据 */
-
/* 0 没有收到数据 */
-
/*********************************************/
-
u8 NRF24L01_RxPacket(u8 *pipe_num, u8 *rxbuf)
-
{
-
u8 fifo_state;
-
u8 state;
-
u8 i;
-
unsigned char revale = 0;
-
-
fifo_state = NRF24L01_Read_Reg(FIFO_STATUS); //读取状态寄存器的值
-
state = NRF24L01_Read_Reg(STATUS); //清除TX_DS或MAX_RT中断标志
-
//TX1_write2buff(state);
-
if (!(fifo_state & _BV(RX_EMPTY))) //接收到数据
-
{
-
NRF_CSN = 0;
-
i = SPI_RW(RF24_NOP); // IRQ收发完成中断响应,16位CRC,主发送
-
*pipe_num = (i >> RX_P_NO) & 0x07;
-
NRF_CSN = 1;
-
NRF_CE = 0; //SPI使能
-
NRF24L01_Read_Buf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH[*pipe_num]); // read receive payload from RX_FIFO buffer
-
// NRF24L01_RW_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
-
NRF24L01_RW_Reg(WRITE_REG STATUS, state); //清除TX_DS或MAX_RT中断标志
-
NRF24L01_RW_Reg(FLUSH_RX, 0xFF); //清除TX_DS或MAX_RT中断标志
-
revale = RX_PLOAD_WIDTH[*pipe_num];
-
}
-
NRF_CE = 1;
-
-
return revale; //没收到任何数据
-
}
-
/**********************************************/
-
/* 函数功能:设置24L01为发送模式 */
-
/* 入口参数:txbuf 发送数据数组 */
-
/* 返回值; 0x10 达到最大重发次数,发送失败*/
-
/* 0x20 成功发送完成 */
-
/* 0xff 发送失败 */
-
/**********************************************/
-
u8 NRF24L01_TxPacket(u8 *txbuf)
-
{
-
u8 state;
-
u8 config;
-
-
NRF_CE = 0; //StandBy I模式
-
config = NRF24L01_Read_Reg(CONFIG);
-
-
NRF24L01_Read_Buf(RX_ADDR_P0, RX_ADDRESS[0], RX_ADR_WIDTH); // 备份 RX_ADDRESS[0]
-
NRF24L01_Write_Buf(WRITE_REG RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
-
NRF24L01_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); // 装载数据
-
NRF24L01_RW_Reg(WRITE_REG CONFIG, config & ~_BV(0)); // 设置为PTX
-
NRF_CE = 1;
-
//置高CE,激发数据发送
-
while (NRF_IRQ == 1)
-
{
-
;
-
} //等待发送完成
-
state = NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
-
NRF24L01_RW_Reg(WRITE_REG STATUS, state); //清除TX_DS或MAX_RT中断标志
-
if (state & MAX_TX) //达到最大重发次数
-
{
-
NRF24L01_RW_Reg(FLUSH_TX, 0xff); //清除TX FIFO寄存器
-
return MAX_TX;
-
}
-
-
NRF24L01_Write_Buf(WRITE_REG RX_ADDR_P0, RX_ADDRESS[0], RX_ADR_WIDTH);
-
NRF24L01_RW_Reg(WRITE_REG CONFIG, config); //改回PRX
-
if (state & TX_OK) //发送完成
-
{
-
return TX_OK;
-
}
-
return 0xff; //发送失败
-
}
-
/********************************************/
-
/* 函数功能:检测24L01是否存在 */
-
/* 返回值; 0 存在 */
-
/* 1 不存在 */
-
/********************************************/
-
u8 NRF24L01_Check(void)
-
{
-
u8 check_in_buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
-
u8 check_out_buf[20] = {0x00};
-
-
NRF_CE = 0;
-
-
NRF24L01_Write_Buf(WRITE_REG TX_ADDR, check_in_buf, 5);
-
NRF24L01_Read_Buf(READ_REG TX_ADDR, check_out_buf, 5);
-
-
if ((check_out_buf[0] == 0x11) &&
-
(check_out_buf[1] == 0x22) &&
-
(check_out_buf[2] == 0x33) &&
-
(check_out_buf[3] == 0x44) &&
-
(check_out_buf[4] == 0x55))
-
return 0;
-
-
return 1;
-
}
-
-
void NRF24L01_RT_Init(void)
-
{
-
u8 i = 0;
-
-
NRF_SCK = 0;
-
-
NRF_CE = 0; // chip enable
-
-
NRF24L01_Write_Buf(WRITE_REG TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
-
-
NRF24L01_RW_Reg(WRITE_REG CONFIG, 0x0B); //0x20
-
……………………
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论