完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
main.c
#include "STM32f10x.h" #include "Systick.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 } |
|
相关推荐
2个回答
|
|
for (i = 0;i < RxTxConf.n; i++) {
NRF905_SPI_Write_Byte(RxTxConf.buf); RxTxConf.n 是不是错了? |
|
|
|
ann_1981_928 发表于 2015-8-3 13:23 这个是地址,没有错,我对正过了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2005 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1858 浏览 3 评论
4442 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2007 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2513 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 09:44 , Processed in 0.668199 second(s), Total 73, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号