/******************** (C) COPYRIGHT 2012 WildFire Team **************************
* 文件名 :SPI_NRF.c
* 描述 :SPI_NRF24L01+无线模块应用函数库
* 实验平台:野火STM32开发板
* 硬件连接:-----------------------------|
* | |
* | PA1 : NRF- CSN |
| PA5-SPI2-SCK : NRF -SCK |
| PA6-SPI2-MISO : NRF -MISO|
| PA7-SPI2-MOSI : NRF -MOSI|
| PA3 : NRF-IRQ |
| PA2 : NRF-CE |
* | |
* -----------------------------
* 库版本 :ST3.5.0
*
* 作者 :wildfire team
* 论坛 :http://www.amobbs.com/forum-1008-1.html
* 淘宝 :http://firestm32.taobao.com
**********************************************************************************/
#include "SPI_NRF.h"
#include "bsp_usart1.h"
#include "bsp_breathing.h"
extern uint16_t LEDs;
extern uint8_t rxbuf[32]; //接收缓冲
extern uint8_t link_flag;
u8 RX_BUF[RX_PLOAD_WIDTH]; //接收数据缓存
u8 TX_BUF[TX_PLOAD_WIDTH]; //发射数据缓存
u8 TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址
u8 RX_ADDRESS[RX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
void Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}
/*
* 函数名:SPI_NRF_Init
* 描述 :SPI的 I/O配置
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void SPI_NRF_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*使能GPIOB,GPIOD,复用功能时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
/*使能SPI2时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 , ENABLE);
// /*配置485芯片的控制引脚GPIOA^0,防止干扰NRF*/
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOA, GPIO_Pin_0); //禁止485的发送模式,接收模式仍开
/*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*配置SPI_NRF_SPI的CE引脚,GPIOA^2和SPI_NRF_SPI的 CSN 引脚: NSS GPIOA^8*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*配置SPI_NRF_SPI的IRQ引脚,GPIOA^3*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 这是自定义的宏,用于拉高csn引脚,NRF进入空闲状态 */
NRF_CSN_HIGH();
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据大小8位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟极性,空闲时为低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第1个边沿有效,上升沿为采样时刻
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件产生
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //8分频,9MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);
}
/*
* 函数名:SPI_NRF_RW
* 描述 :用于向NRF读/写一字节数据
* 输入 :写入的数据
* 输出 :读取得的数据
* 调用 :内部调用
*/
u8 SPI_NRF_RW(u8 dat)
{
/* 当 SPI发送缓冲器非空时等待 */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/* 通过 SPI2发送一字节数据 */
SPI_I2S_SendData(SPI2, dat);
/* 当SPI接收缓冲器为空时等待 */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2);
}
/*
* 函数名:SPI_NRF_WriteReg
* 描述 :用于向NRF特定的寄存器写入数据
* 输入 :reg:NRF的命令+寄存器地址。
dat:将要向寄存器写入的数据
* 输出 :NRF的status寄存器的状态
* 调用 :内部调用
*/
u8 SPI_NRF_WriteReg(u8 reg,u8 dat)
{
u8 status;
NRF_CE_LOW();
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
/*发送命令及寄存器号 */
status = SPI_NRF_RW(reg);
/*向寄存器写入数据*/
SPI_NRF_RW(dat);
/*CSN拉高,完成*/
NRF_CSN_HIGH();
/*返回状态寄存器的值*/
return(status);
}
/*
* 函数名:SPI_NRF_ReadReg
* 描述 :用于从NRF特定的寄存器读出数据
* 输入 :reg:NRF的命令+寄存器地址。
* 输出 :寄存器中的数据
* 调用 :内部调用
*/
u8 SPI_NRF_ReadReg(u8 reg)
{
u8 reg_val;
NRF_CE_LOW();
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
/*发送寄存器号*/
SPI_NRF_RW(reg);
/*读取寄存器的值 */
reg_val = SPI_NRF_RW(NOP);
/*CSN拉高,完成*/
NRF_CSN_HIGH();
return reg_val;
}
/*
* 函数名:SPI_NRF_ReadBuf
* 描述 :用于从NRF的寄存器中读出一串数据
* 输入 :reg:NRF的命令+寄存器地址。
pBuf:用于存储将被读出的寄存器数据的数组,外部定义
bytes: pBuf的数据长度
* 输出 :NRF的status寄存器的状态
* 调用 :外部调用
*/
u8 SPI_NRF_ReadBuf(u8 reg,u8 *pBuf,u8 bytes)
{
u8 status, byte_cnt;
NRF_CE_LOW();
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
/*发送寄存器号*/
status = SPI_NRF_RW(reg);
/*读取缓冲区数据*/
for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)
pBuf[byte_cnt] = SPI_NRF_RW(NOP); //从NRF24L01读取数据
/*CSN拉高,完成*/
NRF_CSN_HIGH();
return status; //返回寄存器状态值
}
/*
* 函数名:SPI_NRF_WriteBuf
* 描述 :用于向NRF的寄存器中写入一串数据
* 输入 :reg:NRF的命令+寄存器地址。
pBuf:存储了将要写入写寄存器数据的数组,外部定义
bytes: pBuf的数据长度
* 输出 :NRF的status寄存器的状态
* 调用 :外部调用
*/
u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes)
{
u8 status,byte_cnt;
NRF_CE_LOW();
/*置低CSN,使能SPI传输*/
NRF_CSN_LOW();
/*发送寄存器号*/
status = SPI_NRF_RW(reg);
/*向缓冲区写入数据*/
for(byte_cnt=0;byte_cnt<bytes;byte_cnt++)
SPI_NRF_RW(*pBuf++); //写数据到缓冲区
/*CSN拉高,完成*/
NRF_CSN_HIGH();
return (status); //返回NRF24L01的状态
}
/*
* 函数名:NRF_RX_Mode
* 描述 :配置并进入接收模式
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void NRF_RX_Mode(void)
{
NRF_CE_LOW();
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); //设置RF通信频率
SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
/*CE拉高,进入接收模式*/
NRF_CE_HIGH();
}
/*
* 函数名:NRF_TX_Mode
* 描述 :配置发送模式
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void NRF_TX_Mode(void)
{
NRF_CE_LOW();
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
SPI_NRF_WriteReg(NRF_
没有合适的资源?快使用搜索试试~ 我知道了~
基于stm32的小型无人机+源代码+文档说明
共26个文件
h:13个
c:13个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 146 浏览量
2023-12-02
20:27:06
上传
评论
收藏 36KB ZIP 举报
温馨提示
基于stm32的小型无人机(代码+文档说明) ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
资源推荐
资源详情
资源评论
收起资源包目录
基于stm32的小型无人机.zip (26个子文件)
code
stm32f10x_conf.h 3KB
bsp_i2c.h 2KB
bsp_TiMbase.h 779B
bsp_i2c_ee.h 880B
bsp_iwdg.c 1KB
MS5611.h 2KB
bsp_i2c.c 9KB
bsp_i2c_ee.c 12KB
bsp_usart1.h 1KB
MS5611.c 7KB
mpu6050.h 15KB
SPI_NRF.c 12KB
zhishiLED.h 1KB
zhishiLED.c 3KB
delay.h 222B
bsp_adc.c 4KB
bsp_iwdg.h 160B
bsp_adc.h 940B
mpu6050.c 4KB
delay.c 1KB
bsp_TiMbase.c 3KB
bsp_usart1.c 3KB
main.c 2KB
SPI_NRF.h 4KB
stm32f10x_it.c 12KB
stm32f10x_it.h 2KB
共 26 条
- 1
资源评论
奋斗奋斗再奋斗的ajie
- 粉丝: 665
- 资源: 2286
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功