|
發(fā)一份自己調(diào)試好的nRF24L01庫, 網(wǎng)上的動不動都不好使
自己寫的多通道的
單片機源程序如下:
- #include "nRF24L01Drv.h"
- #include "USART.h"
- #include "stdio.h"
- #include "config.h"
- #include <intrins.h>
- #include "spi.h"
- /**
- * 1.改多路方法:
- * NUM_USED_PIPE 改為使用的路數(shù), RX_ADDRESS 分別指定 RX的地址,
- * RX_PLOAD_WIDTH 改為每一路的PAYLOAD
- * NRF24L01_RxPacket 里面知道是哪一路在接收
- *
- *
- * 2. 發(fā)送時自動將CONFIG 備份,然后切換TX后再切換回去
- * 并且備份RX_ADDR_P0
- *
- * 3. 通道0,1 支持40位地址寫入, 但是通道2,3,4,5只支持1位寫入,其他地址與1通道相同
- *
- * 4. NRF24L01_TxPacket 支持寫入TX_PLOAD_WIDTH 個字節(jié)
- *
- * 5. NRF24L01_RxPacket 第一個參數(shù)是PIPE_NUMBER, 第二個參數(shù)是 讀入的 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
- }
- /*********************************************/
- /* 函數(shù)功能:給24L01的寄存器寫值(一個字節(jié)) */
- /* 入口參數(shù):reg 要寫的寄存器地址 */
- /* value 給寄存器寫的值 */
- /* 出口參數(shù):status 狀態(tài)值 */
- /*********************************************/
- 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
- }
- /*************************************************/
- /* 函數(shù)功能:讀24L01的寄存器值 (一個字節(jié)) */
- /* 入口參數(shù):reg 要讀的寄存器地址 */
- /* 出口參數(shù):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
- }
- /*********************************************/
- /* 函數(shù)功能:讀24L01的寄存器值(多個字節(jié)) */
- /* 入口參數(shù):reg 寄存器地址 */
- /* *pBuf 讀出寄存器值的存放數(shù)組 */
- /* len 數(shù)組字節(jié)長度 */
- /* 出口參數(shù):status 狀態(tài)值 */
- /*********************************************/
- 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
- }
- /**********************************************/
- /* 函數(shù)功能:給24L01的寄存器寫值(多個字節(jié)) */
- /* 入口參數(shù):reg 要寫的寄存器地址 */
- /* *pBuf 值的存放數(shù)組 */
- /* len 數(shù)組字節(jié)長度 */
- /**********************************************/
- u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
- {
- u8 status, u8_ctr;
- NRF_CSN = 0;
- status = SPI_RW(reg); //發(fā)送寄存器值(位置),并讀取狀態(tài)值
- for (u8_ctr = 0; u8_ctr < len; u8_ctr++)
- SPI_RW(*pBuf++); //寫入數(shù)據(jù)
- NRF_CSN = 1;
- return status; //返回讀到的狀態(tài)值
- }
- /*********************************************/
- /* 函數(shù)功能:24L01接收數(shù)據(jù) */
- /* 入口參數(shù):rxbuf 接收數(shù)據(jù)數(shù)組 */
- /* 返回值: 1 成功收到數(shù)據(jù) */
- /* 0 沒有收到數(shù)據(jù) */
- /*********************************************/
- 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); //讀取狀態(tài)寄存器的值
- state = NRF24L01_Read_Reg(STATUS); //清除TX_DS或MAX_RT中斷標(biāo)志
- //TX1_write2buff(state);
- if (!(fifo_state & _BV(RX_EMPTY))) //接收到數(shù)據(jù)
- {
- NRF_CSN = 0;
- i = SPI_RW(RF24_NOP); // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
- *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中斷標(biāo)志
- NRF24L01_RW_Reg(FLUSH_RX, 0xFF); //清除TX_DS或MAX_RT中斷標(biāo)志
- revale = RX_PLOAD_WIDTH[*pipe_num];
- }
- NRF_CE = 1;
- return revale; //沒收到任何數(shù)據(jù)
- }
- /**********************************************/
- /* 函數(shù)功能:設(shè)置24L01為發(fā)送模式 */
- /* 入口參數(shù):txbuf 發(fā)送數(shù)據(jù)數(shù)組 */
- /* 返回值; 0x10 達到最大重發(fā)次數(shù),發(fā)送失敗*/
- /* 0x20 成功發(fā)送完成 */
- /* 0xff 發(fā)送失敗 */
- /**********************************************/
- 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); // 裝載數(shù)據(jù)
- NRF24L01_RW_Reg(WRITE_REG + CONFIG, config & ~_BV(0)); // 設(shè)置為PTX
- NRF_CE = 1;
- //置高CE,激發(fā)數(shù)據(jù)發(fā)送
- while (NRF_IRQ == 1)
- {
- ;
- } //等待發(fā)送完成
- state = NRF24L01_Read_Reg(STATUS); //讀取狀態(tài)寄存器的值
- NRF24L01_RW_Reg(WRITE_REG + STATUS, state); //清除TX_DS或MAX_RT中斷標(biāo)志
- if (state & MAX_TX) //達到最大重發(fā)次數(shù)
- {
- 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) //發(fā)送完成
- {
- return TX_OK;
- }
- return 0xff; //發(fā)送失敗
- }
- /********************************************/
- /* 函數(shù)功能:檢測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
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
nRF24L01Drv.rar
(3.84 KB, 下載次數(shù): 52)
2020-5-25 23:51 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|