?? nrf2401a.c
字號:
#include "config.h"
extern void DelayMs(uchar ms);
extern void DelayUs(uint us);
//注意:
//1、nef2401A配置字是先寫第15字節的!!
//2、發送后要延時等發送結束后才能轉回接收模式,否則數據發送不出
#define SIZE 25 //最大數據包長度 32-ADDR4-CRC2=26Byte
#define ADDRSIZE 4 //地址長度Byte
#define CH_NO 2 //頻段編號
#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 //發送有效地址(對方)
#define CH_NO_FREQ CH_NO<<1 //工作頻段 Byte1.7-2
#define RX_EN 1 //接收發送切換 Byte1.0 1接收 0發送
#define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
#define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
#define CM_SHOCK 64 //收發模式ShockBurst Byte2.6
#define CM_DIRECT 0 //收發模式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) //地址位數 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字節 Byte4
#define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字節 Byte5
#define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字節 Byte6
#define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字節 Byte7
#define RX_ADDRESS_4 0 //通道1接收有效地址第5字節 Byte8
#define RX_ADDRESS2 0 //Byte9,10,11,12,13字節為通道2接收地址
#define DATA1_W SIZE*8 //接收通道1數據包長度,Bit計算 Byte14
#define DATA2_W SIZE*8 //接收通道2數據包長度,Bit計算 Byte15
#define TX_ADDRESS_4 0 //發送有效地址第5字節
#define TX_ADDRESS_3 TX_ADDRESS >> 24 //發送有效地址第4字節
#define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //發送有效地址第3字節
#define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //發送有效地址第2字節
#define TX_ADDRESS_0 TX_ADDRESS & 0xff //發送有效地址第1字節
//寫1Byte
void nrf2401A_WR(uchar val)
{uchar temp,i;
//MSB first 高位開始,先輸出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 高位開始,先讀入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();//配置狀態
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();//執行配置
}
//接收模式
void nrf2401A_RxOn()
{
nrf2401A_RwOn();
nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan
nrf2401A_Run();
}
//發送模式
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();//接收狀態
}
//寫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數據
void nrf2401A_SetData()
{uchar i;
for (i=0;i<SIZE;i++)
nrf2401A_WR(TxBuf[i]);
}
//發送TxBuf中的數據
void nrf2401A_SendData()
{
nrf2401A_TxOn();
SET(PORTA,CE);
nrf2401A_SetTxAddr();//寫發送地址
nrf2401A_SetData();//寫數據
CLR(PORTA,CE);//啟動發送
//發送完畢后進入StandBy
}
//讀出接收到的數據
void nrf2401A_ReadData()
{uchar i;
for (i=0;i<SIZE;i++)
{
RxBuf[i]=nrf2401A_RD();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -