📄 nrf905._c
字号:
#define _nrf905_c_
#include "nrf905.h"
#include "LCD.h"
//延时--------------------------------------------------
void DelayMs( uchar ms )
{
char i;
for( i = 0; i < ms; i++ )
{
DelayUs( 1000 );
}
return;
}
void DelayUs(uint us)
{
uint i;
for( i = 0; i < us; i++ )
{ NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); }
}
//-----------------------------------------------------------------
//配置nRF905
void nrf905_Config(void)
{
CLR( PORT_SPI, CSN ); // Spi 片选开
nrf905_SpiRW(WC); // Write config command
nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
nrf905_SpiRW(RX_PW_1BYTE); //接收数据宽度32字节
nrf905_SpiRW(TX_PW_1BYTE); //发送数据宽度32字节
nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
SET( PORT_SPI, CSN ); // Disable Spi
}
//spi寄存器以及端口初始化
void SPI_Init(void)
{
DDR_SPI |= ( 1 << MOSI ) | ( 1 << MISO ) | ( 1 << SCK ) | ( 1 << CSN ); // 设置MOSI和SCK、SS为输出,其他为输入
PORT_SPI |= ( 1 << MOSI ) | ( 1 << SCK ) | ( 1 << CSN );
SPCR |= ( 1 << SPE ) | ( 1 << MSTR ) | ( 0 << CPOL ) | ( 0 << SPR0); // 主机模式,fck/16, SPI方式0
}
//nRF端口初始化
void nrfport_init( void )
{
DDR_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 0 << DR ) | ( 1 << PWR );
PORT_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 1 << DR ) | ( 1 << PWR );
}
//spi读写函数
uchar nrf905_SpiRW( uchar val )
{
SPDR = val;
while ( ( SPSR & ( 1 << SPIF ) ) == 0 );
return SPDR;
}
//Standby 和SPI 编程模式, 一般在初始化写配置信息时用到。
void nrf905_StandBy( void )
{
SET( PORT_NRF, PWR ); //PWR_UP = 1 上电
CLR( PORT_NRF, TRXCE ); //TRX_CE = 0 关闭发送或接收
CLR( PORT_NRF, TX_EN ); //TX_EN = X 任意值, 当TRX_CE = 1时起作用
}
//掉电和SPI 编程
void nrf905_Off( void )
{
CLR( PORT_NRF, PWR );
}
//发送模式
void nrf905_TxOn( void )
{
SET( PORT_NRF, PWR ); //注意顺序
SET( PORT_NRF, TX_EN ); //使能发送
CLR( PORT_NRF, TRXCE ); //在这里还没有启动发送
}
//启动发送
void nrf905_TxSend( void )
{
SET( PORT_NRF, TRXCE );
DelayUs(20); //>10us
CLR( PORT_NRF, TRXCE ); //只发送一次
}
//接收模式
void nrf905_RxOn( void )
{
SET( PORT_NRF, PWR ); //注意顺序
CLR( PORT_NRF, TX_EN ); //maybe first
SET( PORT_NRF, TRXCE ); //
}
//初始化nrf905
void nrf905_Init( void )
{
nrfport_init(); //配置nrf端口
nrf905_StandBy(); //掉电与spi编程模式
DelayMs(10); //!!!must >3ms
nrf905_Config(); //配置nrf
nrf905_RxOn(); //初始化为接收模式
}
//写Tx地址
void nrf905_SetTxAddr( void )
{
CLR( PORT_SPI, CSN ); //启动spi
nrf905_SpiRW( WTA ); //写Tx地址 写TX 地址1-4 字节写操作全部从字节0 开始
nrf905_SpiRW( TX_ADDRESS_0 );
nrf905_SpiRW( TX_ADDRESS_1 );
nrf905_SpiRW( TX_ADDRESS_2 );
nrf905_SpiRW( TX_ADDRESS_3 );
SET( PORT_SPI, CSN );
}
//写数据
void nrf905_SetData( uchar set_data )
{
CLR( PORT_SPI, CSN ); //启动spi
nrf905_SpiRW( WTP ); //写TxPayload 向发送数据寄存器写特征字
nrf905_SpiRW( set_data ); //写数据
SET( PORT_SPI, CSN) ; //关闭spi
}
//等待发送结束
void nrf905_WaitSended( void )
{
while ( ( PIN_NRF &( 1 << DR ) ) == 0 );
}
//发送数据
void nrf905_SendData( uchar tx_data )
{
nrf905_TxOn(); //切换到发送模式
nrf905_SetTxAddr(); //写发送地址
nrf905_SetData( tx_data );//写数据
nrf905_TxSend(); //启动发送
nrf905_WaitSended(); //等待发送结束
//nrf905_Off();
}
//读出接收到的数据
uchar nrf905_ReadData( void )
{
uchar i;
uchar rx_tmp; //定义读出的数据,暂存值
CLR( PORT_SPI, CSN );
nrf905_SpiRW( RRP ); //读RxPayload,RRP, 读数据寄存器特征字, 说明的是从字节0开始读32个字节的数据
rx_tmp = nrf905_SpiRW( 0 );
SET( PORT_SPI, CSN );
return rx_tmp; //返回接收到的数据
}
//接收过程
//
//
//
//
//
//
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -