main.c
#include "
STM32f10x.h"
#include "Sys
tick.h"
#include "Delay.h"
#include "Usart.h"
#include "stdio.h"
#include "NRF905.h"
u8 RxBuf[32];
/*******由于没有做外设测试的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/
int main(void)
{
//初始化系统定时器
SysTick_Init();
USART1_Config();
NRF905_Init();
NRF905_Config();
SetRxMode();
Delay_ms(200);
while(!(CD_read() & AM_read())) //载波检测引脚置高/地址匹配引脚置高
{
printf("Connect . . . . n");
Delay_ms(2000);
}
printf("OK, connect !!n");
RxPacket(RxBuf);
while(1);
}
nrf905.c
#include "NRF905.h"
#include "Delay.h"
extern u8 RxBuf[32];
typedef struct RFConfig
{
u8 n;
u8 buf[10];
}RFConfig;
/**************************************************************************************
* 名 称: 配置寄存器中的内容!
**************************************************************************************/
RFConfig RxTxConf ={10,
0x4c, //CH_NO[7:0] 连同字节 1 的 CH_NO[8]和 HFREQ_PLL 控制 905 的载波频段 433MHZ
0x0c, //7,6:no use;5:自动重发=0;4:接收灵敏度降低=0;3,2:发射功率=10dBm;1:433MHz;CH_NO[8]=0
0x44, //7:no use;6,5,4:发送地址宽度4;3:no use;2,1,0:接收地址宽度4
0x20, //7,6 no use;5-0:接收数据宽度32
0x20, //7,6 no use;5-0:发送数据宽度32
0xcc, //接收地址字节0(设备ID)
0xcc, //接收地址字节1(设备ID)
0xcc, //接收地址字节2(设备ID)
0xcc, //接收地址字节3(设备ID)
0x58 //7:CRC模式8位;6:CRC校验许可;5,4,3:011表示16MHz;2:UP_CLK_EN=0没有外部时钟;1,0:外部时钟频率
};
/**************************************************************************************
* 名 称: SetTxMode
* 功 能: 设置NRF905发送状态
* 参 数: 无
* 调用方式:SetTxMode();
* 返 回 值:无
**************************************************************************************/
void SetTxMode(void)
{
NRF905_TX_EN_H;
NRF905_TRX_CE_L;
Delay_us(650);
}
/**************************************************************************************
* 名 称: SetRxMode
* 功 能: 设置NRF905发送状态
* 参 数: 无
* 调用方式:SetRxMode();
* 返 回 值:无
**************************************************************************************/
void SetRxMode(void)
{
NRF905_TX_EN_L;
NRF905_TRX_CE_H;
Delay_us(650);
}
/**************************************************************************************
* 名 称: CD_read
* 功 能: 读取CD的值(载波检测)
* 参 数: 无
* 调用方式:CD_read();
* 返 回 值: CD的值
**************************************************************************************/
u8 CD_read(void)
{
u8 ReadValue;
ReadValue = NRF905_CD_DATA;
return ReadValue;
}
/**************************************************************************************
* 名 称: AM_read
* 功 能: 读取AM的值(地址匹配AM)
* 参 数: 无
* 调用方式:AM_read();
* 返 回 值: AM的值
**************************************************************************************/
u8 AM_read(void)
{
u8 ReadValue;
ReadValue = NRF905_AM_DATA;
return ReadValue;
}
/**************************************************************************************
* 名 称: DR_read
* 功 能: 读取CD的值(数据就绪DR)
* 参 数: 无
* 调用方式:DR_read();
* 返 回 值: DR的值
**************************************************************************************/
u8 DR_read(void)
{
u8 ReadValue;
ReadValue = NRF905_DR_DATA;
return ReadValue;
}
/**************************************************************************************
* 名 称: NRF905_SPI_Read_Bit
* 功 能: 读取MISO的值
* 参 数: 无
* 调用方式:NRF905_SPI_Read_Bit();
* 返 回 值: MISO的值,0或者1
**************************************************************************************/
static u8 NRF905_SPI_Read_Bit(void)
{
u8 ReadValue;
ReadValue = NRF905_MISO_DATA;
return ReadValue;
}
/**************************************************************************************
* 名 称: NRF905_SPI_Read_Byte
* 功 能: 读取MISO的值,字节的形式
* 参 数: 无
* 调用方式:NRF905_SPI_Read_Byte();
* 返 回 值: MISO的值
**************************************************************************************/
u8 NRF905_SPI_Read_Byte(void)
{ u8 i;
u8 Temp_data;
for (i = 0;i < 8;i ++) // Setup byte circulation bits
{
Temp_data = Temp_data << 1; // Right shift Temp_data
NRF905_SCK_H; // Set clock line high
if (NRF905_SPI_Read_Bit())
{
Temp_data |= 0x01; // Read data
}
NRF905_SCK_L; // Set clock line low
}
return Temp_data; // Return function parameter
}
/**************************************************************************************
* 名 称: NRF905_SPI_Write_Byte
* 功 能: NRF905写1字节函数
* 参 数: DATA: 需要写入的字节
* 调用方式:NRF905_SPI_Write_Byte(0xaa);
* 返 回 值:无
**************************************************************************************/
void NRF905_SPI_Write_Byte(u8 DATA)
{
u8 i,Temp_data;
Temp_data = DATA;
for (i=0;i<8;i++)
{
if (Temp_data & 0x80) //总是发送最高位
{
NRF905_MOSI_H;
}
else
{
NRF905_MOSI_L;
}
NRF905_SCK_H;
Temp_data=Temp_data<<1;
NRF905_SCK_L;
}
}
/**************************************************************************************
* 名 称: TxPacket
* 功 能: 发送数据包
* 参 数: 需要发送的内容
* 调用方式:TxPacket();
* 返 回 值: MISO的值
**************************************************************************************/
void TxPacket(u8 *TxBuf)
{
u8 i;
NRF905_CSN_L; // 使能SPI
NRF905_SPI_Write_Byte(WTP); // Write payload command
for (i=0;i<32;i++)
{
NRF905_SPI_Write_Byte(TxBuf
); // Write 32 bytes Tx data
}
for(i = 0; i < 32;i ++)
{
printf("%x r",TxBuf);
}
NRF905_CSN_H; // Spi disable
Delay_us(1);
NRF905_CSN_L; // Spi enable for write a spi command
NRF905_SPI_Write_Byte(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
NRF905_SPI_Write_Byte(RxTxConf.buf[i+5]);
}
for(i = 0; i < 4;i ++)
{
printf("%x r",RxTxConf.buf[i+5]);
}
NRF905_CSN_H; // Spi disable
NRF905_TRX_CE_H; // Set TRX_CE high,start Tx data transmission
Delay_us(1);
// while(!DR_read());
NRF905_TRX_CE_L; // Set TRX_CE low
}
/**************************************************************************************
* 名 称: TxPacket
* 功 能: 发送数据包
* 参 数: 需要发送的内容
* 调用方式:TxPacket();
* 返 回 值: MISO的值
**************************************************************************************/
void RxPacket(u8*RxBuf)
{
u8 i;
NRF905_CSN_L; // 使能SPI
NRF905_TRX_CE_L; // 待机模式 (模块接收到数据后要进入)
Delay_ms(200);
while(!DR_read()) // 数据正确?
{
printf("Sorry,The module failed to Recieve DATA !!n");
}
printf("OK,The module Recieve DATA success!!n");
NRF905_SPI_Write_Byte(RRP); // Ready Read payload command
for (i=0;i<32;i++)
{
RxBuf= NRF905_SPI_Read_Byte(); // Read 32 bytes Tx data
}
for(i = 0; i < 32;i ++)
{
printf("%x r",RxBuf);
}
while(DR_read() || AM_read())
{
printf("DATA Recieve NO finish !!!n");
}
printf("DATA Recieve finish !!!n");
NRF905_CSN_H; // Spi disable
Delay_us(1);
}
/**************************************************************************************
* 名 称: NRF905_GPIO_Configuration
* 功 能: 初始化NRF905的管脚
* 参 数: cmd: 彩屏模块命令字
* 调用方式:NRF905_GPIO_Configuration();内部调用
* 返 回 值:无
**************************************************************************************/
static void NRF905_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(NRF905_RCC_APB2Periph_GPIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3 |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8 |GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(NRF905_GPIO_CONTROL, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(NRF905_GPIO_CONTROL, &GPIO_InitStructure);
}
/**************************************************************************************
* 名 称: NRF905_Init
* 功 能: 初始化NRF905
* 参 数: DATA: 需要写入的字节
* 调用方式:NRF905_Init();
* 返 回 值:无
**************************************************************************************/
void NRF905_Init(void)
{
NRF905_GPIO_Configuration();
NRF905_AM_DATA_L; //先拉低
NRF905_DR_DATA_L; //先拉低
NRF905_CSN_H; //关掉SPI
NRF905_SCK_L; //初始化时钟低
NRF905_PWR_UP_H; //power低
NRF905_TRX_CE_L; // Set nRF905 in standby mode
}
/**************************************************************************************
* 名 称: NRF905_Init
* 功 能: 配置NRF905寄存器
* 参 数: 无
* 调用方式:NRF905_Init();
* 返 回 值:无
**************************************************************************************/
void NRF905_Config(void)
{
u8 i;
NRF905_CSN_L; // Spi enable for write a spi command
NRF905_SPI_Write_Byte(WC); // Write config command写放配置命令
for (i = 0;i < RxTxConf.n; i++) // Write configration words 写放配置字
{
NRF905_SPI_Write_Byte(RxTxConf.buf);
}
for(i = 0; i < 10; i ++)
{
printf(" %x r",RxTxConf.buf);
}
NRF905_CSN_H; // Disable Spi
}
0