关于ATmega16与NRF24L01通信
void delay1ms(uint n) void delay1us(uint n) void SPI_init(void) uchar SPI_RW(uchar data)//读写SPI uchar SPI_Read(uchar reg)//读24L01寄存器 uchar SPI_RW_Reg(uchar reg,uchar value)//写24L01 uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bit)//连续向24L01读多个数据 uchar SPI_Write_Buf(uchar reg,uchar*pBuf,uchar bit)//连续向24L01写多个数据 void init_NRF24L01(void)//NRF24L01初始化 void SetRX_Mode(void)//接收模式配置 uchar nRF24L01_RxPacket(uchar *rx_buf)//接收数据包 void main(void) 完整程序的下载地址:http://www.51hei.com/bbs/dpj-19028-1.html
{
uint i;
while(n--)
for(i=1;i<1714;i++);
}
{
while(n--)
asm("nop");
}
{
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;//状态寄存器
}
{
SPDR=data;
while(!(SPSR&BIT(SPIF)));//SPSR状态寄存器SPI中断标志位
return SPDR;
}
{
uchar reg_val;
Low_24L01_CSN;
SPI_RW(reg);//向24L01写入寄存器地址
reg_val=SPI_RW(0X00);//0X00为读指令
Hign_24L01_CSN;
return (reg_val); //返回读取的数据
}
{
uchar status;
Low_24L01_CSN;
status=SPI_RW(reg);//选择寄存器
SPI_RW(value);//向寄存器写入数据
Hign_24L01_CSN;
return(status);
}
{
uchar status1,uchar_ctr;
Low_24L01_CSN;
status1=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
Hign_24L01_CSN;
return(status1);
}
{
uchar status1,uchar_ctr;
Low_24L01_CSN;
status1=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
Hign_24L01_CSN;
return(status1);
}
{
SPI_init();
Low_24L01_CE;//空闲模式
Hign_24L01_CSN; //SPI关闭
Low_24L01_SCK;//关闭时钟
}
{
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 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);
}
{
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);
}
}
}
ATmega16NRF24L01通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)