什么专业学做网站,电商运营新手要懂哪些,江苏专业的网站建设,烟台福山建设规划局网站nRF24L01 采用 QFN20 封装#xff0c;有 20 个引脚#xff0c;以下是各引脚的详细介绍#xff1a; 1. 电源引脚 ◦ VDD#xff1a;电源输入端#xff0c;一般接 3V 电源#xff0c;为芯片提供工作电压#xff0c;供电电压范围为 1.9V#xff5e;3.6V。 ◦ VSS#xf…nRF24L01 采用 QFN20 封装有 20 个引脚以下是各引脚的详细介绍 1. 电源引脚 ◦ VDD电源输入端一般接 3V 电源为芯片提供工作电压供电电压范围为 1.9V3.6V。 ◦ VSS电源地引脚接地为芯片提供电气参考电位。 ◦ VDD_PA为功率放大器供电输出为 1.8V给射频功率放大器提供所需的电源。 ◦ DVDD去耦电路电源正极端用于连接去耦电容为芯片内部电路提供稳定的电源。 2. SPI 接口引脚 ◦ CSNSPI 片选信号引脚低电平有效。当 CSN 为低电平时芯片被选中微处理器可以通过 SPI 接口对 nRF24L01 进行配置和数据传输。 ◦ SCKSPI 时钟引脚用于同步 SPI 数据传输由微处理器提供时钟信号决定数据传输的速率和时序。 ◦ MOSI主设备输出从设备输入引脚微处理器通过该引脚将数据发送到 nRF24L01 芯片中进行寄存器配置、发送数据等操作。 ◦ MISO主设备输入从设备输出引脚nRF24L01 通过该引脚将数据返回给微处理器如返回寄存器的值、接收的数据等。 3. 控制与状态引脚 ◦ CE使能发射或接收引脚数字输入。在 CSN 为低的情况下CE 协同 CONFIG 寄存器共同决定 nRF24L01 的状态用于选择芯片的工作模式如发射模式、接收模式、待机模式等。 ◦ IRQ中断标志位引脚数字输出低电平触发。当状态寄存器中 TX_DS数据发送完成中断位、RX_DR接收数据中断位或 MAX_RT达到最多次重发中断位为高时触发中断通知微处理器进行相应的处理。 4. 晶体振荡器引脚 ◦ XC2晶体振荡器 2 脚模拟输出用于连接外部晶体振荡器的一端与 XC1 共同构成晶体振荡电路为芯片提供时钟信号。 ◦ XC1晶体振荡器 1 脚 / 外部时钟输入脚模拟输入可连接外部晶体振荡器的另一端也可以作为外部时钟信号的输入引脚。 5. 天线接口引脚 ◦ ANT1天线接口 1用于连接天线实现射频信号的发射和接收。 ◦ ANT2天线接口 2同样用于连接天线与 ANT1 共同作用提高射频信号的传输性能。 6. 参考电流输入引脚 ◦ IREF参考电流输入引脚模拟输入用于输入参考电流为芯片内部的电路提供基准电流。
ADC 配置
/* ADC 及引脚 定义 */
#define ADC_ADCX_CHY_GPIO_PORT GPIOA
#define ADC_ADCX_CHY_GPIO_PIN GPIO_PIN_5
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE();\
}while(0) /* PA 口时钟使能 */
#define ADC_ADCX ADC1
#define ADC_ADCX_CHY ADC_CHANNEL_5 /* 通道 Y, 0 Y 16 */
/* ADC1 时钟使能 */
#define ADC_ADCX_CHY_CLK_ENABLE() do{ __HAL_RCC_ADC1_CLK_ENABLE();}while(0)
ADC_HandleTypeDef hadc; void ADC_Init(void)
{ __HAL_RCC_ADC1_CLK_ENABLE();// 使能ADC时钟 // 配置ADC结构体参数 hadc.Instance ADC1; // 选择使用ADC1
hadc.Init.ClockPrescaler ADC_CLOCK_SYNC_PCLK_DIV4; // 时钟预分频这里将APB2时钟PCLK除以4作为ADC时钟
hadc.Init.Resolution ADC_RESOLUTION_12B; // 分辨率设置为12位这意味着ADC转换结果的范围是0 - 4095
hadc.Init.ScanConvMode DISABLE; // 禁用扫描模式因为我们只处理单个通道
hadc.Init.ContinuousConvMode ENABLE;
// 启用连续转换模式ADC会不断进行转换而不是只进行一次
hadc.Init.DiscontinuousConvMode DISABLE; // 禁用不连续转换模式
hadc.Init.ExternalTrigConvEdge ADC_EXTERNALTRIGCONVEDGE_NONE;
// 不使用外部触发转换即采用软件触发 hadc.Init.ExternalTrigConv ADC_SOFTWARE_START; // 软件触发ADC转换
hadc.Init.DataAlign ADC_DATAALIGN_RIGHT; // 数据右对齐转换结果的低12位有效
hadc.Init.NbrOfConversion 1; // 转换通道数量为1
hadc.Init.DMAContinuousRequests DISABLE; // 禁用DMA连续请求这里不使用DMA传输
hadc.Init.EOCSelection ADC_EOC_SINGLE_CONV; // 单个转换结束标志 // 3. 初始化ADC
if (HAL_ADC_Init(hadc) ! HAL_OK) { Error_Handler();// 初始化失败处理 } ADC_ChannelConfTypeDef sConfig;// 4. 配置ADC通道
sConfig.Channel ADC_CHANNEL_0; // 选择ADC通道0可根据实际连接的引脚修改 sConfig.Rank 1; // 通道转换顺序为第1个 sConfig.SamplingTime ADC_SAMPLETIME_3CYCLES; // 采样时间设置为3个ADC时钟周期可根据需要调整 if (HAL_ADC_ConfigChannel(hadc, sConfig) ! HAL_OK) { Error_Handler();// 通道配置失败处理 }
}
// 错误处理函数示例
void Error_Handler(void)
{ while (1) { // 可以添加错误提示代码如点亮LED等 }
}
音频信号采集,模拟信号转换为数字信号
uint16_t adc_value; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{ if (hadc-Instance ADC1) { adc_value HAL_ADC_GetValue(hadc); // 在这里可以对采集到的数字音频信号进行进一步处理
GPIO_InitTypeDef gpio_init_struct;
ADC_ADCX_CHY_CLK_ENABLE(); /* 使能 ADCx 时钟 */
ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启 GPIO 时钟 */
/* AD 采集引脚模式设置,模拟输入 */
gpio_init_struct.Pin ADC_ADCX_CHY_GPIO_PIN;
gpio_init_struct.Mode GPIO_MODE_ANALOG;
gpio_init_struct.Pull GPIO_PULLUP;
HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, gpio_init_struct); }
}
编码与调制
#include nrf24l01.h void ASK_Modulate(uint16_t data)
{ // 将数字信号转换为适合ASK调制的形式例如0对应低电平非0对应高电平 uint8_t modulated_data (data 0)? 0 : 1; // 发送调制后的数据到nRF24L01 NRF24L01_TxPacket(modulated_data);
}
无线传输
#include stm32f4xx_hal.h
#include nrf24l01.h // 定义nRF24L01相关引脚
#define NRF24L01_CE_Pin GPIO_PIN_0
#define NRF24L01_CE_GPIO_Port GPIOA
#define NRF24L01_CSN_Pin GPIO_PIN_1
#define NRF24L01_CSN_GPIO_Port GPIOA
#define NRF24L01_IRQ_Pin GPIO_PIN_2
#define NRF24L01_IRQ_GPIO_Port GPIOA // 定义SPI句柄
extern SPI_HandleTypeDef hspi1; // 初始化nRF24L01相关GPIO引脚
static void NRF24L01_GPIO_Init(void)
{ GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 配置CE引脚 GPIO_InitStruct
.Pin NRF24L01_CE_Pin; GPIO_InitStruct
.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct
.Pull GPIO_NOPULL; GPIO_InitStruct
.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(NRF24L01_CE_GPIO_Port, GPIO_InitStruct); // 配置CSN引脚 GPIO_InitStruct
.Pin NRF24L01_CSN_Pin; GPIO_InitStruct
.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct
.Pull GPIO_NOPULL; GPIO_InitStruct
.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(NRF24L01_CSN_GPIO_Port, GPIO_InitStruct); // 配置IRQ引脚 GPIO_InitStruct
.Pin NRF24L01_IRQ_Pin; GPIO_InitStruct
.Mode GPIO_MODE_INPUT; GPIO_InitStruct
.Pull GPIO_NOPULL; HAL_GPIO_Init(NRF24L01_IRQ_GPIO_Port, GPIO_InitStruct); // 初始化CE和CSN引脚电平 HAL_GPIO_WritePin(NRF24L01_CE_GPIO_Port, NRF24L01_CE_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
} // 向nRF24L01写寄存器
static void NRF24L01_Write_Reg(uint8_t reg, uint8_t value)
{ HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, ®, 1, 100); HAL_SPI_Transmit(hspi1, value, 1, 100); HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET);
} // 从nRF24L01读寄存器
static uint8_t NRF24L01_Read_Reg(uint8_t reg)
{ uint8_t value; HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, ®, 1, 100); HAL_SPI_Receive(hspi1, value, 1, 100); HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET); return value;
} // 初始化nRF24L01
void NRF24L01_Init(void)
{ // 初始化相关GPIO引脚 NRF24L01_GPIO_Init(); // 延时一段时间等待nRF24L01上电稳定 HAL_Delay(100); // 配置为发射模式可根据需要修改为接收模式 NRF24L01_Write_Reg(NRF24L01_REG_CONFIG, 0x0E); // 使能CRC2字节CRC校验上电发射模式 // 设置通道频率 NRF24L01_Write_Reg(NRF24L01_REG_RF_CH, 0x40); // 通道76 // 设置数据速率和发射功率 NRF24L01_Write_Reg(NRF24L01_REG_RF_SETUP, 0x0F); // 2Mbps速率最大发射功率 // 设置接收地址宽度 NRF24L01_Write_Reg(NRF24L01_REG_SETUP_AW, 0x03); // 5字节地址宽度 // 设置自动重发时间和次数 NRF24L01_Write_Reg(NRF24L01_REG_SETUP_RETR, 0x1A); // 自动重发延迟500us重发次数10次 // 设置接收通道0地址 uint8_t rx_addr_p0[5] {0xE7, 0xE7, 0xE7, 0xE7, 0xE7}; HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, (uint8_t *)NRF24L01_CMD_WRITE_REG NRF24L01_REG_RX_ADDR_P0, 1, 100); HAL_SPI_Transmit(hspi1, rx_addr_p0, 5, 100); HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET); // 设置发射地址 uint8_t tx_addr[5] {0xE7, 0xE7, 0xE7, 0xE7, 0xE7}; HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, (uint8_t *)NRF24L01_CMD_WRITE_REG NRF24L01_REG_TX_ADDR, 1, 100); HAL_SPI_Transmit(hspi1, tx_addr, 5, 100); HAL_GPIO_WritePin(NRF24L01_CSN_GPIO_Port, NRF24L01_CSN_Pin, GPIO_PIN_SET); // 设置接收通道0数据长度 NRF24L01_Write_Reg(NRF24L01_REG_RX_PW_P0, 1); // 1字节数据长度 // 清除中断标志 NRF24L01_Write_Reg(NRF24L01_REG_STATUS, 0x70);
}int main(void)
{ // 初始化ADC、nRF24L01等 ADC_Init(); NRF24L01_Init(); while (1) { // 启动ADC转换 HAL_ADC_Start_IT(hadc); // 等待ADC转换完成在中断中获取adc_value // 对采集到的音频数据进行编码和ASK调制并发送 ASK_Modulate(adc_value); }
} DAC 实验数模转换器 typedef struct
{ DAC_TypeDef *Instance; /* DAC 寄存器基地址 */ __IO HAL_DAC_StateTypeDef State; /* DAC 工作状态 */ HAL_LockTypeDef Lock; /* DAC 锁定对象 */ DMA_HandleTypeDef *DMA_Handle1; /* 通道 1 的 DMA 处理句柄指针 */ DMA_HandleTypeDef *DMA_Handle2; /* 通道 2 的 DMA 处理句柄指针 */ __IO uint32_t ErrorCode; /* DAC 错误代码 */
} DAC_HandleTypeDef;
typedef struct
{ uint32_t Trigger; //指定DAC触发源
DAC_TRIGGER_NONE不使用触发源通过软件触发。
DAC_TRIGGER_T6_TRGO使用定时器 6 的触发输出TRGO作为触发源。
DAC_TRIGGER_T3_TRGO使用定时器 3 的触发输出TRGO作为触发源。 uint32_t OutputBuffer; //指定DAC输出缓冲状态
DAC_OUTPUTBUFFER_ENABLE使能输出缓冲提高输出驱动能力。
DAC_OUTPUTBUFFER_DISABLE禁用输出缓冲。
} DAC_InitTypeDef;
MSP 初始化函数 HAL_DAC_MspInit
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac);
DAC 的通道参数初始化函数:
HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,
DAC_ChannelConfTypeDef *sConfig, uint32_t Channel); typedef struct
{ uint32_t DAC_Trigger; /* DAC 触发源的选择 */ uint32_t DAC_OutputBuffer; /* 启用或者禁用 DAC 通道输出缓冲区 */
} DAC_ChannelConfTypeDef; 使能启动 DAC 转换通道函数
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel); DAC 的通道输出值函数其声明如下
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel,
uint32_t Alignment, uint32_t Data);
Channel选择输出通道 DAC_CHANNEL_1或DAC_CHANNEL_2 DAC 读取通道输出值函数
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);
启动 DAC 使用 DMA 方式传输函数
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel,
uint32_t *pData, uint32_t Length, uint32_t Alignment);
形参 3 是使用 DAC 输出数据缓冲区的指针。
形参 4 是 DAC 输出数据的长度。
形参 5 是指定 DAC 通道的数据对齐方式有DAC_ALIGN_8B_R8 位右对齐、
DAC_ALIGN_12B_L12 位左对齐和 DAC_ALIGN_12B_R12 位右对齐三种方式
停止 DAC 的 DMA 方式函数其声明如下
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel); 配置主模式下的定时器触发输出选择函数其声明如下
HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(
TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); 接收端无线接收
uint8_t received_data;
void NRF24L01_Receive(void)
{ if (NRF24L01_RxPacket(received_data) 0) { // 接收成功对received_data进行处理 }
}
解调与解码
uint16_t ASK_Demodulate(uint8_t data)
{ // ASK解调将接收到的数据转换为数字音频信号形式
return (data 0)? 0 : 1000; // 这里假设0对应01对应1000实际需根据编码情况调整
}
DAC 配置与音频输出
DAC_HandleTypeDef hdac;
void DAC_Init(void)
{ hdac.Instance DAC; hdac.Init.OutputBuffer DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_Init(hdac); // 配置DAC通道 DAC_ChannelConfTypeDef sConfig; sConfig.DAC_Channel DAC_CHANNEL_1; sConfig.DAC_OutputBuffer DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_ConfigChannel(hdac, sConfig);
}
int main(void)
{ // 初始化nRF24L01、DAC等 NRF24L01_Init(); DAC_Init(); while (1) { // 接收无线数据 NRF24L01_Receive(); // 对接收数据进行ASK解调 uint16_t demodulated_data ASK_Demodulate(received_data); // 通过DAC输出模拟音频信号 HAL_DAC_SetValue(hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, demodulated_data); }
}