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 <
{
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);
}
}
|
|