標(biāo)題: NRF24L01無線模塊接收-AVR程序代碼 [打印本頁]
作者: wangyin 時(shí)間: 2014-7-12 01:56
標(biāo)題: NRF24L01無線模塊接收-AVR程序代碼
以前學(xué)AVR時(shí)候?qū)懙囊恍┏绦,分享一?br />
#include
#include
#include "lcd12864.h"
#define uint unsigned int
#define uchar unsigned char
#define MISO PINB.6
#define SCK PORTB.7
#define MOSI PORTB.5
#define CSN PORTC.0
#define CE PORTC.1
#define IRQ PORTC.2
#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)答使能
#define EN_RXADDR 0x02 //接收地址允許
#define SETUP_AW 0x03 //設(shè)置地址寬度
#define SETUP_RETR 0x04 //建立自動(dòng)重發(fā)
#define RF_CH 0x05 //射頻通道
#define RF_SETUP 0x06 //射頻寄存器
#define STATUS 0x07 //狀態(tài)寄存器
#define OBSTERVE_TX 0x08 //發(fā)送檢測(cè)寄存器
#define CD 0x09 //載波檢測(cè)
#define RX_ADDR_P0 0x0a //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P1 0x0b //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P2 0x0c //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P3 0x0d //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P4 0x0e //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P5 0x0f //數(shù)據(jù)通道0接收地址
#define TX_ADDR 0x10 //發(fā)送地址
#define RX_PW_P0 0x11 //
#define RX_PW_P1 0x12 //
#define RX_PW_P2 0x13 //
#define RX_PW_P3 0x14 //
#define RX_PW_P4 0x15 //
#define RX_PW_P5 0x16 //
#define FIFO_STATUS 0x17 //FIFO狀態(tài)寄存器
#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 // 保留
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
uchar status;
uchar sta;
uchar str[30];
uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01}; //本地地址
uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01}; //接收地址
uchar TxBuf[5]={0x65,0x98,0xf3,0x02,0x08};
uchar SPI_RW(uchar uuchar)//SPI寫時(shí)序
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(uuchar&0x80);
uuchar=(uuchar<<1);
SCK=1;
uuchar|=MISO;
SCK=0;
}
return (uuchar);
}
uchar SPI_Read(uchar reg)//SPI讀取一個(gè)字節(jié)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
delay_ms(1);
reg_val=SPI_RW(0);
delay_ms(1);
CSN=1;
return (reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)//寫一個(gè)自接到寄存器函數(shù)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
delay_ms(1);
SPI_RW(value);
delay_ms(1);
CSN=1;
return (status);
}
uchar *ucharostr(uchar num)
{
uchar x00,xx,x0,x,n;
x00=num/100;
xx=num0;
x0=xx/10;
x=xx;
n=0;
if(x00!=0)
{
str[n]=x00+48;
n++;
}
if(!(x00==0&x0==0))
{
str[n]=x0+48;
n++;
}
str[n]=x+48;
n++;
str[n]='\0';
return str;
}
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar uchars)//用于讀數(shù)據(jù),reg:寄存器地址,pBuf:帶度數(shù)數(shù)據(jù)地址,uchars數(shù)據(jù)個(gè)數(shù)
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
{
pBuf[uchar_ctr]=SPI_RW(0);
}
CSN=1;
return (status);
}
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr
SPI_RW(*pBuf++);
CSN = 1; //關(guān)閉SPI
return(status); //
}
void init_NRF24L01(void)
{
delay_us(100);
CE=0; //射頻停止工作
CSN=1;
SCK=0;
IRQ=1;//中斷復(fù)位
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//寫本地地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//寫接收端地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);//頻道0自動(dòng),ACK應(yīng)答禁止
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//允許接收地址只有頻道0
SPI_RW_Reg(WRITE_REG+RF_CH,1);//設(shè)置信道工作2.4GHZ,收發(fā)必須一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//設(shè)置接收數(shù)據(jù)長(zhǎng)度,32字節(jié)
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//發(fā)射速率2MHZ,發(fā)射功率最大為0dB
}
void SetRX_Mode(void)//設(shè)置數(shù)據(jù)接收模式
{
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ中斷響應(yīng),16位CRC,接收模式
CE=1;
delay_us(130);
}
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar revale=0;
sta=SPI_Read(STATUS);
if(sta&0x40)//判斷是否接受到數(shù)據(jù)RX_DR
{
CE=0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//讀取接收數(shù)據(jù)
revale=1;
SPI_RW_Reg(WRITE_REG+STATUS,0xff);//寫1清楚中斷標(biāo)志
}
return revale;
}
void main(void)
{
uchar i;
uchar RxBuf[32];
uchar Buf0[5]={0,0,0,0,0};
i=0;
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB0;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xff;
DDRC=0xff;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
lcd12864_init();
delay_ms(10);
init_NRF24L01();
IRQ=1;
SPI_Read_Buf(RX_ADDR_P0,Buf0,5);//讀取0通道接收地址
delay_ms(100);
lcd12864_puts(ucharostr(Buf0[0]));
lcd12864_puts(ucharostr(Buf0[1]));
lcd12864_puts(ucharostr(Buf0[2]));
lcd12864_puts(ucharostr(Buf0[3]));
lcd12864_puts(ucharostr(Buf0[4]));
delay_ms(20);
SetRX_Mode();
delay_ms(50);
while (1)
{
SetRX_Mode();
delay_ms(20);
i=SPI_Read(CD);
if(i)//如果檢測(cè)到中斷產(chǎn)生
{ nRF24L01_RxPacket(RxBuf);
delay_ms(10);
lcd12864_gotoxy(0,0);
for(i=0;i<5;i++)
{
lcd12864_putchar(RxBuf);
delay_ms(2); }
for(i=5;i<10;i++)
{
lcd12864_putchar(RxBuf);
delay_ms(2);
}
for(i=10;i<16;i++)
{
lcd12864_putchar(RxBuf);
delay_ms(2);
}
i=0;
}
};
}
作者: yuhuikeji 時(shí)間: 2014-7-25 08:41
還不錯(cuò)哦。!
作者: 唯楚有才 時(shí)間: 2014-9-13 10:17
謝謝分享
作者: 我思故我在 時(shí)間: 2014-9-18 10:13
樓主好厲害,,,
作者: zk 時(shí)間: 2014-11-20 17:43
感覺這個(gè)模塊有點(diǎn)難!
作者: 77408187 時(shí)間: 2014-11-25 19:04
學(xué)習(xí)一下哈
作者: delay 時(shí)間: 2015-3-29 21:18
謝謝分享
作者: dege 時(shí)間: 2015-4-1 13:49
謝謝分享
作者: delay 時(shí)間: 2015-4-4 17:35
學(xué)習(xí)了謝謝分享
作者: 邱育 時(shí)間: 2015-8-10 01:35
在里面
沒找到我想要的東西。學(xué)姐可以教教嗎
作者: 緣分五月lck 時(shí)間: 2015-8-19 14:14
程序?qū)懙牟诲e(cuò)
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |