


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、STM32 的 24l01 的子程序#include "24l01.h"#include "lcd.h"#include "delay.h"#include "spi.h"/Mini STM32 开发板/NRF24L01 驱动函数/ 正点原子 ALIENTEK/2010/6/16const u8 TX_ADDRESSTX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x01; /发/ 送地址const u8 RX_ADDRESSRX_ADR_WIDTH=0x34,0x43,0x10,0x10,0x0
2、1; /发/ 送地址/初始化24L01的10 口void NRF24L01_Init(void)GPI0_InitTypeDef GPI0_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPI0A|RCC_APB2Periph_GPI0CE, NABLE );GPI0_InitStructure.GPI0_Pin = GPI0_Pin_2|GPI0_Pin_3|GPI0_Pin_4;GPI0_InitStructure.GPI0_Mode = GPI0_Mode_0ut_PP ;/ 推挽输出GPI0_InitStructure.GPI
3、0_Speed = GPI0_Speed_50MHz;GPI0_Init(GPI0A, &GPI0_InitStructure);GPI0_SetBits(GPI0A,GPI0_Pin_2|GPI0_Pin_3|GPI0_Pin_4);GPI0_InitStructure.GPI0_Pin = GPI0_Pin_4;GPI0_InitStructure.GPI0_Mode = GPI0_Mode_0ut_PP ;/ 推挽输出GPI0_InitStructure.GPI0_Speed = GPI0_Speed_50MHz;GPI0_Init(GPI0C, &GPI0_InitSt
4、ructure);GPI0_SetBits(GPI0C,GPI0_Pin_4);GPI0_InitStructure.GPI0_Pin = GPI0_Pin_5;GPI0_InitStructure.GPI0_Mode = GPI0_Mode_IPU ;/上拉输入GPI0_InitStructure.GPI0_Speed = GPI0_Speed_50MHz;GPI0_Init(GPI0C, &GPI0_InitStructure);SPIx_Init(); /初始化 SPIClr_NRF24L01_CE; / 使能 24L01 NRF24L01_CE Set_NRF24L01_CSN
5、; /SPI 片选取消 NRF24L01_CSN / 检测 24L01 是否存在/ 返回值 :0,成功 ;1,失败u8 NRF24L01_Check(void)u8 buf5=0XA5,0XA5,0XA5,0XA5,0XA5;u8 i;SPIx_SetSpeed(SPI_BaudRatePrescaler_8);/spi 速度为 9Mhz ( 24L01 的最大 SPI 时钟为 10Mhz )NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,buf,5)写入 5 个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); /读出写
6、入的地址 for(i=0;i<5;i+)if(bufi!=0XA5)break;if(i!=5)return 1;/ 检测 24L01 错误return 0;/ 检测到 24L01/SPI 写寄存器/reg: 指定寄存器地址/value: 写入的值u8 NRF24L01_Write_Reg(u8 reg,u8 value)u8 status;Clr_NRF24L01_CSN;/ 使能 SPI传输status =SPIx_ReadWriteByte(reg); 发送寄存器号SPIx_ReadWriteByte(value);/ 写入寄存器的值Set_NRF24L01_CSN;/ 禁止 SP
7、I传输return(status);/ 返回状态值/读取SPI寄存器值/reg: 要读的寄存器u8 NRF24L01_Read_Reg(u8 reg)u8 reg_val;Clr_NRF24L01_CSN;/ 使能 SPI 传输SPIx_ReadWriteByte(reg); /发送寄存器号 reg_val=SPIx_ReadWriteByte(OXFF); 读取寄存器内容 Set_NRF24L01_CSN;/ 禁止 SPI传输return(reg_val);/ 返回状态值/ 在指定位置读出指定长度的数据/reg: 寄存器 ( 位置 )/*pBuf: 数据指针/len: 数据长度/ 返回值 ,
8、此次读到的状态寄存器值u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)u8 status,u8_ctr;Clr_NRF24L01_CSN;/ 使能 SPI传输status=SPIx_ReadWriteByte(reg);/ 发送寄存器值 (位置 ),并读取状态值 for(u8_ctr=0;u8_ctr<len;u8_ctr+)pBufu8_ctr=SPIx_ReadWriteByte(0XFF);/ 读出数据Set_NRF24L01_CSN; / 关闭 SPI传输return status;/ 返回读到的状态值/ 在指定位置写指定长度的数据/reg
9、: 寄存器 ( 位置 ) /*pBuf: 数据指针 /len: 数据长度/ 返回值 ,此次读到的状态寄存器值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len) u8 status,u8_ctr;Clr_NRF24L01_CSN;/ 使能 SPI 传输status = SPIx_ReadWriteByte(reg);发送寄存器值(位置),并读取状态值 for(u8_ctr=0; u8_ctr<len; u8_ctr+)SPIx_ReadWriteByte(*pBuf+); / 写入数据 Set_NRF24L01_CSN; / 关闭 SPI传输re
10、turn status;/返回读到的状态值/ 启动 NRF24L01 发送一次数据/txbuf: 待发送数据首地址/ 返回值 :发送完成状况u8 NRF24L01_TxPacket(u8 *txbuf)u8 sta;SPIx_SetSpeed(SPI_BaudRatePrescaler_8);/spi 速度为 9Mhz(24L01 的最大 SPI 时钟为 10Mhz )Clr_NRF24L01_CE;NRF24L01_Write_Buf(NRF24L01_WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);写数据至U TX BUF 32 个字节Set_NRF24L01_CE;/
11、启动发送while(NRF24L01RQ!=O); 等待发送完成sta=NRF24L01_Read_Reg(STATUS); 读取状态寄存器的值NRF24L01_Write_Reg(NRF24L01_WRITE_REG+STATUS,sta)清除 TX_DS或 MAX_RT中断标if(sta&MAX_TX)/ 达到最大重发次数NRF24L01_Write_Reg(NRF24L01_FLUSH_TX,0xff);清除 TX FIFO寄存器 return MAX_TX;if(sta&TX_OK)/ 发送完成return TX_OK;return 0xff;/ 其他原因发送失败/启动
12、NRF24L01发送一次数据/txbuf: 待发送数据首地址/ 返回值 :0,接收完成;其他,错误代码u8 NRF24L01_RxPacket(u8 *rxbuf)u8 sta;SPIx_SetSpeed(SPI_BaudRatePrescaler_8);/spi 速度为 9Mhz(24L01 的最大 SPI 时钟为 10Mhz )sta=NRF24L01_Read_Reg(STATUS); 读取状态寄存器的值NRF24L01_Write_Reg(NRF24L01_WRITE_REG+STATUS,sta)清除 TX_DS或 MAX_RT中断标if(sta&RX_OK)接收到数据NRF
13、24L01_Read_Buf(NRF24L01_RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH 读取 数据 NRF24L01_Write_Reg(NRF24L01_FLUSH_RX,0xff);/清除 RX FIFC寄存器 return 0;return 1;/ 没收到任何数据/该函数初始化 NRF24L01到RX模式/设置RX地址,写 RX数据宽度,选择RF频道,波特率和LNA HCURR/当CE变高后,即进入RX模式,并可以接收数据了void RX_Mode(void)Clr_NRF24L01_CE;NRF24L01_Write_Buf(NRF24L01_WRITE_RE
14、G+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);/写RX节点地址NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_AA,0x01); /使能通道 0的自动应答NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_RXADDR,0x01使能通道 0 的接收地址NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_CH,40); / 设置 RF通信频率NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RX_PW_P0,RX_PL0AD_WIDTH选
15、择通道 0 的有效数据宽度NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_SET0X0f); 设置 TX 发射参数,0db 增 益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(NRF24L01_WRITE_REG+C0NFIG0,x0f);/ 配置基 本工作 模式的 参 数;PWR_UPEN_CRC,16BIT_CR接收模式Set_NRF24L01_CE; CE为高,进入接收模式/该函数初始化 NRF24L01到TX模式/设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据 选择RF频道,波特 率和 LNA HCURRPW
16、R_UP,CRC 使能/当CE变高后,即进入RX模式,并可以接收数据了/CE为高大于10us,则启动发送.void TX_Mode(void)Clr_NRF24L01_CE;NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH) ;/写TX节点地址NRF24L01_Write_Buf(NRF24L01_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WI DTH); /设置TX节点地址,主要为了使能 ACKNRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_AA,0x01); /使能通道 0 的自动应答NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_RXADDR,0x01/;使能通道 0 的接收地址NRF24L01_Write_Reg(NRF24L01_WRITE_REG+SETUP_RETR,0x1a设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025春季新疆石河子大学第一附属医院、石河子大学附属中医医院(兵团中医医院)校园招聘同工同酬52人模拟试卷附答案详解(考试直接用)
- 政务面试考试题库及答案
- 青海数学考试卷子及答案
- 2025年锅炉水处理作业人员(特种作业)考试题库及答案
- 汇川培训考试题目及答案
- 2025年广西行政执法人员执法证考试题库及答案
- 行为药理学考试题及答案
- 承德教资考试题目及答案
- 正衡中学分班考试题及答案
- 软通动力c语言笔试题及答案
- MSA分析报告样本
- 基础应用化学(高职)全套教学课件
- 《铁皮石斛的介绍》课件
- 低压配电柜技术规范书
- 《隐身技术概述》课件
- 中学食堂运营管理制度
- 荔浦扣肉项目商业计划书
- JCT478.2-2013 建筑石灰试验方法 第2部分 化学分析方法
- 小学一二三年级劳动与技术《整理书包》课件
- 《自身免疫性溶血性贫血诊疗指南(2023年版)》解读
- 立法学(第五版)课件 第9-16章 立法程序-立法语言
评论
0/150
提交评论