標(biāo)題:
AVR單片機(jī)nrf24l01驅(qū)動(dòng)程序
[打印本頁]
作者:
zhongzhide
時(shí)間:
2018-9-3 21:35
標(biāo)題:
AVR單片機(jī)nrf24l01驅(qū)動(dòng)程序
avr單片機(jī)源程序如下:
//ICC-AVR application builder : 2018/6/1 21:34:07
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "SPI.h"
#include"key.h"
#define uint unsigned int
#define uchar unsigned char
#define IRQ 0 //輸入
#define MISO 1 //輸入
#define MOSI 2 //輸出
#define SCK 3 //輸出
#define CSN 4 //輸出
#define CE 5 //輸出
//================== NRF24L01的接收和發(fā)送地址 ===================
#define TX_ADR_WIDTH 5 // 5個(gè)字節(jié)的TX地址長(zhǎng)度
#define RX_ADR_WIDTH 5 // 5個(gè)字節(jié)的RX地址長(zhǎng)度
#define PLOAD_WIDTH 12 // 1-32 字節(jié) 數(shù)據(jù)設(shè)定長(zhǎng)度
#define TX_PLOAD_WIDTH 32 // ?個(gè)字節(jié)的TX數(shù)據(jù)長(zhǎng)度
#define RX_PLOAD_WIDTH 32 // ?個(gè)字節(jié)的RX數(shù)據(jù)長(zhǎng)度
//================== NRF24L01寄存器指令 =======================
#define READ_REG 0x00 // 讀寄存器
#define WRITE_REG 0x20 // 寫寄存器
#define RD_RX_PLOAD 0x61 // 讀取接收數(shù)據(jù)
#define WR_TX_PLOAD 0xA0 // 寫待發(fā)數(shù)據(jù)
#define FLUSH_TX 0xE1 // 沖洗發(fā)送 FIFO
#define FLUSH_RX 0xE2 // 沖洗接收 FIFO
#define REUSE_TX_PL 0xE3 // 定義重復(fù)裝載數(shù)據(jù)
#define nop 0xFF // 保留
//================== SPI(nRF24L01)寄存器地址 =====================
#define CONFIG 0x00 // 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式
#define EN_AA 0x01 // 自動(dòng)應(yīng)答功能設(shè)置
#define EN_RXADDR 0x02 // 可用信道設(shè)置
#define SETUP_AW 0x03 // 收發(fā)地址寬度設(shè)置
#define SETUP_RETR 0x04 // 自動(dòng)重發(fā)功能設(shè)置
#define RF_CH 0x05 // 工作頻率設(shè)置
#define RF_SETUP 0x06 // 發(fā)射速率、功耗功能設(shè)置
#define STATUS 0x07 // 狀態(tài)寄存器
#define OBSERVE_TX 0x08 // 發(fā)送監(jiān)測(cè)功能
#define CD 0x09 // 地址檢測(cè)
#define RX_ADDR_P0 0x0A // 頻道0接收數(shù)據(jù)地址
#define RX_ADDR_P1 0x0B // 頻道1接收數(shù)據(jù)地址
#define RX_ADDR_P2 0x0C // 頻道2接收數(shù)據(jù)地址
#define RX_ADDR_P3 0x0D // 頻道3接收數(shù)據(jù)地址
#define RX_ADDR_P4 0x0E // 頻道4接收數(shù)據(jù)地址
#define RX_ADDR_P5 0x0F // 頻道5接收數(shù)據(jù)地址
#define TX_ADDR 0x10 // 發(fā)送地址寄存器
#define RX_PW_P0 0x11 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P1 0x12 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P2 0x13 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P3 0x14 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P4 0x15 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define RX_PW_P5 0x16 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
#define FIFO_STATUS 0x17 // FIFO棧入棧出狀態(tài)寄存器設(shè)置
//uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定義一個(gè)靜態(tài)發(fā)送地址
uchar TX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA2};//接收本機(jī) 地址
uchar RX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA1};//發(fā)送目標(biāo) 地址
uchar TX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA1};//接收本機(jī) 地址
uchar RX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA2};//發(fā)送目標(biāo) 地址
uchar RX_BUF[RX_ADR_WIDTH]={0x00,0x00,0x00,0x00,0x00}; //接收數(shù)據(jù)存放數(shù)組
uchar TX_BUF[TX_ADR_WIDTH]={0x00,0x01,0x02,0x03,0x04}; //發(fā)送的數(shù)據(jù)
uchar flag=0;
//US
void delayus(uint i)
{
uchar j;
while(i)
{
for(j=0;j<=7;j++)
{
NOP();
}
i--;
}
}
void delay_ms(uint i)
{
while(i--)
{
unsigned int j;
for(j=1;j<=1332;j++);
}
}
// 這個(gè)函數(shù)設(shè)置nRF24L01為接收模式,等待接收發(fā)送設(shè)備的數(shù)據(jù)包
/**************************************************/
void RX_Mode(void)
{
RET_CE;
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0x40); // 選擇射頻通道0x40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_ADR_WIDTH); // 接收通道0選擇和發(fā)送通道相同有效數(shù)據(jù)寬度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 數(shù)據(jù)傳輸率1Mbps,發(fā)射功率0dBm,低噪聲放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校驗(yàn),上電,接收模式
EST_CE; // 拉高CE啟動(dòng)接收設(shè)備
}
//這個(gè)函數(shù)設(shè)置nRF24L01為發(fā)送模式,(CE=1持續(xù)至少10us),
//130us后啟動(dòng)發(fā)射,數(shù)據(jù)發(fā)送結(jié)束后,發(fā)送模塊自動(dòng)轉(zhuǎn)入接收模式等待應(yīng)答信號(hào)。
/**************************************************/
void TX_Mode(uchar * BUF)
{
RET_CE;
SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_ADR_WIDTH); // 寫數(shù)據(jù)包到TX FIFO
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動(dòng)應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自動(dòng)重發(fā)延時(shí)等待250us+86us,自動(dòng)重發(fā)10次
SPI_RW_Reg(WRITE_REG + RF_CH, 0x40); // 選擇射頻通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 數(shù)據(jù)傳輸率1Mbps,發(fā)射功率0dBm,低噪聲放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校驗(yàn),上電
EST_CE;
}
/*
void main(void)
{
uchar s=0x00;
DDRB=0xff;
DDRC=0xff;
PORTB=0x00;
PORTC=0x00;
ioinit();
delay_ms(10);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS1, TX_ADR_WIDTH); // 寫入發(fā)送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS1, TX_ADR_WIDTH); // 接收設(shè)備接收通道0使用和發(fā)送設(shè)備相同的發(fā)送地址
RX_Mode();
while(1)
{
if(!(PINA&0x01))
{EST_IRQ ; s=SPI_Read(READ_REG + STATUS);
if(s&0x40) //接收到數(shù)據(jù)標(biāo)志
{
SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, RX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG + STATUS, s);
}}
if((RX_BUF[0]==0x00)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))
PORTB=0xff;
if((RX_BUF[0]==0x01)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))
PORTB=0x00;
}
}
*/
//按鍵修改發(fā)送數(shù)組的值SPI_Write_Buf(WR_TX_PLOAD, TxBuf, PLOAD_WIDTH);
void anjian(void)
{
switch(key())
{
case 1: break;
case 2: TX_BUF[0]=0x00;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新數(shù)據(jù)包到TX FIFO
case 3: TX_BUF[0]=0x01;PORTB=0xff;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新數(shù)據(jù)包到TX FIFO
}
}
void main(void)
{
unsigned char HXout,HGout,FYout;//控制參數(shù)輸出值 0~128~255
unsigned char HangXiang=128,HengGun=128,FuYang=128;//微調(diào)變量
uchar s=0x00;
DDRD&=0x1f;
PORTD|=0xe0;//按鍵初始化
DDRB=0xff;
DDRC=0xff;
PORTB=0x00;
TCCR0=0x0b;//CTC工作模式 64分頻
TCNT0=0x00;
TIMSK=0x02;//比較匹配中斷允許
TIFR=0x02;//寫1清0
OCR0=0xfa;//定時(shí)2ms
SEI();//開啟總中斷 to初始化
ioinit();
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
無線 NRF24L01.rar
(281.08 KB, 下載次數(shù): 45)
2018-9-3 21:28 上傳
點(diǎn)擊文件名下載附件
ICC編譯器
下載積分: 黑幣 -5
作者:
jjj12345
時(shí)間:
2019-7-29 14:29
很不錯(cuò),謝謝分享
作者:
chinabj2019
時(shí)間:
2019-8-18 00:42
nrf51822如何利用AVR作為遠(yuǎn)端執(zhí)行模塊?
作者:
鵬博士PBs
時(shí)間:
2019-8-18 09:08
遠(yuǎn)程操作嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1