NRF24L01无线通讯模块驱动
时间:11-19
来源:互联网
点击:
24l01.c
#include "24l01.h"const u8 TX_ADDRESS[TX_ADR_WIDTH]={ADDR1_VALUE,ADDR2_VALUE,ADDR3_VALUE,ADDR4_VALUE,ADDR5_VALUE}; //发送地址const u8 RX_ADDRESS[RX_ADR_WIDTH]={ADDR1_VALUE,ADDR2_VALUE,ADDR3_VALUE,ADDR4_VALUE,ADDR5_VALUE}; //发送地址//初始化24L01的IO口void Nrf24l01Init(void){ GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBRCC_APB2Periph_GPIODRCC_APB2Periph_GPIOG, ENABLE); //使能PB,D,G端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12上拉 防止W25X的干扰GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化指定IOGPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2推挽输出上拉 禁止SD卡的干扰GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_SetBits(GPIOD,GPIO_Pin_2);//初始化指定IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6GPIO_Pin_7; //PG6 7 推挽 GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG8 输入 GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_ResetBits(GPIOG,GPIO_Pin_6GPIO_Pin_7GPIO_Pin_8);//PG6,7,8上拉 Spi2Init(); //初始化SPI SPI_Cmd(SPI2, DISABLE); // SPI外设不使能SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI主机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_16; //定义波特率预分频的值:波特率预分频值为16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI2, ENABLE); //使能SPI外设NRF24L01_CE=0; //使能24L01,初始化低电平进入待机模式NRF24L01_CSN=1; //SPI片选取消 }//SPI写寄存器//reg:指定寄存器地址//value:写入的值//每一个命令的执行都需要一次CSN由低到高的过程u8 Nrf24l01WriteReg(u8 reg,u8 value){u8 status; NRF24L01_CSN=0; //使能SPI传输NRF24L01_CE=0; //待机模式才能进行寄存器写入status =Spi2ReadWriteByte(WRITE_REG_NRF+reg);//发送寄存器号 +读寄存器命令Spi2ReadWriteByte(value); //写入寄存器的值NRF24L01_CSN=1; //禁止SPI传输 return(status); //返回状态值}//读取SPI寄存器值//reg:要读的寄存器u8 Nrf24l01ReadReg(u8 reg){u8 reg_val; NRF24L01_CSN = 0; //使能SPI传输 Spi2ReadWriteByte(READ_REG_NRF+reg); //发送寄存器号+读寄存器命令reg_val=Spi2ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1; //禁止SPI传输 return(reg_val); //返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值 u8 Nrf24l01ReadBuf(u8 reg,u8 *pBuf,u8 len){u8 status,u8_ctr; NRF24L01_CSN = 0; //使能SPI传输status=Spi2ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值 for(u8_ctr=0;u8_ctr
NRF24L01无线通讯模块驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)