?? nrf2401a.c
字號(hào):
#include "config.h"
extern void DelayMs(uchar ms);
extern void DelayUs(uint us);
//注意:
//1、nef2401A配置字是先寫第15字節(jié)的!!
//2、發(fā)送后要延時(shí)等發(fā)送結(jié)束后才能轉(zhuǎn)回接收模式,否則數(shù)據(jù)發(fā)送不出
#define SIZE 25 //最大數(shù)據(jù)包長(zhǎng)度 32-ADDR4-CRC2=26Byte
#define ADDRSIZE 4 //地址長(zhǎng)度Byte
#define CH_NO 2 //頻段編號(hào)
#define BPS_1M //編譯控制:1M or 250Kbps
uchar TxBuf[SIZE],RxBuf[SIZE];
/*-------------------------------------------------------------------------------------------
nrf2401A配置寄存器宏定義
nrf2401A配置寄存器(15Byte)
工作頻率f=2.4G+CH_NO*1MHz
-------------------------------------------------------------------------------------------*/
#define RX_ADDRESS 0xCCCCCCCC //接收有效地址(本方)
#define TX_ADDRESS 0xCCCCCCCC //發(fā)送有效地址(對(duì)方)
#define CH_NO_FREQ CH_NO<<1 //工作頻段 Byte1.7-2
#define RX_EN 1 //接收發(fā)送切換 Byte1.0 1接收 0發(fā)送
#define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
#define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
#define CM_SHOCK 64 //收發(fā)模式ShockBurst Byte2.6
#define CM_DIRECT 0 //收發(fā)模式DirectMode Byte2.6
#define RFDR_1M 32 //空中Baud=1M Byte2.5
#define RFDR_250K 0 //空中Baud=250K Byte2.5
#define XOF_20MHz 4*4 //晶體振蕩器頻率20MHz Byte2.4~2
#define XOF_16MHz 3*4 //晶體振蕩器頻率16MHz
#define XOF_12MHz 2*4 //晶體振蕩器頻率12MHz
#define XOF_8MHz 1*4 //晶體振蕩器頻率8MHz
#define XOF_4MHz 0*4 //晶體振蕩器頻率4MHz
#define PA_PWR_0 0 //輸出功率-20dBm Byte2.1~0
#define PA_PWR_1 1 //輸出功率-10dBm
#define PA_PWR_2 2 //輸出功率-5dBm
#define PA_PWR_3 3 //輸出功率 0dBm
#define ADDR_W (ADDRSIZE<<5) //地址位數(shù) Byte3.7~2
#define CRC_MODE_16BIT 2 //CRC16模式 Byte3.1 1
#define CRC_MODE_8BIT 0 //CRC8模式 Byte3.1
#define CRC_EN 1 //CRC使能 Byte3.0 1
#define CRC16_EN 3 //CRC16模式使能
#define CRC8_EN 1 //CRC8模式使能
#define RX_ADDRESS_0 RX_ADDRESS & 0xff //通道1接收有效地址第1字節(jié) Byte4
#define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字節(jié) Byte5
#define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字節(jié) Byte6
#define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字節(jié) Byte7
#define RX_ADDRESS_4 0 //通道1接收有效地址第5字節(jié) Byte8
#define RX_ADDRESS2 0 //Byte9,10,11,12,13字節(jié)為通道2接收地址
#define DATA1_W SIZE*8 //接收通道1數(shù)據(jù)包長(zhǎng)度,Bit計(jì)算 Byte14
#define DATA2_W SIZE*8 //接收通道2數(shù)據(jù)包長(zhǎng)度,Bit計(jì)算 Byte15
#define TX_ADDRESS_4 0 //發(fā)送有效地址第5字節(jié)
#define TX_ADDRESS_3 TX_ADDRESS >> 24 //發(fā)送有效地址第4字節(jié)
#define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //發(fā)送有效地址第3字節(jié)
#define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //發(fā)送有效地址第2字節(jié)
#define TX_ADDRESS_0 TX_ADDRESS & 0xff //發(fā)送有效地址第1字節(jié)
//寫1Byte
void nrf2401A_WR(uchar val)
{uchar temp,i;
//MSB first 高位開(kāi)始,先輸出DATA,然后CLK_Up,再CLK_Dn
SET(DDRA,DATA);//置DATA輸出
temp=val;
for (i=0;i<8;i++)
{
if ((temp&0x80)>0)
SET(PORTA,DATA);
else
CLR(PORTA,DATA);
NOP();
SET(PORTA,CLK);
NOP();
CLR(PORTA,CLK);
temp=temp<<1;
}
}
//讀1Byte
uchar nrf2401A_RD()
{uchar temp,i;
//MSB first 高位開(kāi)始,先讀入DATA,然后CLK_Up,再CLK_Dn
CLR(DDRA,DATA);//置DATA輸入
temp=0;
for (i=0;i<8;i++)
{
temp=temp<<1;
if ((PINA&(1<<DATA))>0)
temp=temp|1;
NOP();
SET(PORTA,CLK);
NOP();
CLR(PORTA,CLK);
}
return temp;
}
//PwrDown->StandBy
void nrf2401A_StandBy()
{
SET(PORTA,PWR2);
CLR(PORTA,CE);
CLR(PORTA,CS);
}
//->PwrDown
void nrf2401A_Off()
{
CLR(PORTA,PWR2);
CLR(PORTA,CE);
CLR(PORTA,CS);
}
//配置模式
void nrf2401A_RwOn()
{
SET(PORTA,PWR2);
CLR(PORTA,CE);
SET(PORTA,CS);
}
//工作模式
void nrf2401A_Run()
{
SET(PORTA,PWR2);
CLR(PORTA,CS);//first
SET(PORTA,CE);
}
//配置nRF2401A
void nrf2401A_Config(void)
{
nrf2401A_RwOn();//配置狀態(tài)
nrf2401A_WR(DATA2_W);
nrf2401A_WR(DATA1_W);
nrf2401A_WR(RX_ADDRESS2);
nrf2401A_WR(RX_ADDRESS2);
nrf2401A_WR(RX_ADDRESS2);
nrf2401A_WR(RX_ADDRESS2);
nrf2401A_WR(RX_ADDRESS2);
nrf2401A_WR(RX_ADDRESS_4);
nrf2401A_WR(RX_ADDRESS_3);
nrf2401A_WR(RX_ADDRESS_2);
nrf2401A_WR(RX_ADDRESS_1);
nrf2401A_WR(RX_ADDRESS_0);
nrf2401A_WR(CRC16_EN|ADDR_W);//CRC16,AddrWidth
#ifdef BPS_1M
nrf2401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK);//0dbm,16M,1Mbps,ShockBurst
#else
nrf2401A_WR(PA_PWR_3|XOF_16MHz|CM_SHOCK);//0dbm,16M,250Kbps,ShockBurst
#endif
nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan
nrf2401A_StandBy();//執(zhí)行配置
}
//接收模式
void nrf2401A_RxOn()
{
nrf2401A_RwOn();
nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan
nrf2401A_Run();
}
//發(fā)送模式
void nrf2401A_TxOn()
{
nrf2401A_RwOn();
nrf2401A_WR(CH_NO_FREQ); //TxMode,Chan
nrf2401A_Run();
}
//初始化nrf2401A
void nrf2401A_Init()
{
CLR(PORTA,CLK);//
nrf2401A_StandBy();
DelayMs(10);//!!!must >3ms
nrf2401A_Config();
nrf2401A_RxOn();//接收狀態(tài)
}
//寫Tx地址
void nrf2401A_SetTxAddr()
{
nrf2401A_WR(TX_ADDRESS_3);
nrf2401A_WR(TX_ADDRESS_2);
nrf2401A_WR(TX_ADDRESS_1);
nrf2401A_WR(TX_ADDRESS_0);
}
//寫Tx數(shù)據(jù)
void nrf2401A_SetData()
{uchar i;
for (i=0;i<SIZE;i++)
nrf2401A_WR(TxBuf[i]);
}
//發(fā)送TxBuf中的數(shù)據(jù)
void nrf2401A_SendData()
{
nrf2401A_TxOn();
SET(PORTA,CE);
nrf2401A_SetTxAddr();//寫發(fā)送地址
nrf2401A_SetData();//寫數(shù)據(jù)
CLR(PORTA,CE);//啟動(dòng)發(fā)送
//發(fā)送完畢后進(jìn)入StandBy
}
//讀出接收到的數(shù)據(jù)
void nrf2401A_ReadData()
{uchar i;
for (i=0;i<SIZE;i++)
{
RxBuf[i]=nrf2401A_RD();
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -