微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于ATmega16与NRF24L01通信

关于ATmega16与NRF24L01通信

时间:11-30 来源:互联网 点击:

void delay1ms(uint n)
{
uint i;
while(n--)
for(i=1;i<1714;i++);
}

void delay1us(uint n)
{
while(n--)
asm("nop");
}

void SPI_init(void)
{
Hign_24L01_CSN;
DDRB|=BIT(PB5)|BIT(PB7)|BIT(PB4)|BIT(PB2);//将单片机MOSI CSN CE SCK置为输出
DDRB&=~BIT(PB6)&~BIT(PB3);//将单片机MISO IRQ置为输入
SPCR|=BIT(SPE)|BIT(MSTR)|BIT(SPR0);//单片机SPI接口寄存器设置:使能SPI,主机模式,数据MSB先发送,0模式,16分频
SPSR=0;//状态寄存器
}

uchar SPI_RW(uchar data)//读写SPI
{
SPDR=data;
while(!(SPSR&BIT(SPIF)));//SPSR状态寄存器SPI中断标志位
return SPDR;
}

uchar SPI_Read(uchar reg)//读24L01寄存器
{
uchar reg_val;

Low_24L01_CSN;
SPI_RW(reg);//向24L01写入寄存器地址
reg_val=SPI_RW(0X00);//0X00为读指令
Hign_24L01_CSN;
return (reg_val); //返回读取的数据
}

uchar SPI_RW_Reg(uchar reg,uchar value)//写24L01
{
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 bit)//连续向24L01读多个数据
{
uchar status1,uchar_ctr;

Low_24L01_CSN;
status1=SPI_RW(reg);

for(uchar_ctr=0;uchar_ctrpBuf[uchar_ctr]=SPI_RW(0x00);
Hign_24L01_CSN;
return(status1);
}

uchar SPI_Write_Buf(uchar reg,uchar*pBuf,uchar bit)//连续向24L01写多个数据
{
uchar status1,uchar_ctr;

Low_24L01_CSN;
status1=SPI_RW(reg);

for(uchar_ctr=0;uchar_ctrSPI_RW(*pBuf++);
Hign_24L01_CSN;
return(status1);
}

void init_NRF24L01(void)//NRF24L01初始化
{
SPI_init();
Low_24L01_CE;//空闲模式
Hign_24L01_CSN; //SPI关闭
Low_24L01_SCK;//关闭时钟
}

void SetRX_Mode(void)//接收模式配置
{
Low_24L01_CE;
//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);//为了应答接收设备,接收通道0地址和发送地址相同
SPI_RW_Reg(WRITE_REG+EN_AA,0X01);//数据通道0自动应答允许
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);//接收通道0允许
SPI_RW_Reg(WRITE_REG+RF_CH,0X40);//射频通道 2.4GHZ
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//写通道0接收数据长度
SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);//发射频率0dBm 发射速率1MHZ
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);//接收模式
Hign_24L01_CE;//开始接收
delay1us(200);
}

uchar nRF24L01_RxPacket(uchar *rx_buf)//接收数据包
{
uchar sta,flag;

flag=0;
sta=SPI_Read(STATUS);//读取状态寄存器的值判断数据接收情况
if(sta&0X40)
{
Low_24L01_CE;//待机I模式
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//单片机读取寄存器的数据
flag=1;//接收成功标志
SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
SPI_Read(FLUSH_RX);
}
return(flag);
}

void main(void)
{
uchar RX_BUF[32];

DDRA=0XFF;
PORTA&=~BIT(PA7)&~BIT(PA6);
init_NRF24L01();
SetRX_Mode();
while(1)
{
if(nRF24L01_RxPacket(RX_BUF))
{
PORTA|=BIT(PA7)|BIT(PA6);
delay1ms(200);
}
}
}

完整程序的下载地址:http://www.51hei.com/bbs/dpj-19028-1.html

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top