STM32F103ZET6驱动NRF24L01
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数:SPI_Read_Buf()
描述:从 reg 寄存器读出 bytes 个字节,通常用来读取接收通道数据或接收/发送地址
******************************************************************************* */
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 bytes) {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_Init(GPIOB, &GPIO_InitStructure);
//SPI 协议的初始化
/****************************************************
函数名:NRF24L01_Check
形参:无
返回值:0 -- 成功 1 -- 失败
函数功能:检测 24L01 是否存在
****************************************************/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //MOSI -- PB15 SCK -- PB13
//PB13 -- SPI2_CK PB14 -- SPI2_MOSI PB15 -- SPI2_MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
描述:这个函数设置 nRF24L01 为接收模式,等待接收发送设备的数据包
timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
return SPI_I2S_ReceiveData(SPI2);
}
/************************************************** 函数:SPI_RW_REG()
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 分频值为 4
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2,ENABLE);
******************************************************************************/
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 bytes) {
u8 status,i;
CS_LOW(); // CS 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 for(i=0; i<bytes; i++) {
u8 status; CS_LOW(); // CSN 置低,开始传输数据 SPI2_ReadWriteByte(reg); // 选择寄存器 status=SPI2_ReadWriteByte(0); // 然后从该寄存器读数 CS_HIGH(); // CSN 拉高,结束数据传输
return (status); // 返回寄存器数据 } /****************************************************************************** **
SPI2_ReadWriteByte(*pBuf++); // 逐个字节写入 nRF24L01
} CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器
} /****************************************************************************** *
函数:NRF24L01_Read_Reg(BYTE reg)
描述:从 reg 寄存器读一字节
******************************************************************************* */
u8 NRF24L01_Read_Reg(u8 reg) {
STM32 驱动无线模块,已调好可用
#include "bsp.h"
u8 TX_ADDRESS[TX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
u8 RX_ADDRESS[RX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
描述: 根据 SPI 协议,写一字节数据到 nRF24L01,同时从 nRF24L01 读出一字节
**************************************************/ u8 NRF24L01_Write_Reg(u8 reg, u8 value) {
u8 status; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 SPI2_ReadWriteByte(value); // 然后写数据到该寄存器
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回 }
/*****************************************************************************
函数:SPI_Write_Buf()
描述:把 pBuf 缓存中的数据写入到 nRF24L01,通常用来写入发射通道数据或接收/发送地址
/**************************************************** 函数名:SPI 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/ void SPI2_Config(void) {
u8 status,i; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 for(i=0; i<bytes; i++) {
pBuf[i]=SPI2_ReadWriteByte(0); // 逐个字节从 nRF24L01 读出 }
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XF0,0XF0,0XF0,0XF0,0XF0};
u8 i;
// SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi 速度为 9Mhz(24L01 的最大 SPI 时钟为
10Mhz)
NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入 5 个字节的地址.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI2 设置为双线
全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 0 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 件控制
u8 SPI2_ReadWriteByte(u8 data)
{
u32 timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
SPI_I2S_SendData(SPI2,data);
NRF24L01_Read_Buf(TX_ADDR,buf,5);
//读出写入的地址
for(i=0;i<5;i++)
//检测读到的数据是否正确
{
if(buf[i]!=0XF0)
break;
}
if(i!=5) return 1;//检测 NRF24L01 失败
return 0;
//检测 NRF24L01 成功
//PG6 -- CE PG7 -- CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PG6 7 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定 IO //IRQ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOG, &GPIO_InitStructure);
//SPI 主机模
//数据 8 位 //CPOL -
//CPHA - 0 //NSS 信号软
// 波 特 率 预Hale Waihona Puke Baidu
// 数 据 传 输 从
//CRC 值
CE_LOW();//待机 CS_HIGH(); } /**************************************************** 函数名:NRF24L01 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/
GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器 } /****************************************************************************** **
函数:RX_Mode()
}
/****************************************************
函数名:SPI2_Send_Receive_Byte
形参: data -- 给 FLASH 发送的数据
返回值:flash 返回的数据
函数功能:给 FLASH 发送数据和读取数据
****************************************************/
描述:从 reg 寄存器读出 bytes 个字节,通常用来读取接收通道数据或接收/发送地址
******************************************************************************* */
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 bytes) {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_Init(GPIOB, &GPIO_InitStructure);
//SPI 协议的初始化
/****************************************************
函数名:NRF24L01_Check
形参:无
返回值:0 -- 成功 1 -- 失败
函数功能:检测 24L01 是否存在
****************************************************/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //MOSI -- PB15 SCK -- PB13
//PB13 -- SPI2_CK PB14 -- SPI2_MOSI PB15 -- SPI2_MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
描述:这个函数设置 nRF24L01 为接收模式,等待接收发送设备的数据包
timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
return SPI_I2S_ReceiveData(SPI2);
}
/************************************************** 函数:SPI_RW_REG()
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 分频值为 4
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2,ENABLE);
******************************************************************************/
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 bytes) {
u8 status,i;
CS_LOW(); // CS 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 for(i=0; i<bytes; i++) {
u8 status; CS_LOW(); // CSN 置低,开始传输数据 SPI2_ReadWriteByte(reg); // 选择寄存器 status=SPI2_ReadWriteByte(0); // 然后从该寄存器读数 CS_HIGH(); // CSN 拉高,结束数据传输
return (status); // 返回寄存器数据 } /****************************************************************************** **
SPI2_ReadWriteByte(*pBuf++); // 逐个字节写入 nRF24L01
} CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器
} /****************************************************************************** *
函数:NRF24L01_Read_Reg(BYTE reg)
描述:从 reg 寄存器读一字节
******************************************************************************* */
u8 NRF24L01_Read_Reg(u8 reg) {
STM32 驱动无线模块,已调好可用
#include "bsp.h"
u8 TX_ADDRESS[TX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
u8 RX_ADDRESS[RX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
描述: 根据 SPI 协议,写一字节数据到 nRF24L01,同时从 nRF24L01 读出一字节
**************************************************/ u8 NRF24L01_Write_Reg(u8 reg, u8 value) {
u8 status; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 SPI2_ReadWriteByte(value); // 然后写数据到该寄存器
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回 }
/*****************************************************************************
函数:SPI_Write_Buf()
描述:把 pBuf 缓存中的数据写入到 nRF24L01,通常用来写入发射通道数据或接收/发送地址
/**************************************************** 函数名:SPI 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/ void SPI2_Config(void) {
u8 status,i; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 for(i=0; i<bytes; i++) {
pBuf[i]=SPI2_ReadWriteByte(0); // 逐个字节从 nRF24L01 读出 }
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XF0,0XF0,0XF0,0XF0,0XF0};
u8 i;
// SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi 速度为 9Mhz(24L01 的最大 SPI 时钟为
10Mhz)
NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入 5 个字节的地址.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI2 设置为双线
全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 0 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 件控制
u8 SPI2_ReadWriteByte(u8 data)
{
u32 timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
SPI_I2S_SendData(SPI2,data);
NRF24L01_Read_Buf(TX_ADDR,buf,5);
//读出写入的地址
for(i=0;i<5;i++)
//检测读到的数据是否正确
{
if(buf[i]!=0XF0)
break;
}
if(i!=5) return 1;//检测 NRF24L01 失败
return 0;
//检测 NRF24L01 成功
//PG6 -- CE PG7 -- CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PG6 7 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定 IO //IRQ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOG, &GPIO_InitStructure);
//SPI 主机模
//数据 8 位 //CPOL -
//CPHA - 0 //NSS 信号软
// 波 特 率 预Hale Waihona Puke Baidu
// 数 据 传 输 从
//CRC 值
CE_LOW();//待机 CS_HIGH(); } /**************************************************** 函数名:NRF24L01 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/
GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器 } /****************************************************************************** **
函数:RX_Mode()
}
/****************************************************
函数名:SPI2_Send_Receive_Byte
形参: data -- 给 FLASH 发送的数据
返回值:flash 返回的数据
函数功能:给 FLASH 发送数据和读取数据
****************************************************/