#include <avr/io.h>
#include <util/delay.h>
#include "nRF905_Config.h"
#include "nRF905.h"
unsigned char ReceiveBuffer[BUF_SIZE]; // RF接收缓冲区
unsigned char SendBuffer[BUF_SIZE]; // RF发送缓冲区
unsigned char ReceiveCount; // RF接收缓冲区接收个数
unsigned char SendCount; // RF发送缓冲区发送个数
void SPI_Init(void)
{
PORT_SPI |= (1<<MOSI)|(1<<MISO)|(1<<SCK)|(1<<SS); // 设置MOSI和SCK、SS为输出,其他为输入
DDR_SPI |= (1<<MOSI)|(1<<SCK)|(1<<SS);
SPCR = (1<<SPE)|(1<<MSTR)|(0<<CPOL)|(0<<SPR0); // 主机模式,fck/16, SPI方式0
}
unsigned char SPI_ReadWrite(unsigned char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF) )) // 等待SPI发送完毕
;
return SPDR;
}
void nRF905_Init(unsigned long nRF_rxaddr)
{
unsigned char i;
DDR_NRF905 |= ((1<<TX_EN)|(1<<TRX_CE)|(1<<PWR_UP)|(0<<DR)|(0<<AM)|(0<<CD));
PORT_NRF905 |= ((0<<TX_EN)|(0<<TRX_CE)|(1<<PWR_UP)|(1<<DR)|(1<<AM)|(1<<CD));
nRF905_SetConfig(nRF_rxaddr); // 初始化nRF905,并设置接收地址
nRF905_SetReceiveMode(); // 设置为接收模式
/* 发送缓冲区,接收缓冲区清零 */
for(i = 0; i < BUF_SIZE; ++i)
{
SendBuffer[i] = 0;
ReceiveBuffer[i] = 0;
}
}
unsigned char nRF905_ReadStatus(void)
{
unsigned char val;
CLR_SS(); // 打开SPI
val = SPI_ReadWrite(RC); // 读状态
SET_SS(); // 关闭SPI
return val;
}
void nRF905_SetSendMode(void)
{
_delay_ms(1);
SET_TX_EN(); // 设置为发送模式
/*asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");*/
_delay_ms(1);
CLR_TRX_CE(); // 待机PORTD &= ~(1<<TRX_CE);
_delay_ms(1);
}
void nRF905_SetReceiveMode(void)
{
/*asm("nop");
asm("nop");
asm("nop");
*/
CLR_TX_EN(); // 设置为接收模式
//asm("nop");
_delay_ms(1);
SET_TRX_CE(); // 使能接收
/*asm("nop");
asm("nop");
asm("nop");
*/
_delay_ms(1);
}
void nRF905_SendStart(void)
{
SET_TRX_CE(); // 开始发送
_delay_ms(10); // while(DR!=1);
CLR_TRX_CE(); // 待机模式
}
void nRF905_SetConfig(unsigned long nRFAddr) //配置nRF905
{
CLR_TRX_CE(); //设置nRF905为待机方式
asm("nop");
CLR_SS(); //打开SPI
// 配置字总共10个字节
SPI_ReadWrite(WC); // Write config command
SPI_ReadWrite(CH_NO_BYTE); // 中心频率低8位
SPI_ReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); // 发射+10dBm,发射频率433MHz,中心频率第9位=0
SPI_ReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); // 接收地址宽度4字节,发送地址宽度4字节 0100 0100
SPI_ReadWrite(RX_PW_32BYTE); // 接收数据宽度32字节
SPI_ReadWrite(TX_PW_32BYTE); // 发送数据宽度32字节
SPI_ReadWrite((nRFAddr >> 24)); // 接收有效地址第1字节
SPI_ReadWrite((nRFAddr >> 16) & 0xff); // 接收有效地址第2字节
SPI_ReadWrite((nRFAddr >> 8) & 0xff); // 接收有效地址第3字节
SPI_ReadWrite(nRFAddr & 0xff); // 接收有效地址第4字节
SPI_ReadWrite(CRC16_EN | XOF_16MHz); // CRC16模式使能,晶体振荡器频率16MHz
SET_SS(); // 关闭SPI
if ( PORT_NRF905 & (1 << TX_EN) ) //再回到原来的无线收发模式
{
CLR_TRX_CE(); //设置nRF905为待机方式
}
else
{
SET_TRX_CE(); //设置nRF905为工作方式
}
}
void nRF905_ReceivePacket(void)
{
unsigned char i;
nRF905_SetReceiveMode(); // 设置接收模式
// CD=1且AM=0,DR=0
//if( ( PIN_NRF905 & (1<<CD) )
// && ((PIND & ((1<<AM)|(1<<DR)) ) == 0)
// )
{
CLR_TRX_CE(); // 待机模式
asm("nop");
CLR_SS();
SPI_ReadWrite(RRP);
for(i = 0; i < 32; ++i)
{
ReceiveBuffer[i] = SPI_ReadWrite(0xff);
}
SET_SS();
while(PIN_NRF905 & ((1<<AM)|(1<<DR)) ); // 等待
ReceiveCount = 32;
SET_TRX_CE();
// LED_ON();
}
}
/* 参数为接收端的地址,即:发送给谁? */
void nRF905_SendPacket(unsigned long nRF_rxaddr)
{
unsigned char i;
if( (PIN_NRF905 & ((1<<CD)|(1<<AM)|(1<<DR))) == 0 ) // 周边无射频信号
{
nRF905_SetSendMode();
//LED_ON();
asm("nop");
asm("nop");
asm("nop");
_delay_ms(1);
CLR_SS();
SPI_ReadWrite(WTA); // 写发送地址
SPI_ReadWrite((nRF_rxaddr >> 24)); // 接收有效地址第1字节
SPI_ReadWrite((nRF_rxaddr >> 16) & 0xff); // 接收有效地址第2字节
SPI_ReadWrite((nRF_rxaddr >> 8) & 0xff); // 接收有效地址第3字节
SPI_ReadWrite(nRF_rxaddr & 0xff); // 接收有效地址第4字节
SET_SS();
asm("nop");
asm("nop");
asm("nop");
CLR_SS();
SPI_ReadWrite(WTP);
for( i = 0; i < 32; ++i )
{
SPI_ReadWrite(SendBuffer[i]);
}
SET_SS();
SendCount = 32;
nRF905_SendStart(); // 开始发送
nRF905_SetReceiveMode(); // 发送完毕回到接收模式
//LED_OFF();
}
}