AVR單片機(jī)nRF24L01發(fā)送接收驅(qū)動(dòng)程序
掃描二維碼
隨時(shí)隨地手機(jī)看文章
#include "iom16v.h"
#include "macros.h"
#include "12864.h"
//------------------------------------------------------------------------------
//spi標(biāo)志
#define DDR_SPI DDRB
#define DD_MOSI 5
#define DD_MISO 6
#define DD_SCK 7
#define DD_SS 4
#define CE PB3
#define IRQ PB2
//--------------------------------NRF24L01接口定義--------------------------------
//------------------------------------------------------------------------------
//#define NRF24L01_MISOPB6//輸入0
#defineHign_24L01_MISOPORTB|=(1 << PB6)
#defineLow_24L01_MISOPORTB &= ~(1 << PB6)
#defineRead_24L01_MISOPINB & (1 << PB6)
//#define NRF24L01_MOSIPB5//輸出1
#defineHign_24L01_MOSIPORTB |= (1 << PB5)
#defineLow_24L01_MOSIPORTB &= ~(1 << PB5)
#defineRead_24L01_MOSIPINB & (1 << PB5)
//#define NRF24L01_SCKPB7//輸出1
#defineHign_24L01_SCKPORTB |= (1 << PB7)
#defineLow_24L01_SCKPORTB &= ~(1 << PB7)
#defineRead_24L01_SCKPINB & (1 << PB7);
//#define NRF24L01_CSNPB4//輸出1
#defineLow_24L01_CSNPORTB &= ~(1 << PB4)
#defineHign_24L01_CSNPORTB |= (1 << PB4)
//#define NRF24L01_CEPB3//輸出1
#defineHign_24L01_CEPORTB |= (1 << PB3)
#defineLow_24L01_CEPORTB &= ~(1 << PB3)
#defineRead_24L01_CEPINB & (1 << PB3)
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH5// 發(fā)送地址長(zhǎng)度,最大長(zhǎng)度為5 5*8=40 bit
#define RX_ADR_WIDTH5// 接收地址長(zhǎng)度
#define TX_PLOAD_WIDTH32// 發(fā)送字節(jié)長(zhǎng)度,
#define RX_PLOAD_WIDTH32// 接收字節(jié)長(zhǎng)度
uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//發(fā)送地址
uchar RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG0x00// 讀寄存器指令
#define WRITE_REG0x20// 寫寄存器指令
#define RD_RX_PLOAD0x61// 讀取接收數(shù)據(jù)指令
#define WR_TX_PLOAD0xA0// 寫待發(fā)數(shù)據(jù)指令
#define FLUSH_TX0xE1// 沖洗發(fā)送 FIFO指令
#define FLUSH_RX0xE2// 沖洗接收 FIFO指令
#define REUSE_TX_PL0xE3// 定義重復(fù)裝載數(shù)據(jù)指令
#define NOP0xFF// 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG0x00// 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式
#define EN_AA0x01// 自動(dòng)應(yīng)答功能設(shè)置
#define EN_RXADDR0x02// 可用信道設(shè)置
#define SETUP_AW0x03// 收發(fā)地址寬度設(shè)置
#define SETUP_RETR0x04// 自動(dòng)重發(fā)功能設(shè)置
#define RF_CH0x05// 工作頻率設(shè)置
#define RF_SETUP0x06// 發(fā)射速率、功耗功能設(shè)置
#define STATUS0x07// 狀態(tài)寄存器
#define OBSERVE_TX0x08// 發(fā)送監(jiān)測(cè)功能
#define CD0x09// 地址檢測(cè)
#define RX_ADDR_P00x0A// 頻道0接收數(shù)據(jù)地址
#define RX_ADDR_P10x0B// 頻道1接收數(shù)據(jù)地址
#define RX_ADDR_P20x0C// 頻道2接收數(shù)據(jù)地址
#define RX_ADDR_P30x0D// 頻道3接收數(shù)據(jù)地址
#define RX_ADDR_P40x0E// 頻道4接收數(shù)據(jù)地址
#define RX_ADDR_P50x0F// 頻道5接收數(shù)據(jù)地址
#define TX_ADDR0x10// 發(fā)送地址寄存器
#define RX_PW_P00x11// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P10x12// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P20x13// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P30x14// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P40x15// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P50x16// 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define FIFO_STATUS0x17// FIFO棧入棧出狀態(tài)寄存器設(shè)置
//*************************************************************
//*************************************************
//*******void spi_init()初始化SPI
//**************************************************
void spi_init()
{
Hign_24L01_CSN;
DDR_SPI = (1<
DDR_SPI&=~((1<
SPCR=(1< SPSR=0; } //************************************************** //*******uchar SPI_RW(uchar date)讀寫SPI //************************************************** uchar SPI_RW(uchar date) { SPDR=date; while(!(SPSR&(1< return SPDR; } //************************************************** //*******uchar SPI_Read(uchar reg)讀24L01寄存器 //************************************************** uchar SPI_Read(uchar reg) { uchar reg_val; Low_24L01_CSN; SPI_RW(reg); reg_val = SPI_RW(0); Hign_24L01_CSN; return(reg_val); } //************************************************** //*******uchar SPI_RW_Reg(uchar reg, uchar value) //寫24L01寄存器 //************************************************** uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; Low_24L01_CSN; status = SPI_RW(reg); SPI_RW(value); Hign_24L01_CSN; return(status); } //************************************************** //*******uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites) //讀24L01 寄存器BUFF //************************************************** uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites) { uint status1,uchar_ctr; Low_24L01_CSN; status1 = SPI_RW(reg); for(uchar_ctr=0;uchar_ctr pBuf[uchar_ctr] = SPI_RW(0); Hign_24L01_CSN; return(status1); } //************************************************** //*******uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites) //寫24L01 寄存器BUFF //************************************************** uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites) { uchar status1,uchar_ctr; Low_24L01_CSN;//SPI使能 status1 = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr SPI_RW(*pBuf++); Hign_24L01_CSN;//關(guān)閉SPI return(status1);// } //************************************************** //*******void SetRX_Mode(void) //接收模式設(shè)置 //************************************************** void SetRX_Mode(void) { Low_24L01_CE; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //寫接收地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);//0通道自動(dòng)應(yīng)答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//數(shù)據(jù)通道0 SPI_RW_Reg(WRITE_REG + RF_CH,0);//射頻通道 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//寫通道0 接受數(shù)據(jù)長(zhǎng)度 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //0db 1M SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //接收模式 Hign_24L01_CE;//開始接收 delayus(200);//注意不能太小 } //************************************************** //*******uchar nRF24L01_RxPacket(uchar* rx_buf) //接收數(shù)據(jù)包 //************************************************** uchar nRF24L01_RxPacket(uchar* rx_buf) { uchar sta,flag=0; sta=SPI_Read(STATUS);// 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況 if(sta&0x40)// 判斷是否接收到數(shù)據(jù)RX_DR==1? { Low_24L01_CE;// StandBy I模式 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer flag =1;//讀取數(shù)據(jù)完成標(biāo)志 } SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志 return (flag); } //************************************************** //*******void nRF24L01_TxPacket(uchar * tx_buf) //發(fā)送數(shù)據(jù)包 //************************************************** void nRF24L01_TxPacket(uchar * tx_buf) { uchar sta=0; uchar flag=0; Low_24L01_CE;//StandBy I模式 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);// 裝載數(shù)據(jù) SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);// SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);// SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f); //500+86us SPI_RW_Reg(WRITE_REG + RF_CH, 0);// SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);// IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送 delayms(2); Hign_24L01_CE;//置高CE,激發(fā)數(shù)據(jù)發(fā)送 delayus(10); Low_24L01_CE; } void init_NRF24L01(void) { spi_init(); Low_24L01_CE;// 空閑模式 Hign_24L01_CSN;// SPI 關(guān)閉 Low_24L01_SCK;// 關(guān)閉時(shí)鐘 }