📄 nrf.c
字号:
/***************************************
*2008,浙江工业大学信息与控制研究所
*All rights reserved
*
*文件名称:nrf.c
*摘 要:NRF905相关的子程序实现
*
*当前版本:1.1
*作 者:王微
*完成日期:2008.4.28
****************************************/
#include<macros.h>
#include<iom128v.h>
#include"spi.h"
#include"common.h"
#include"nrf.h"
unsigned char data_conf[10];
//unsigned char send_addr[4]={0x13,0x65,0x13,0x65}; //4字节的发送地址
//unsigned char broad_addr[4]={0xff,0xff,0xff,0xff}; //4字节的广播地址
//unsigned char receive_addr[4]={0x65,0x13,0x65,0x13}; //4字节的接收地址a513d36a
//unsigned char receive_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的接收数据缓存区
//unsigned char transmit_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的发送数据缓存区
/**************************************************
函数功能:初始化nRF905,
输入参数:无
输出参数:无
**************************************************/
void init_905()
{
DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入
PORTE |=(1<<PWR_UP); //905上电
PORTE |=(1<<CSN); //CSN引脚置位,停止SPI操作,
PORTB |=1<<SCK; // Spi clock line init high
PORTE &=~(1<<TX_EN);
PORTB &=~(1<<TRX_CE); // Set nRF905 in standby mode
Delay3ms();
}
/**************************************************
函数功能:设置配置字
输入参数:905的接收地址
输出参数:无
**************************************************/
void set_confword(unsigned char*r_addr)
{
data_conf[0]=0x01; //
data_conf[1]=0x0c; //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
data_conf[2]=0x44; //4字节的接收地址和发送地址
data_conf[3]=PACKAGE_LENGTH; //RX有效数据长度
data_conf[4]=PACKAGE_LENGTH; //TX有效数据长度
data_conf[5]=r_addr[0]; //5~8为RX地址
data_conf[6]=r_addr[1];
data_conf[7]=r_addr[2];
data_conf[8]=r_addr[3];
data_conf[9]=0xd8;
}
/************************************************************
函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
输入参数:无
输出参数:无
*************************************************************/
void send_conf()
{
unsigned char i;
PORTE &=~(1<<CSN); // Spi enable for write a spi command
SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<10;i++) // Write configration words 写放配置字
{
SpiWrite(data_conf[i]);
}
PORTE |=(1<<CSN); // Disable Spi
}
/***************************************************************
函数功能:把905配置成发送模式
输入参数:无
输出参数:无
***************************************************************/
void set_Tmode()
{
PORTE |=(1<<PWR_UP); //905上电
PORTE |=(1<<TX_EN);
PORTB &=~(1<<TRX_CE);
Delay650us(); // delay for mode change(>=650us)
}
/***************************************************************
函数功能:把905配置成接收模式
输入参数:无
输出参数:无
***************************************************************/
void set_Rmode()
{
PORTE |=(1<<PWR_UP); //905上电
PORTE &=~(1<<TX_EN);
PORTB |=(1<<TRX_CE);
Delay650us(); // delay for mode change(>=650us)
}
/***************************************************************
函数功能:把905配置成掉电和SPI模式(节省能量)
输入参数:无
输出参数:无
***************************************************************/
void set_Powerdownmode()
{
PORTE &=~(1<<PWR_UP); //掉电
Delay650us(); // delay for mode change(>=650us)
}
/***************************************************************
函数功能:把905配置成STANDBY和SPI模式(节省能量)
输入参数:无
输出参数:无
***************************************************************/
void set_STmode()
{
PORTE |=(1<<PWR_UP); //905上电
PORTB &=~(1<<TRX_CE);
Delay3ms(); // delay for mode change(>=650us)
}
/**************************************************************************
函数功能:通过SPI设定905的发送地址
输入参数:发送地址数据的首地址
输出参数:无
**************************************************************************/
void set_Taddr(unsigned char*addr)
{
unsigned i;
PORTE &=~(1<<CSN); // Spi 使能
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(addr[i]);
}
PORTE |=(1<<CSN); // 禁止Spi
}
/**************************************************************************
函数功能:905发送一个数据包
输入参数:要发送的数据包的首地址
输出参数:无
**************************************************************************/
void TxPacket(unsigned char*send_d)
{
unsigned char temp,i;
//Config905();
PORTE &=~(1<<CSN); // CSN置零,Spi 使能
SpiWrite(WTP); // 写SPI命令
// SpiWrite(serial);
for (i=0;i<PACKAGE_LENGTH;i++)
{
SpiWrite(*(send_d+i)); // 写21字节的TX数据
}
PORTE |=(1<<CSN); // 禁止Spi
//
PORTB |=(1<<TRX_CE); // Set TRX_CE high,开始TX数据发送
Delay650us(); // 形成脉冲
PORTB &=~(1<<TRX_CE); // Set TRX_CE low,进入standby模式
}
/***************************************************************************
函数功能:把905接收到的一个数据包放到CPU的接收缓冲区
输入参数:接收缓冲区的首地址
输出参数:无
***************************************************************************/
void RxPacket(unsigned char*received_d)
{
unsigned char i;
PORTB &=~(1<<TRX_CE); // 把nRF905 设置成standby,不再接收无线数据
PORTE &=~(1<<CSN); // Spi enable for write a spi command,Spi 使能
SpiWrite(RRP); // Read payload command
for (i=0;i<PACKAGE_LENGTH;i++)
{
*(received_d+i)=SpiWrite(0x00); // Read data and save to buffer
}
PORTE |=(1<<CSN); // 禁止Spi
Delay650us();
PORTB |=(1<<TRX_CE); //把nRF905 设置成RX mode
/* if(DR)
{
init_905();
set_confword(broad_addr);
send_conf();
set_Rmode();
// return 0;
}
else{
// return ack;
} */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -