小弟刚学STM32f103,用到 无线模块NRF24l01 和 SPI,搞了很久单片机都没检测到 nrf24l01
问题1:SPIx->DR=Data之后,我再用串口传SPIx->DR,发现和Data不一致,而且是乱码
问题2:SPI2的MOSI管脚(PB15)用示波器看不到波形,一直是低电平。CLK是2Mhz的矩形波
描述:管脚连接方面我检查了很多遍了,没有接错; 代码用的原子例程里的无线通信部分,用不了,做了一点点修改还是不行,
不知道我初始化有木有问题呢;
目前一直停留在查找是否存在NRF24l01的步骤。
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef *SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; // PB13:CLK PB15:MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8; //PB7:CE PB8:CSN
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9: IRQ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG9 êäèë
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
SPI_Cmd(SPI2, DISABLE);
SPI_InitStructure->SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure->SPI_Mode = SPI_Mode_Master;
SPI_InitStructure->SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure->SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure->SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure->SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure->SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure->SPI_CRCPolynomial = 7;
SPI_Init(SPI2, SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
SPI2_ReadWriteByte(0xff);
}
u8 SPI2_ReadWriteByte(u8 TxData)
{
int retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
{
retry++;
if(retry>200){
return 0;}
}
SPI2->DR=TxData; =============================================这里出问题了
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
{
retry++;
if(retry>200){
return 0;}}
return SPI2->DR;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#ifndef _NRF24L01_H_
#define _NRF24L01_H_
#include "stm32f10x.h"
/*****************************************管脚定义*************************************/
#define NRF24L01_CSNON GPIOB->BSRR = GPIO_Pin_12
#define NRF24L01_CSNOFF GPIOB->BRR = GPIO_Pin_12
#define NRF24L01_CEON GPIOB->BSRR = GPIO_Pin_11
#define NRF24L01_CEOFF GPIOB->BRR = GPIO_Pin_11
/*****************************************地址、数据长度*************************************/
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 20 uints TX payload
#define RX_PLOAD_WIDTH 32 // 20 uints TX payload
#define MAX_TX 0x10 //达到最大发送次数中断
#define TX_OK 0x20 //TX发送完成中断
#define RX_OK 0x40 //接收到数据中断
#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
/***************************************NRF24L01寄存器指令*******************************************************/
#define READ_REGS 0x00 // 读寄存器指令
#define WRITE_REGS 0x20 // 写寄存器指令
#define RD_RX_PLOAD 0x61 // 读取接收数据指令
#define WR_TX_PLOAD 0xA0 // 写待发数据指令
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令
#define NOP 0xFF // 保留
/*************************************SPI(nRF24L01)寄存器地址****************************************************/
#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 // 自动应答功能设置
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设置
#define SETUP_RETR 0x04 // 自动重发功能设置
#define RF_CH 0x05 // 工作频率设置
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送监测功能
#define CD 0x09 // 地址检测
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
#define RX_ADDR_P5 0x0F // 频道5接收数据地址
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
/***********************函数声明**********************/
extern void NRF24L01_GPIO_SPI_Configration(void);
extern u8 nRF24L01_TxPacket(u8 *tx_buf);
extern u8 nRF24L01_RxPacket(u8 *rxbuf);
extern void RX_NRF24L01(void);
extern void TX_NRF24L01(void);
extern u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 uchars);
extern u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 uchars);
extern u8 SPI_RW_Reg(u8 reg, u8 value);
#endif
一周热门 更多>