📄 nrf2401a_pub.c
字号:
/****************************************************************************
**
** ERC-RF2401无线收发模块驱动程序
**
** 用户须知:
** 该驱动程序为傻瓜版本,无需对模块过多了解,使用简单
** 用户唯一需要的就是对实际的IO管脚重新定义
** 原驱动开发使用CPU类型为 AVR ATmega48,IDE环境为IAR
** 用户使用接口函数只有三个:
** nRF2401AInitializtion() nRF2401AScanf() nRF2401APrintf()
** 模式切换全部由驱动内部软件处理
** 更多代码实例参照RF2401-FE模块开发手册
** http://www.hzfeidi.com.cn
**
** 杭州ERC实验室 参上
***************************************************************************/
#include "nRF2401A_pub.h"
/******************************************基本函数********************************************/
/*8bit写入*/
void nRF2401AWrite8Bit(unsigned char byte)
{
unsigned char temp;
nRF2401A_WRITE_DATA();
for(temp=8;temp>0;temp--)
{
nRF2401A_DATA = (byte&0x80)>>7;
byte = byte<<1;
nRF2401A_CLK1 = 0;
nRF2401A_CLK1 = 0;
nRF2401A_CLK1 = 0;
nRF2401A_CLK1 = 1;
nRF2401A_CLK1 = 1;
}
nRF2401A_CLK1 = 0;
}
/*1通道8bit读出*/
unsigned char nRF2401ARead8BitChannel_1(void)
{
unsigned char temp;
unsigned char byte = 0x00;
nRF2401A_READ_DATA();
for(temp=8;temp>0;temp--)
{
byte = byte<<1;
nRF2401A_CLK1 = 1;
nRF2401A_CLK1 = 1;
nRF2401A_CLK1 = 1;
nRF2401A_CLK1 = 1;
byte = byte|(nRF2401A_DATA_PIN&0x01);
nRF2401A_CLK1 = 0;
}
return(byte);
}
/****************************************扩展函数*******************************************/
/*配置寄存器*/
void nRF2401AConfigRegisters(unsigned char* p)
{
unsigned char temp;
nRF2401A_CONFIG_MODE();
for(temp=0; temp<15; temp++)
{
nRF2401AWrite8Bit(p[temp]);
}
nRF2401A_STANDBY_MODE();
}
/*写通道1发送数据寄存器*/
void nRF2401AWriteTxPayload(unsigned char* p,unsigned char total)
{
unsigned char temp;
nRF2401A_ACTIVE_MODE();
nRF2401AWrite8Bit(0xcc);//发送地址高8位默认设定为0xcc
nRF2401AWrite8Bit(0xcc);//发送地址低8位默认设定为0xcc
for(temp=0; temp<total; temp++)
{
nRF2401AWrite8Bit(p[temp]);
}
nRF2401A_STANDBY_MODE();
}
/*读通道1接收数据寄存器*/
void nRF2401AReadRxPayload(unsigned char* p,unsigned char total)
{
unsigned char temp;
nRF2401A_ACTIVE_MODE();
for(temp=0; temp<total; temp++)
{
p[temp] = nRF2401ARead8BitChannel_1();
}
}
/****************************************常用函数*******************************************/
/*初始化函数*/
void nRF2401AInitializtion()
{
nRF2401A_IO_INITIALIZTION();
nRF2401A_CONFIG_MODE();
for(unsigned char time=0; time<50; time++)
{
for(unsigned char i=0; i<250; i++);
}//延迟3毫秒,稳定时间
nRF2401AWrite8Bit(nRF2401AConfig_Byte14);
nRF2401AWrite8Bit(nRF2401AConfig_Byte13);
nRF2401AWrite8Bit(nRF2401AConfig_Byte12);
nRF2401AWrite8Bit(nRF2401AConfig_Byte11);
nRF2401AWrite8Bit(nRF2401AConfig_Byte10);
nRF2401AWrite8Bit(nRF2401AConfig_Byte9);
nRF2401AWrite8Bit(nRF2401AConfig_Byte8);
nRF2401AWrite8Bit(nRF2401AConfig_Byte7);
nRF2401AWrite8Bit(nRF2401AConfig_Byte6);
nRF2401AWrite8Bit(nRF2401AConfig_Byte5);
nRF2401AWrite8Bit(nRF2401AConfig_Byte4);
nRF2401AWrite8Bit(nRF2401AConfig_Byte3);
nRF2401AWrite8Bit(nRF2401AConfig_Byte2);
nRF2401AWrite8Bit(nRF2401AConfig_Byte1);
nRF2401AWrite8Bit(nRF2401AConfig_Byte0);
nRF2401A_STANDBY_MODE();
nRF2401A_ACTIVE_MODE();
}
/*接收通道1数据包(28字节)*/
unsigned char nRF2401AScanf(unsigned char* p)
{
if (nRF2401A_DR1_PIN==0){
return (0);}
nRF2401AReadRxPayload(p,28);
return(1);
}
/*发送通道1数据包(28字节)*/
void nRF2401APrintf(unsigned char* p)
{
nRF2401A_CONFIG_1BIT(0); //配置为发射
nRF2401AWriteTxPayload(p,28);
for(unsigned char time=0; time<10; time++)
{
for(unsigned char i=0; i<250; i++);
}//延迟1280us //适合250K的传输速率 Tsby2txSB+Toa(Tsby2txSB=195us Toa=1/datarate*(#databits+1)=1/250000*257=1028us)
nRF2401A_CONFIG_1BIT(1); //配置为接收
nRF2401A_ACTIVE_MODE();
}
/**********************************************/
/*发送范例
unsigned char tx_buf[28];
unsigned char rx_buf[28];
void main()
{
nRF2401AInitializtion();
tx_buf[0] = 0;
tx_buf[1] = 1;//在发送数组中写入所需信息
while(1)
{
nRF2401APrintf(tx_buf);
//用发送函数调用发送数组,将其打包发送
}
}
*/
/*接收范例
unsigned char tx_buf[28];
unsigned char rx_buf[28];
void main()
{
nRF2401AInitializtion();
while(1)
{
while(nRF2401AScanf(rx_buf)!=1);
//当没有接收到数据包时候无限循环,一旦接收到数据包则将其写入所指定的32字节接收数组rx_buf中
PORTB = rx_buf[0];
//将接收到的数据包的第一个字节从B口输出
}
}
*/
/*转发包范例
unsigned char buf[28];
void main()
{
nRF2401AInitializtion();
while(1)
{
while(nRF2401AScanf(buf)!=1);//等待收到数据包
nRF2401APrintf(buf);//将收到的数据包原样发送
//注释:nRF2401APrintf() nRF2401AScanf() 两个函数调用顺序完全随意不用考虑两者间的内在影响
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -