📄 f211.#1
字号:
void rf211_init()
{
rf211Trx_Register_Wr(TRX_F0_ADDRESS,F0_CODE,0X20); //设置F0频率,433.9+0.01MHz
rf211Trx_Register_Wr(TRX_F1_ADDRESS,F1_CODE,0X20); //设置F1频率,433.9-0.01MHz
rf211Trx_Register_Wr(TRX_F2_ADDRESS,F2_CODE,0X20); //设置F2频率,433.9MHz
rf211Trx_Register_Wr(TRX_F3_ADDRESS,F3_CODE,0X20); //设置F3频率
rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,CTRL1_CODE,0X20); //设置CTRL1主控寄存器
rf211Trx_Register_Wr(TRX_DTR_ADDRESS,DTR_CODE,0X06); //设置DTR(data slicer input offset,left_snap)
rf211Trx_Register_Wr(TRX_WUC_ADDRESS,WUC_CODE,0X20); //设置WUC(WAKE_UP 控制寄存器)
rf211Trx_Register_Wr(TRX_WUR_ADDRESS,WUR_CODE,0X12); //设置WUR(WAKE_UP 数据速率寄存器
rf211Trx_Register_Wr(TRX_WUA_ADDRESS,WUA_CODE,0X19); //设置WUA(WAKE_UP 地址寄存器
rf211Trx_Register_Wr(TRX_CTRL2_ADDRESS,CTRL2_CODE,0X20); //设置CTRL2控制寄存器
}
//------------------------------------------------------------------------------//
// trx_addr:寄存器地址 trx_code:寄存器编码值 //
//------------------------------------------------------------------------------//
void rf211Trx_Register_Wr(unsigned char trx_addr,unsigned long trx_code,unsigned char trx_bits)
{
TRX_SCK=0; //置rf211的CLK线为低电平
TRX_SLE=0; //置rf211的SLE线为低电平
rf211Send_Trx_Addr(trx_addr); //写寄存器地址
rf211Send_Trx_High(); //设置R/W位为高,即为写状态
rf211Send_Trx_Data(trx_code,trx_bits); //写如配置该寄存器的参数数据
bit_delay();
TRX_SLE=1; //置rf211的SLE线为高,不允许对rf211进行读写操作
bit_delay();
bit_delay();
bit_delay();
}
//------------------------------------------------------------------------------//
// trx_addr:寄存器地址 trx_code:寄存器编码值 //
//------------------------------------------------------------------------------//
unsigned long rf211Trx_Register_Rd(unsigned char trx_addr,unsigned char trx_bits)
{
unsigned long r_code=0;
TRX_SCK=0; //置rf211的CLK线为低电平
TRX_SLE=0; //置rf211的SLE线为低电平
rf211Send_Trx_Addr(trx_addr); //写寄存器地址
rf211Send_Trx_Low(); //设置R/W位为低,即为读状态
r_code=rf211Read_Trx_Data(trx_bits); //写如配置该寄存器的参数数据
TRX_SLE=1; //置rf211的SLE线为高,不允许对rf211进行读写操作
bit_delay();
bit_delay();
return(r_code);
}
//------------------------------------------------------------------------------//
// 写积存器地址 //
//------------------------------------------------------------------------------//
void rf211Send_Trx_Addr(unsigned char trx_addr)
{
unsigned char inde=0;
trx_addr=trx_addr<<4; //取低4位数据
for(inde=0;inde<4;inde++)
{
if((trx_addr&0x80)==0x80) //如果为高输出1
rf211Send_Trx_High();
else rf211Send_Trx_Low();
trx_addr=trx_addr<<1; //左移一位
}
}
//------------------------------------------------------------------------------//
// trx_code:寄存器编码值 trx_bits:传输位数 //
//------------------------------------------------------------------------------//
void rf211Send_Trx_Data(unsigned long trx_code,unsigned char trx_bits)
{
unsigned char chbits=0;
for(chbits=0;chbits<trx_bits;chbits++) //写指定位数
{
if ((trx_code&0x80000000)==0x80000000)
rf211Send_Trx_High();
else rf211Send_Trx_Low();
trx_code=trx_code<<1; //左移一位
}
}
//-------------------------------------------------------------------------------//
// 从指定寄存器中读取设定位数的数据 //
//-------------------------------------------------------------------------------//
unsigned long rf211Read_Trx_Data(unsigned char trx_bits)
{
unsigned char inde=0;
unsigned long read_code=0;
for (inde =0;inde<trx_bits;inde++)
{
TRX_SCK=1;
if (TRX_SDATA==1) //为高
read_code=read_code|0x80000000;
else read_code=read_code|0x00000000;
read_code=read_code>>1; //右移一位
bit_delay();
TRX_SCK=0;
bit_delay();
}
return(read_code);
}
//-------------------------------写入高电平-------------------------------------//
void rf211Send_Trx_High()
{
TRX_SDATA=1;
bit_delay();
TRX_SCK=1;
bit_delay();
TRX_SCK=0;
bit_delay();
}
//-------------------------------写入低电平-------------------------------------//
void rf211Send_Trx_Low()
{
TRX_SDATA=0;
bit_delay();
TRX_SCK=1;
bit_delay();
TRX_SCK=0;
bit_delay();
}
void Timer2_Isr(void) interrupt 5
{
//DATAMSG =~DATAMSG;
//Timer2_count++;
}
void Int0_Isr(void) interrupt 0
{
RFLAG=1;
}
void timer0_Isr(void) interrupt 1
{
//DATAMSG=~DATAMSG;
TH0 = 0XF8; //定时100us
TL0 = 0X43;
timer0_count++;
level_count++;
}
void Uart_Isr(void) interrupt 4
{
if(RI) //开始接收数据
{
RI=0;
nFlag_RXSUCCESS=0;
INPUT_BUF[nRX_INDEX] = SBUF; //从SBUF寄存器里读出数据,放到接收数据的BUFFER里
if (nRX_INDEX>=1)
if((INPUT_BUF[nRX_INDEX-1])&&(INPUT_BUF[nRX_INDEX]))
{
nFlag_RXSUCCESS=0x55; //表示数据接收完毕,发送消息等待处理接收数据
nLen_Rx_Data=nRX_INDEX+1;
}
nRX_INDEX++;
}
else if (TI) //开始发送数据
{
TI=0; //清发送标志位
if (nLen_Tx_Data!=0)
{
SBUF =Tx_Data[nTx_Index++];
if (nTx_Index>=nLen_Tx_Data) //判断缓冲区的数据是否发送完毕
{
nTx_Index =0;
nLen_Tx_Data=0;
SendEndflag=1;
}
}
else SendEndflag=1;
}
}
//-------------------------------------------------------------------------------//
// -------配置为传输模式------- //
// TRANSMITMODE_CODE=0xFC //0xDC //
// 意义: PDN=1(RF211激活) //
// RXTX=1;(传输模式) //
// DATACLK=1;(DATACLK引脚无信号) //
// TXLCOCK=1;(PLL锁存才能传输) //
// PAPDAN=1; (TX放大器激活) //
// WUEN=1; (激活唤醒功能) //
// LANGSEL=0;(最小增益) //
// MVCC=0; (RSSI电压测量) //
//-------------------------------------------------------------------------------//
void Make_Transmit_Mode()
{
//DATAMSG=0;
rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,TRANSMITMODE_CODE,0X08); //设置CTRL1主控寄存器
}
//-------------------------------------------------------------------------------//
// -------配置为接收模式------- //
// TRANSMITMODE_CODE=0xB4 //0x94 //
// 意义: PDN=1(RF211激活) //
// RXTX=0;(接收模式) //
// DATACLK=1;(DATACLK引脚无信号) //
// TXLCOCK=1;(PLL锁存才能传输) //
// PAPDAN=0; (TX放大器无效) //
// WUEN=1; (激活唤醒功能) //
// LANGSEL=0;(最小增益) //
// MVCC=0; (RSSI电压测量) //
//-------------------------------------------------------------------------------//
void Make_Receive_Mode()
{
rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,RECEIVERMODE_CODE,0X08); //设置CTRL1主控寄存器
}
//-------------------------------------------------------------------------------//
// -------配置成为唤醒模式------ //
// WAKEWORD_CODE=0x80 //
// 意义: WUE=1(使能唤醒功能) //
// DATA=0(消息没有数据段) //
// STOP=0(固定数据长度,数据长度通过DATL设置,可从1到32) //
// DATL=00000(数据长度,1位---最小值) //
// ************************************************************ //
// //
// SLEEPMODE_CODE=0x34 //0x14 设置成为休眠模式,RF211定时扫描RF信号 //
// 意义: PDN=0 (RF211工作于掉电模式,只有串行接口处于激活状态) //
// RXTX=0 (处于接收模式) //
// DATACLK=1 (DATACLK引脚没有信号) //
// TXLOCK=1 (仅PLL锁定时传输) //
// PAPDN=0 (TX电源放大器处于掉电模式) //
// WUEN=1 (唤醒功能激活,依赖于WAKE_UP控制寄存器中的内容) //
// LANGSEL=0 (最小增益) //
// MVCC=0 (RSSI电压测量,这个值存储在STAT寄存器的MRSSI中) //
//-------------------------------------------------------------------------------//
void Make_Wakeup_Mode()
{
rf211Trx_Register_Wr(TRX_WUC_ADDRESS,WAKEWORD_CODE,0X08); //设置WUC寄存器
rf211Trx_Register_Wr(TRX_CTRL1_ADDRESS,SLEEPMODE_CODE,0X08); //设置CTRL1主控寄存器
}
//-------------------------------------------------------------------------------//
// ------读wakeup 数据寄存器------- //
//-------------------------------------------------------------------------------//
void Read_Wakeup_Data()
{
unsigned long wakeup_d=0;
wakeup_d=rf211Trx_Register_Rd(TRX_WUD_ADDRESS,0x02); //从WUD中读取数据,WAKE_UP消息数据
}
//-------------------------------------------------------------------------------//
// 组织传输原始数据 //
//-------------------------------------------------------------------------------//
void Transmit_Data_Dispose(char *In_Buf,unsigned int nLen)
{
unsigned int nInde=0;
char CheckSum=0;
nLen_Tx_Data=0;
for (nInde=0;nInde<nLen;nInde++)
{
OUTPUT_BUF[nInde]=In_Buf[nInde];
if (nInde>0) CheckSum=In_Buf[nInde-1]^In_Buf[nInde]; //校验和为各字节分别相异或后的结果
nLen_Tx_Data++;
}
OUTPUT_BUF[nInde++]=CheckSum; //将校验和压入缓冲区
OUTPUT_BUF[nInde++]='\r';
OUTPUT_BUF[nInde++]='\n';
nLen_Tx_Data=nLen_Tx_Data+1;
}
//-----------------------------------------------------------------------------//
// 监测接收的数据是否正确,如果正确发送接收成功消息Ok_Message //
// 否者发送接收失败消息Fail_Message //
//-----------------------------------------------------------------------------//
bit Receive_Data_CheckProcess()
{
unsigned char CheckSum=0;
unsigned int nInde=0;
for (nInde=1;nInde<nLen_Rx_Data-3;nInde++)
{
CheckSum=INPUT_BUF[nInde-1]^INPUT_BUF[nInde];
}
if (CheckSum=INPUT_BUF[nInde-3]) return(1); //比较校验和,如果相等返回1,否则返回0
else return(0);
nLen_Rx_Data=0; //清接收数据长度
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -