📄 nrf905.c
字号:
#include<ATMEL\REGX52.H>
#include <INTRINS.H>
#include <stdio.h>
#include "config.h"
#include"905int.h"
uchar TxBuf[SIZE],RxBuf[SIZE];
extern void DelayMs(uint ms);
extern void DelayUs(uint us);
//配置nRF905
unsigned char nrf905_SpiRW(unsigned char val) using 0
{
unsigned char i,m;
ACC = val;
for (i = 8; i > 0; i --)
{
CY = MISO;//取数SO
ACC=ACC << 1;//存数据ACC.0读数据ACC.7同时进行
MOSI = CY;//送数据SI
SCK = 1;//上升沿打入数据
for(m=8;m>0;m--)
{
_nop_();
}
SCK = 0;//下降沿读入数据(首次为假动作)
}
return ACC;
}
void nrf905_Config(void)
{
CSN=0; // Spi 片选开
nrf905_SpiRW(WC); // Write config command
nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
nrf905_SpiRW(TX_AFW_2BYTE | RX_AFW_2BYTE); //接收地址宽度4字节,发送地址宽度4字节
nrf905_SpiRW(RX_PW_32BYTE); //接收数据宽度32字节
nrf905_SpiRW(TX_PW_32BYTE); //发送数据宽度32字节
nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
nrf905_SpiRW(0x18); //CRC16模式使能,晶体振荡器频率16MHz
CSN=1; // Disable Spi
}
//PwrDown->StandBy
void nrf905_StandBy()
{
PWR=1;
TRXCE=0;
TX_EN=0;
}
//->PwrDown
void nrf905_Off()
{
PWR=0;
}
//->ShockBurst Send
void nrf905_TxOn()
{
PWR=1;
TX_EN=1;
TRXCE=0;
}
//->ShockBurst Send
void nrf905_TxSend()
{
TRXCE=1;
DelayUs(20);//>10us
TRXCE=0;//只发送一次
}
//->ShockBurst Recv
void nrf905_RxOn()
{
PWR=1;
TX_EN=0;//maybe first
TRXCE=1;
}
//初始化nrf905
void nrf905_Init()
{
nrf905_StandBy();
DelayMs(10);//!!!must >3ms
nrf905_Config();
//nrf905_SpiTest();//test...
nrf905_RxOn();
}
//测试:通过读配置,判断SPI操作是否正确
//void nrf905_SpiTest()
//{uchar i;
// CSN=0;
// nrf905_SpiRW(RC); //读配置
//for (i=0;i<10;i++)
// {
// RxBuf[i]= nrf905_SpiRW(0);//read from nrf905
// }
// CSN=1;
//}
//写Tx地址
void nrf905_SetTxAddr()
{
CSN=0;
nrf905_SpiRW(WTA); //写Tx地址
nrf905_SpiRW(TX_ADDRESS_0);
nrf905_SpiRW(TX_ADDRESS_1);
//nrf905_SpiRW(TX_ADDRESS_2);
//nrf905_SpiRW(TX_ADDRESS_3);
CSN=1;
}
//写Tx数据
void nrf905_SetData()
{uchar i;
CSN=0;
nrf905_SpiRW(WTP); //写TxPayload
for (i=0;i<SIZE;i++)
{
nrf905_SpiRW(TxBuf[i]);
}
CSN=1;
}
//等待发送结束
void nrf905_WaitSended()
{
while (DR==0)
{
_nop_() ;
}
}
//发送TxBuf中的数据
void nrf905_SendData()
{
nrf905_TxOn();//切换到发送模式
nrf905_SetTxAddr();//写发送地址
nrf905_SetData();//写数据
nrf905_TxSend();//启动发送
nrf905_WaitSended();//等待发送结束
}
//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
nrf905_TxOn();
nrf905_TxSend();
nrf905_WaitSended();
}
//读出接收到的数据
void nrf905_ReadData()
{
uchar i;
CSN=0;
nrf905_SpiRW(RRP); //读RxPayload
for (i=0;i<SIZE;i++)
{
RxBuf[i]=nrf905_SpiRW(0);//read...
}
CSN=1;
}
void RfSendProc()
{uchar i;
for (i=0;i<32;i++) TxBuf[i]=i+i;
nrf905_SendData();//发送测试数据
nrf905_RxOn();//重新回到接收状态
}
void RfRecvProc()
{uchar i;
//if ((PIND&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
if (AM==0)
{
LED0 =0;
return;
}
else
{
LED0=1;
}
if (DR==0)
{
LED1=0;
return;//DR=1时表示数据接收对而且Crc正确
}
else
{
LED1=1;
}
//已经接收到数据
nrf905_ReadData();//读出...
for (i=0;i<32;i++)
{ if (RxBuf[i]!=(i+i)) 99999999999999999999999999999999999999999999999999999999999999999999999999999
return;
}
//数据接收正确...灯指示
LED5=1;
//从机回送数据包,这样双方都能指示是否收到有效数据包
}
void main()
{ P0=0x00;
nrf905_Init();
while(1)
{
//RfSendProc();
RfRecvProc();
}
}
void DelayMs(uint ms)
{char i;
for (i=0;i<ms;i++)
{DelayUs(1000);
}
return;
}
void DelayUs(uint us)
{uint i;
for (i=0;i<us;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -