📄 nrf905.c
字号:
/****************************************************************************
* 文 件 名:nRF905.c
* 功 能:nRF905的接收与发送
* 说 明:包含发送与接收的所有函数。
* 作 者:TANK
* 邮 箱:tank3221@sina.com
* 完成时间:2007年5月25日
****************************************************************************/
#include "config.h"
/*--------------------------------------------------
引脚连接预定义区
---------------------------------------------------*/
#define PWR 1<<16 // P1.16 掉电控制
#define EN 1<<17 // P1.17 收发选择
#define CE 1<<18 // P1.18 收发启动
#define TEST1 1<<19 // P1.19 测试引脚1
#define TEST2 1<<20 // P1.20 测试引脚2
#define CD 0<<23 // P0.23 载波检测
#define AM 0<<25 // P0.25 地址匹配
#define DR 0<<24 // P0.24 数据完毕
#define RD 1<<24 // P0.24 ready信号。
#define CSN 1<<20 // P0.20 从机片选
/****************************************************************************
* 名 称:Delay()
* 功 能:短软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void Delay(uint32 dly)
{
for(; dly>0; dly--);
}
/****************************************************************************
* 名 称:nRF905_init()
* 功 能:905各控制、信号线引脚初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
void nRF905_init(void)
{
PINSEL0 |= 0x00000005; // 设置I/O连接到UART0
PINSEL1 = 0x00000000;
IO0DIR = CSN | // CSN <--> P0.20 片选输出线
CD | // CD <--> P0.23 CD 信号线
AM | // AM <--> P0.24 AM 信号线
DR ; // DR <--> P0.25 DR 信号线
IO1DIR = PWR | // PWR 控制线
CE | // CE 控制线
EN | // EN 控制线
TEST1 | // test1 测试线
TEST2 ; // test2 测试线
}
/*----------------------------------------------------------------------------
初始化函数
包括 SpiInit() SPI接口初始化及连接设置
Init() LPC2200 引脚方向初始化
SendData() SPI发送接收数据函数
-----------------------------------------------------------------------------*/
/****************************************************************************
* 名 称:SpiInit()
* 功 能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
* 说 明:传输格式必须对照905的SPI总线传输方式设置
****************************************************************************/
void SpiInit(void)
{
PINSEL0 |= 0x00005500;
S0PCCR = 0x52; // 设置SPI时钟分频
S0PCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(0 << 4) | // CPOL = 1, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}
/****************************************************************************
* 名 称:Magic905_Init(void)
* 功 能:SPI初始化、905各引脚初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Magic905_Init(void)
{
SpiInit();
nRF905_init();
}
/****************************************************************************
* 名 称:SendData()
* 功 能:向SPI总线“发送”或“接收”数据,并接收从机发回的数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8 SendData(uint8 data)
{
S0PDR = data;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
return(S0PDR);
}
/*----------------------------------------------------------------------------
nRF905状态改变函数
包括 OFFMode 掉电模式
WaitMode 等待模式
TxMode 发送模式
RxMode 接收模式
-----------------------------------------------------------------------------*/
/****************************************************************************
* 名 称:OFFMode()
* 功 能:关机/掉电模式 PWR=0 时,nRF905处于掉电模式
* 入 口:无
* 出 口:无
****************************************************************************/
void OFFMode(void)
{
IO1CLR = PWR ; // PWR = 0
Delay(1);
}
/****************************************************************************
* 名 称:WaitMode() 空闲/等待模式 10X
* 功 能:空闲等待电模式 PWR=1,CE=0 时,nRF905处于空闲等待模式
* 入 口:无
* 出 口:无
****************************************************************************/
void WaitMode(void)
{
IO1SET = PWR ; // PWR = 1
IO1CLR = CE ; // CE = 0
Delay(1);
}
/****************************************************************************
* 名 称:RxMode() 射频接收模式 110
* 功 能:接收模式 PWR=1,CE=1,EN=0 时,nRF905处于接收模式
* 入 口:无
* 出 口:无
****************************************************************************/
void RxMode(void)
{
IO1SET = ( PWR | CE ); // PWR=1 CE=1
IO1CLR = EN ; // EN=0
Delay(1);
}
/****************************************************************************
* 名 称:TxMode() 射频发送模式 111
* 功 能:发送模式 PWR=1,CE=1,EN=1 时,nRF905处于发射模式
* 入 口:无
* 出 口:无
****************************************************************************/
void TxMode(void)
{
IO1SET = ( PWR | EN | CE ); // PWR=1,CE=1,EN=1
Delay(1);
}
/****************************************************************************
* 名 称:nRFconfig() 射频配置函数 命令 00H
* 功 能:通过SPI总线对905进行射频配置字设置。
* 入口参数:rfcon 配置字数组
* 出口参数:无
****************************************************************************/
void nRFconfig(uint8 * rfcon)
{
uint8 i;
uint8 data;
WaitMode(); // 空闲模式
IO0CLR = CSN; // 使能从机
data = SendData(0x00); // 发送配置命令
for(i=0;i<10;i++) // 循环数为10,保证配置正确
{
data = SendData(rfcon[i]); // 写配置字
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:RDnRFconfig() 读射频配置函数 命令 10H
* 功 能:通过SPI总线从905读出射频配置字。
* 入口参数:tempbuf 配置字数组
* 出口参数:无
****************************************************************************/
void RDnRFconfig(uint8 * tempbuf)
{
uint8 i;
WaitMode(); // 空闲模式
IO0CLR = CSN; // 使能从机
tempbuf[0] = SendData(0x10); // 发送读配置命令
for(i=0;i<10;i++) // 循环数固定为10,保证配置正确
{
tempbuf[i] = SendData(0xAA); // 读配置字
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:WTxData() 写发送数据 命令 20H
* 功 能:通过SPI总线向905写入要发送的数据。
* 入口参数:txbuf 发送数据变量
no 数据发送数(需根据配置字设置,不能随意更改)
* 出口参数:无
****************************************************************************/
void WTxData(uint8 * txbuf,uint8 datno)
{
uint8 i;
uint8 j;
uint8 data;
j = datno ;
if( i<1 ) j = 1 ; // 发送字节数不能少于1个
j &= 0x3f ; // 取发送字节数的后6位
if( i>32 ) j = 32; // 保证发送字节数不多于32个
IO0CLR = CSN ; // 从机使能
data = SendData(0x20); // 写发送数据命令字
for(i=0;i<j;i++)
{
data = SendData(txbuf[i]); // 读发送数据
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:RTxData() 读发送数据 命令 21H
* 功 能:通过SPI总线从905读出发送的数据。
* 入口参数:no 读出的数据个数(需要结合配置字,不能随意更改)
* 出口参数:无
* 说 明:读出的数据写入 temp变量中
****************************************************************************/
void RTxData(uint8 * tempbuf,uint8 datno)
{
uint8 i;
uint8 data;
uint8 j;
j = datno ;
if( i<1 ) j = 1 ; // 发送字节数不能少于1个
j &= 0x3f ; // 取发送字节数的后6位
if( i>32 ) j = 32; // 保证发送字节数不多于32个
IO0CLR = CSN ; // 使能从机
data = SendData(0x21); // 写读发送数据命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 写发送数据
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:WTxAddr() 写发送地址 命令 22H
* 功 能:通过SPI总线向905写入要发送的地址。
* 入口参数:txaddr 地址变量
* 出口参数:无
****************************************************************************/
void WTxAddr(uint8 * txaddr,uint8 adrno)
{
uint8 i;
uint8 data;
uint8 j;
j = (adrno >> 4) & 0x0f ; // 读取高4位( TX_AFW 发送地址宽度)
if(j<1) j = 1 ; // 保证地址字节数大于等于1
if(j>4) j = 4 ; // 保证地址字节数小于等于4
IO0CLR = CSN ; // 使能从机
data = SendData(0x22); // 写发送地址命令
for(i=0;i<j;i++)
{
data = SendData(txaddr[i]); // 写发送地址
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:RTxAddr() 读发送地址 命令 23H
* 功 能:通过SPI总线从905读出发送地址。
* 入口参数:tempbuf 一般数据缓冲区变量
* 出口参数:无
* 说 明:读出的发送地址写到 temp变量中
****************************************************************************/
void RTxAddr(uint8 * tempbuf,uint8 adrno)
{
uint8 i;
uint8 data;
uint8 j;
j = (adrno >> 4) & 0x0f ; // 读取高4位( TX_AFW 发送地址宽度)
if(j<1) j = 1 ; // 保证地址字节数大于等于1
if(j>4) j = 4 ; // 保证地址字节数小于等于4
IO0CLR = CSN ; // 从机使能
data = SendData(0x23); // 写读发送地址命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 读发送地址
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:RRxData() 读接收数据 命令 24H
* 功 能:通过SPI总线从905读出接收到的数据。
* 入口参数:no 读出的数据数(需要结合配置字不能随意更改)
tempbuf 数据读出位置
* 出口参数:无
****************************************************************************/
void RRxData(uint8 * tempbuf,uint8 datno)
{
uint8 i;
uint8 data;
uint8 j;
j = datno ;
if( i<1 ) j = 1 ; // 发送字节数不能少于1个
j &= 0x3f ; // 取发送字节数的后6位
if( i>32 ) j = 32; // 保证发送字节数不多于32个
IO0CLR = CSN ; // 从机使能
data = SendData(0x24); // 写读接收数据命令
for(i=0;i<j;i++)
{
tempbuf[i] = SendData(0xAA); // 读接收数据
}
IO0SET = CSN ; // 关闭使能
}
/****************************************************************************
* 名 称:TxPacket()
* 功 能:发送数据包据。
* 入口参数:txaddr 发送地址变量
txbuf 发送数据缓冲区
* 出口参数:无
****************************************************************************/
void TxPacket(uint8 * txaddr,uint8 adrno,uint8 * txbuf,uint8 datno)
{
WaitMode(); // 进入等待模式,准备配置。
WTxAddr(txaddr,adrno); // 写 发送地址
Delay(1); // 延时
WTxData(txbuf,datno); // 写发送数据 发送个数为配置字[4]字节,即发送数据长度
Delay(1);
TxMode(); // 发射模式设置,启动发射
while(0==(IO0PIN&RD)); // 等待RD(ready)发送完信号
WaitMode(); // 数据发送完毕,进入等待模式。
}
/****************************************************************************
* 名 称:RxPacket()
* 功 能:接收数据包。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void RxPacket(uint8 * rxbuf,uint8 datno)
{
RxMode();
while(0==(IO0PIN&RD)); // 等待接受 到 数据信号
WaitMode(); // 等待模式
RRxData(rxbuf,datno); // 接收数据 接收字节数为接收配置[3]字节
while(0!=(IO0PIN&RD)); // 等待接收 完 数据信号 必要时再加
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -