nRFObj::nRFObj(void) { Init (); }
void nRFObj::Init(void) { SpiInit (); nRFInit (); }
void nRFObj::nRFInit(void) { PORTC |= (0 << TX_EN)//设置接收方式 |(0 << TRX_CE)//设置nRF905为待机方式 |(1 << PWR)//nRF905上电 |(0 << UPLCK); PORTD |= (0 << CD) |(0 << DR) |(0 << AM);
DDRC |= (1 << TX_EN) |(1 << TRX_CE) |(1 << PWR) |(0 << UPLCK);
EICRA = (0 << ISC11) |(1 << ISC10) |(0 << ISC01) |(1 << ISC00); EIMSK = (1 << INT1) | (1 << INT0); SetConfig(0); SetReceiveMode();//设置接收模式 for (int i = 0; i < 32; i ++) { SendBuffer = 0; ReceiveBuffer = 0; } }
void nRFObj::SpiInit(void) { /* 设置MOSI 和SCK 及SS 为输出,其他为输入 */ PORTB |= (1 << MOSI) |(1 << MISO) |(1 << SCK) |(1 << SS);//关闭SPI DDRB |= (1 << MOSI) |(1 << MISO) |(1 << SCK) |(1 << SS); /* 使能SPI 主机模式,设置时钟速率为fck/16 ,SPI方式0*/ SPCR = (1 << SPE) |(1 << MSTR) |(0 << CPOL) |(0 << SPR0); }
unsigned char nRFObj::SpiReadWrite(unsigned char cData) { /* 启动数据传输 */ SPDR = cData; /* 等待传输结束 */ while(!(SPSR & (1 << SPIF))) { // __watchdog_reset (); } return SPDR; }
unsigned char nRFObj::ReadStatus(void) { unsigned char val; PORTB &= ~(1 << SS);//打开SPI val = SpiReadWrite(RC);//读状态 PORTB |= (1 << SS);//关闭SPI return val;//返回nRF905状态字 }
void nRFObj::SetSendMode(void)//设置发送模式 { __nop();/// __nop();/// __nop();/// PORTC |= (1 << TX_EN); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); PORTC &= ~(1 << TRX_CE);//设置nRF905为待机方式 __delay_cycles(1000); }
void nRFObj::SetReceiveMode(void)//设置接收模式 { __nop(); __nop(); __nop(); PORTC &= ~(1 << TX_EN); __nop(); PORTC |= (1 << TRX_CE);//设置nRF905为工作方式 __nop(); __nop(); __nop(); }
void nRFObj::SendStart(void) { __nop(); __nop(); __nop(); /// _delay_loop_(1); PORTC |= (1 << TRX_CE);//设置nRF905为工作方式 /// _delay_loop_(10); __nop(); __nop(); __nop(); /* __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); */ PORTC &= ~(1 << TRX_CE);//设置nRF905为待机方式 /// _delay_loop_(1); __nop(); __nop(); __nop(); }
void nRFObj::SetConfig(unsigned long nRFAddr)//配置nRF905 { PORTC &= ~(1 << TRX_CE);//设置nRF905为待机方式 __nop(); PORTB &= ~(1 << SS);//打开SPI SpiReadWrite(WC); // Write config command SpiReadWrite(CH_NO_BYTE); //中心频率低8位 SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0 SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节 SpiReadWrite(RX_PW_32BYTE); //接收数据宽度32字节 SpiReadWrite(TX_PW_32BYTE); //发送数据宽度32字节 SpiReadWrite((nRFAddr >> 24)); //接收有效地址第1字节 SpiReadWrite((nRFAddr >> 16) & 0xff); //接收有效地址第2字节 SpiReadWrite((nRFAddr >> 8) & 0xff); //接收有效地址第3字节 SpiReadWrite(nRFAddr & 0xff); //接收有效地址第4字节 SpiReadWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz PORTB |= (1 << SS);//关闭SPI if (PORTC & (1 << TX_EN))//再回到原来的无线收发模式 { PORTC &= ~(1 << TRX_CE);//设置nRF905为待机方式 } else { PORTC |= (1 << TRX_CE);//设置nRF905为工作方式 } }
void nRFObj::ReceiveCallback(void)//无线接收模块 { SetReceiveMode();//设置接收模式 if ((PIND & (1 << CD))//接收到CD信号 && ((PIND & ((1 << AM) | (1 << DR))) == 0))//此时不应该有AM和DR信号 { PORTC &= ~(1 << TRX_CE);//设置nRF905为待机方式 __nop(); PORTB &= ~(1 << SS);//打开SPI SpiReadWrite(RRP); for (int i = 0; i < 32; i ++) { ReceiveBuffer = SpiReadWrite(0xff); } PORTB |= (1 << SS);//关闭SPI ReceiveCount = 32;//接收到32个字节的数据 PORTC |= (1 << TRX_CE);//设置nRF905为工作方式 // if ((ReceiveBuffer[30] == 0x55) && (ReceiveBuffer[31] == 0xaa)) // if (ReceiveBuffer[31] == 0xaa) // { PORTB |= (1 << BUZZER); PORTB |= (1 << LED); // } } }
void nRFObj::SendCallback(void)//无线发送模块 { if ((PIND & ((1 << CD) | (1 <<AM) | (1 << DR))) == 0)//周边无射频信号 { SetSendMode();//设置发送模式 PORTB |= (1 << LED); __nop(); __nop(); __nop(); PORTB &= ~(1 << SS);//打开SPI SpiReadWrite(WTA);//写发送地址 for (int i = 0; i < 4; i ++) { SpiReadWrite(SendBuffer); } PORTB |= (1 << SS);//关闭SPI __nop(); __nop(); __nop(); PORTB &= ~(1 << SS);//打开SPI SendBuffer[30] = 0x55; SendBuffer[31] = 0xaa; SpiReadWrite(WTP);// Write payload command for (int i = 0; i < 32; i ++) { SpiReadWrite(SendBuffer); } PORTB |= (1 << SS);//关闭SPI SendCount = 32;//接收到32个字节的数据 SendStart();//开始发送 SetReceiveMode();//设置接收模式 PORTB &= ~(1 << LED); } }
|