📄 nrf24l01.c
字号:
#include "config.h"
#include "SSP.h"
#define NRF_CE 0x00008000 // P0.15
#define NRF_CE0 0x00000100 // P0.8
#define NRF_IR0 0x00000200 // P0.9
#define NRF_IR 0x00000800 // P0.11
void nrf24l01_init(void);
void nrf24l01_send(uchar *s, uchar No);
void nrf24l01_init0()
{
UINT i;
IO0DIR |= NRF_CE0;
IO0DIR &= ~NRF_IR0;
IO0CLR = NRF_CE0; // 空闲模式,不进行数据传输
T_data[0] = 0x23; // SETUP_AW:设置地址宽度
T_data[1] = 0x03; // 5byte地址宽度
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x2A; // RX_ADDR_P0:接收数据通道0的地址40位
T_data[1] = 0x01; // 接收数据通道0的地址LSB
T_data[2] = 0x02;
T_data[3] = 0x03;
T_data[4] = 0x04;
T_data[5] = 0x05; // 接收数据通道0的地址MSB
SPI_SendData(T_data, R_data, 6);
T_data[0] = 0x31; // RX_PW_P0 :接收数据通道0的有效载荷字节数
T_data[1] = 20; // 32byte
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x27; // STATUS:状态寄存器
T_data[1] = 0x70; // 清空各中断
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x21; // EN_AA
T_data[1] = 0x01; // 通道0自动应答
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x22; // EN_RXADDR:激活接收地址
T_data[1] = 0x01; // 使能接收通道0
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x24; // SETUP_RETR
T_data[1] = 0x0a; // 不转发,10次重发
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x25; // RF_CH:射频频道
T_data[1] = 0x40; // 频点2
SPI_SendData(T_data, R_data, 2);
for (i=0; i<10000; i++);
T_data[0] = 0x26; // RF_SETUP:射频设置寄存器
T_data[1] = 0x09; // 2Mbps, 0 dBm,Setup LNA gain //******1f
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x30; // TX_ADDR:发送数据通道地址,40位
T_data[1] = 0x01; // 接收数据通道0的地址LSB
T_data[2] = 0x02;
T_data[3] = 0x03;
T_data[4] = 0x04;
T_data[5] = 0x05; // 接收数据通道0的地址MSB
SPI_SendData(T_data, R_data, 6);
T_data[0] = 0x20; // CONFIG:PRx, CRC 1byte
T_data[1] = 0x0f;
SPI_SendData(T_data, R_data, 2);
IO0SET = NRF_CE0; // 进入发送或接收模式
T_data[0] = 0xe1;
SPI_SendData(T_data, R_data, 1);
T_data[0] = 0xe2;
SPI_SendData(T_data, R_data, 1);
}
void nrf24l01_send0(uchar *s, uchar No)
{
uchar i;
IO0CLR = NRF_CE0; // 空闲模式,不进行数据传输
T_data[0] = 0x20; // CONFIG:
T_data[1] = 0x0e; // PTx, CRC 1byte
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0xe1; // 清空Tx_FIFO
SPI_SendData(T_data, R_data, 1);
T_data[0] = 0xa0; // 写Tx数据
for(i=0; i<No; i++)
{
T_data[1+i] = 9; // No<32byte
}
SPI_SendData(T_data, R_data, 1+No);
IO0SET = NRF_CE0; // 进入发送模式
}
void nrf24l01_test0(void)
{
T_data[0] = 0x17; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x00; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x01; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x02; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x03; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x04; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x05; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x06; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x07; // CONFIG
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 2);
T_data[0] = 0x0a; // CONFIG
T_data[1] = 0x00; // power down
T_data[1] = 0x00; // power down
T_data[1] = 0x00; // power down
T_data[1] = 0x00; // power down
T_data[1] = 0x00; // power down
SPI_SendData(T_data, R_data, 6);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -