/* ================= S O U R C E F I L E ==============================
*
* File Name : nRF905.c
* Description : nRF905驱动程序
*
* Redactor / Data : sudan / 2010-4-12
* - V1.0 nRF905驱动程序
* Revisor / Data :
* - V1.0 测试完成,功能正确.
*
* ===================================================================== */
/* ================= I N C L U D E F I L E ========================= */
#include "config.h"
#include "nRF905.h"
#include "uart.h"
/* ================= M A C R O D E F I N E ========================= */
/* ================= G L O B A L E V A R I A B L E ================= */
/* ================= S T A T I C G L O B A L E V A R I A B L E === */
uint8 g_nRF905_Ready;
uint8 g_RF_TX_Buf[RF_BUF_SIZE];
uint8 g_RF_Rx_Buf[RF_BUF_SIZE];
/* ================= S T A T I C C O N S T A N T S ==================*/
/* ================= S T A T I C F U N C T I O N =================== */
/* ------------------------------------------------------------------------
* Function Name : Delay_Nus()
* Description : 延时函数 延时N个微秒
*
* Input Parameter : Nus
* Output Parameter : No Parameter
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
void Delay_Nus(uint16 us)
{
while(us--)
{
NOP();
}
}
/* ------------------------------------------------------------------------
* Function Name : Delay_Nms()
* Description : 延时函数 延时N个毫秒
*
* Input Parameter : NmS
* Output Parameter : No Parameter
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
void Delay_Nms(uint16 ms)
{
uint16 i;
while(ms--)
{
i = 500;
while(i--)
{
NOP();
}
}
}
/* ------------------------------------------------------------------------
* Function Name : SPI_Init()
* Description : 初始化SPI 主机模式,fck/16, SPI方式0
*
* Input Parameter :
* Output Parameter :
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
void SPI_Init(void)
{
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
/* ------------------------------------------------------------------------
* Function Name : SPI_Write()
* Description : SPI写一个byte
*
* Input Parameter : cData 要发送的数据
* Output Parameter :
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
void SPI_Write(uint8 cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF) )); // 等待SPI发送完毕
}
/* ------------------------------------------------------------------------
* Function Name : SPI_Read()
* Description : SPI读一个byte
*
* Input Parameter :
* Output Parameter : SPI收到的数据
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
uint8 SPI_Read(void)
{
uint8 i;
SPDR = RC;
while(!(SPSR & (1<<SPIF) )); // 等待SPI接收完毕
i = SPDR;
return i;
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_Init()
* Description : 初始化nRF905的引脚,已经数据缓存区
*
* Input Parameter :
* Output Parameter :
* Global Parameter : No Parameter
* --------------------------------------------------------------------- */
void nRF905_Init(void)
{
uint8 i;
SET_SS();
CLR_TRX_CE();
CLR_TX_EN();
SET_PWR_UP();
Delay_Nms(5);
/* 发送缓冲区,接收缓冲区清零 */
for(i = 0; i < RF_BUF_SIZE; ++i)
{
g_RF_TX_Buf[i] = 0;
g_RF_Rx_Buf[i] = 0;
}
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_ReadStatus()
* Description : 读nRF905的状态寄存器
*
* Input Parameter :
* Output Parameter :
* Global Parameter : 状态寄存器的值
* --------------------------------------------------------------------- */
uint8 nRF905_ReadStatus(void)
{
uint8 val;
CLR_SS(); // 打开SPI
//SPI_Write(WC);
val = SPI_Read(); // 读状态
SET_SS(); // 关闭SPI
return val;
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_SetConfig()
* Description : 配置nRF905
*
* Input Parameter :
* Output Parameter :
* Global Parameter :
* --------------------------------------------------------------------- */
void nRF905_SetConfig(uint8 pwr) //配置nRF905 :0x0c:10db,0x08:6db,0x04:-2db,0x00:-10db
{
CLR_TRX_CE(); //设置nRF905为待机方式
NOP();
CLR_SS(); //打开SPI
SPI_Write(WC); // Write config command
// 配置字总共10个字节
SPI_Write(CH_NO_BYTE); // 中心频率低8位
SPI_Write(pwr | HFREQ_PLL | CH_NO_BIT8); // 发射+10dBm,发射频率433MHz,中心频率第9位=0
SPI_Write(TX_AFW_BYTE | RX_AFW_BYTE); // 接收地址宽度1字节,发送地址宽度1字节
SPI_Write(RX_PW_BYTE); // 接收数据宽度6字节,最大32字节
SPI_Write(TX_PW_BYTE); // 发送数据宽度6字节
SPI_Write(RX_ADDRESS_0); // 接收有效地址第1字节
SPI_Write(RX_ADDRESS_1); // 接收有效地址第2字节
SPI_Write(RX_ADDRESS_2); // 接收有效地址第3字节
SPI_Write(RX_ADDRESS_3); // 接收有效地址第4字节
SPI_Write(CRC_MODE | CRC_EN |XOF); // CRC16模式使能,晶体振荡器频率16MHz
SET_SS(); // 关闭SPI
g_nRF905_Ready = 1; //表示905配置完成
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_ReceivePacket()
* Description : nRF905的接收程序---收一包数据
*
* Input Parameter :
* Output Parameter :
* Global Parameter :
* --------------------------------------------------------------------- */
void nRF905_ReceivePacket(void)
{
uint8 i;
CLR_TX_EN();
SET_TRX_CE(); // 接收模式:开始监听
while(!(PINC & (1<<DR))); // 等待
CLR_TRX_CE(); //进入SB模式
CLR_SS();
SPI_Write(RRP);
for(i = 0; i < RF_BUF_SIZE; ++i)
{
g_RF_Rx_Buf[i] = SPI_Read();
}
SET_SS();
SET_TRX_CE(); //进入接收模式:监听
for(i = 0; i < RF_BUF_SIZE; ++i) //给PC送数据
{
RS232_TransmitByte(g_RF_Rx_Buf[i]);
}
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_ReceivePacket()
* Description : nRF905的发射程序---发一包数据
*
* Input Parameter :
* Output Parameter :
* Global Parameter :
* --------------------------------------------------------------------- */
void nRF905_SendPacket(uint32 addr) // uint32 addr
{
uint8 i;
SET_TX_EN();
CLR_SS();
SPI_Write(WTA); // 写指令
SPI_Write(addr); // 接收有效地址第1字节
SPI_Write(addr>>8); // 接收有效地址第2字节
SPI_Write(addr>>16); // 接收有效地址第3字节
SPI_Write(addr>>24); // 接收有效地址第4字节
SET_SS();
NOP();
NOP();
NOP();
CLR_SS();
SPI_Write(WTP);
/*for( i = 0; i < (RS232_rxTolNum); i++ ) //RS232_rxTolNum
{
SPI_Write(RS232_rxBuffer[i]);
}*/
for( i = 0; i < 6; i++ ) //RS232_rxTolNum
{
SPI_Write(RS232_rxBuffer[i]);
}
SET_SS();
SET_TRX_CE();
while(!(PINA & (1<<DR)));
CLR_TRX_CE();
CLR_TX_EN();
}
/* ------------------------------------------------------------------------
* Function Name : nRF905_ReceivePacket()
* Description : nRF905的发射程序---发一包数据
*
* Input Parameter :
* Output Parameter :
* Global Parameter :
* --------------------