📄 rf905.c
字号:
//RF905 IO口定义
sbit MISO = P1^1; //SPI输出
sbit MOSI = P1^2; //SPI输入
sbit CSN = P1^3; //SPI使能 低电平有效
sbit SCK = P1^4; //SPI时钟
sbit PWR_UP = P1^5; //数字输入 1 芯片上电
sbit TX_EN = P1^6; //数字输入 1 TX模式 0 RX模式
sbit TRX_CE = P1^7; //数字输入 1 使能芯片发射或接收
sbit DR = P3^2; //数字输出 1 接收或发射数据完成
sbit AM = P3^3; //数字输出 1 地址匹配
sbit CD = P3^4; //数字输出 1 载波检测
sbit RF905_indcator = P1^0;//RF905状态指示灯,若处于发射状态则点亮。
#define ON 0 //亮
#define OFF 1 //灭
//SPI指令
#define WC 0x00 //写配置寄存器
#define RC 0x10 //读配置寄存器
#define WTP 0x20 //向TX-Payload寄存器写入发送有效数据
#define RTP 0x21 //从TX-Payload寄存器读取发送有效数据
#define WTA 0x22 //向TX-Address寄存器写入发送地址
#define RTA 0x23 //从TX-Address寄存器读取发送地址
#define RRP 0x24 //从RX-Payload寄存器读取接收到的有效数据
//
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
bdata unsigned char DATA_BUF; //SPI读/写缓冲区
#define DATA_BUFF7 ((DATA_BUF&BYTE_BIT7) != 0) //DATA_BUF第7位
#define DATA_BUFF0 ((DATA_BUF&BYTE_BIT0) != 0) //DATA_BUF第0位
//unsigned char RF905_DATA_BUFF[32]={"TTx Test!"};//无线通讯模块接收发送数据缓冲区
//RF905寄存器配置
unsigned char idata RF905_REG[10]=
{
0x4c, //CH_NO,配置频段在423MHZ
0x2C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x20,0x20, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x5E, //CRC充许,8位CRC校验,外部时钟信号使能,输出4MHz,16M晶振
};
unsigned char code TxAddress[4]={0xCC,0xCC,0xCC,0xCC};
static void delay(unsigned char n)
{
unsigned int i;
while(n--)
for(i=0;i<80;i++);
}
//SPI 读一个字节
unsigned char spi_read(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
return DATA_BUF;
}
//SPI 写一个字节
void spi_write(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA_BUFF7) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
//配置RF905
void set_RF905_REG(void)
{
unsigned char i;
CSN=0;
spi_write(WC);
for(i=0;i<10;i++)
{
spi_write(RF905_REG[i]);
}
CSN=1;
}
//
void set_Tx_address(void)
{
unsigned char i;
CSN=0;
spi_write(WTA);
for(i=0;i<4;i++)
{
spi_write(TxAddress[i]);
}
CSN=1;
}
//读RF905配置寄存器
void read_RF905_REG(unsigned int *p)
{
unsigned char i;
CSN=0;
spi_write(RC);
for(i=0;i<10;i++)
{
*p=spi_read();
p++;
}
CSN=1;
}
void set_Tx_modle(void)
{
TX_EN=1;
TRX_CE=1;
delay(1);
TRX_CE=0;
}
void set_Rx_modle(void)
{
TRX_CE=1;
TX_EN=0;
}
void set_standby_modle(void)
{
TRX_CE=0;
}
//初始化nRF905
void init_RF905(void)
{
CSN=1; // SPI 禁止
SCK=0; // SPI 时钟信号初始化为低电平
DR=1; // 初始化 DR
AM=1; // 初始化 AM
CD=1; // 初始化 CD
PWR_UP=1; // nRF905 上电
TRX_CE=0; // 设置 nRF905 为 standby 模式
TX_EN=0; // 设置 radio 为 Rx 模式
delay_ms(5);
set_RF905_REG();
set_Tx_address();
}
void Tx_packet(void)
{
unsigned char i;
CSN=0;
spi_write(WTP);
spi_write(buf_length);
for(i=0;i<31;i++)
{
spi_write(buf[i]);
}
CSN=1;
}
void Rx_packet(void)
{
unsigned char i;
CSN=0;
spi_write(RRP);
buf_length=spi_read();
for(i=0;i<31;i++)
{
buf[i]=spi_read();
}
CSN=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -