NRF52832 ESB通信
esb通信,也就是纯2.4g的一个通信,据说是兼容24L01+芯片,没有试过,这里是用两个nrf52832芯片做的通信实验。
相关历程参考 如下:
历程里面注释确实不多。
里面函数api介绍可以参考官方SDK文档:https://infocenter.nordicsemi.com/index.jsp
esb通信和24L01+芯片初始化内容大致是类似的,基本上就是初始化通信速度,模式,重发时间,通道,地址,等,
小区别:
esb多了一个回调函数。
地址 =基地址(4byte)+前缀地址(1byte )两部分组成,地址长度是5个字节,在24L01+中是没有这样分开配置的。同样的,除了pipe0的基地址可以改,其它pipe只有使用同样的基地址,所有的pipe前缀地址都可以改变。
//发射初始化
uint32_t esb_init_tx( uint8_t ch, uint8_t *addr )
{clocks_start();uint32_t err_code;//uint8_t base_addr_0[4] = {0x57, 0xE7, 0x87, 0xE7};//uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2};uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 };nrf_esb_config_t nrf_esb_config = NRF_ESB_DEFAULT_CONFIG;nrf_esb_config.protocol = NRF_ESB_PROTOCOL_ESB_DPL;nrf_esb_config.retransmit_delay = 600;nrf_esb_config.bitrate = NRF_ESB_BITRATE_2MBPS;nrf_esb_config.event_handler = nrf_esb_event_handler_tx;nrf_esb_config.mode = NRF_ESB_MODE_PTX;nrf_esb_config.selective_auto_ack = false;err_code = nrf_esb_init(&nrf_esb_config);err_code =nrf_esb_set_rf_channel(ch); //通信通道err_code = nrf_esb_set_base_address_0(addr); //只用pipe 0,4个地址可变//err_code = nrf_esb_set_base_address_1(base_addr_1);err_code = nrf_esb_set_prefixes(addr_prefix, NRF_ESB_PIPE_COUNT);return err_code;
}
本文章是对esb通信进行了封装,方便直接调用使用
所有源码:
#include "wp_esp.h"
#include "app_error.h"#include "bsp.h"
#include "nrf_delay.h"
#include "nrf_esb.h"
#include "nrf_log.h"static nrf_esb_payload_t tx_payload = NRF_ESB_CREATE_PAYLOAD(0, 0x0, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00);
nrf_esb_payload_t rx_payload;void nrf_esb_event_handler_rx(nrf_esb_evt_t const * p_event)
{switch (p_event->evt_id){case NRF_ESB_EVENT_TX_SUCCESS:printf("TX SUCCESS EVENT\r\n");break;case NRF_ESB_EVENT_TX_FAILED:printf("TX FAILED EVENT\r\n");break;case NRF_ESB_EVENT_RX_RECEIVED:printf("RX RECEIVED EVENT\r\n");if (nrf_esb_read_rx_payload(&rx_payload) == NRF_SUCCESS){printf("Receiving packet: %02x\r\n", rx_payload.data[1]);}break;}
}//接收初始化
uint32_t esb_init_rx( uint8_t ch, uint8_t *addr )
{uint32_t err_code;//uint8_t base_addr_0[4] = {0xe7, 0xE7, 0xE7, 0xE7};//uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2};uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 };nrf_esb_config_t nrf_esb_config = NRF_ESB_DEFAULT_CONFIG;nrf_esb_config.payload_length = 8;nrf_esb_config.protocol = NRF_ESB_PROTOCOL_ESB_DPL;nrf_esb_config.bitrate = NRF_ESB_BITRATE_2MBPS;nrf_esb_config.mode = NRF_ESB_MODE_PRX;nrf_esb_config.event_handler = nrf_esb_event_handler_rx;nrf_esb_config.selective_auto_ack = false;err_code = nrf_esb_init(&nrf_esb_config);err_code =nrf_esb_set_rf_channel(ch);err_code = nrf_esb_set_base_address_0(addr);//err_code = nrf_esb_set_base_address_1(base_addr_1);err_code = nrf_esb_set_prefixes(addr_prefix, 8);return err_code;
}void nrf_esb_event_handler_tx(nrf_esb_evt_t const * p_event)
{switch (p_event->evt_id){case NRF_ESB_EVENT_TX_SUCCESS:printf("TX SUCCESS EVENT\r\n");break;case NRF_ESB_EVENT_TX_FAILED:printf("TX FAILED EVENT\r\n");(void) nrf_esb_flush_tx();(void) nrf_esb_start_tx();break;case NRF_ESB_EVENT_RX_RECEIVED:printf("RX RECEIVED EVENT\r\n");while (nrf_esb_read_rx_payload(&rx_payload) == NRF_SUCCESS){if (rx_payload.length > 0){printf("RX RECEIVED PAYLOAD %x\r\n",rx_payload.data[1]);}}break;}
}//发射初始化
uint32_t esb_init_tx( uint8_t ch, uint8_t *addr )
{uint32_t err_code;//uint8_t base_addr_0[4] = {0x57, 0xE7, 0x87, 0xE7};//uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2};uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 };nrf_esb_config_t nrf_esb_config = NRF_ESB_DEFAULT_CONFIG;nrf_esb_config.protocol = NRF_ESB_PROTOCOL_ESB_DPL;nrf_esb_config.retransmit_delay = 600;nrf_esb_config.bitrate = NRF_ESB_BITRATE_2MBPS;nrf_esb_config.event_handler = nrf_esb_event_handler_tx;nrf_esb_config.mode = NRF_ESB_MODE_PTX;nrf_esb_config.selective_auto_ack = false;err_code = nrf_esb_init(&nrf_esb_config);err_code =nrf_esb_set_rf_channel(ch);err_code = nrf_esb_set_base_address_0(addr); //只用pipe 0,4个地址可变//err_code = nrf_esb_set_base_address_1(base_addr_1);err_code = nrf_esb_set_prefixes(addr_prefix, NRF_ESB_PIPE_COUNT);return err_code;
}uint32_t esp_start_rx(void )
{return nrf_esb_start_rx();
}void test_send(void )
{tx_payload.noack = false;if (nrf_esb_write_payload(&tx_payload) == NRF_SUCCESS){//printf("Sending packet ok \r\n");tx_payload.data[1]++;}else{printf("Sending packet failed \r\n");}}
发射端调用:
u8 ch =10;u8 addr[4] ={0x57, 0xE7, 0x87, 0xE7};esb_init_tx(ch,addr);printf("ESP TX \r\n");printf("Sending packet ...");while(1){test_send();nrf_delay_ms(1000);}
接收端使用:
u8 ch =10;u8 addr[4] ={0x57, 0xE7, 0x87, 0xE7};esb_init_rx(ch,addr);esp_start_rx();printf("ESP RX \r\n");while (1){}
可以看到,只有发射端在主任务里面做了发送处理,接收端所有的处理都在回调函数里面,比24L01芯片好用多了,这个例子也是实现了双向传输,官方的例子是单向传输。
运行效果:
NRF52832 ESB通信相关推荐
- asp.net三层架构制作新闻管理_程序员蜕变为架构师必须要知道的「架构理论」...
架构目的和指标 架构目的: 架构设计的主要目的是为了解决软件系统复杂度带来的问题,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行成本来保障软件的运行.让软件达到"高内聚.松 ...
- Microservices vs SOA - 微服务与SOA
开始之前,我们先简单看下单体架构.SOA与微服务之间的区别,如下图所示: 简单来讲,对于单体架构,其就像一个超大容器,容器内集中包含了该应用的所有软件组件,并且组件与组件之间紧密耦合. 而对于SOA架 ...
- NRF52832之ESB功能与NRF24L01进行2.4G通信
NRF52之ESB学习笔记 目的:为了能与NRF24L01通信,工程中加入nrf_esb.c, nrf_esb.h 先了解RADIO的各种工作状态及流程 1状态 RADIO的工作状态: DISABLE ...
- nrf52832与nrf24L01+通信
使用2.4G无线芯片nrf24L01+与蓝牙芯片nrf52832通信,nrf52832工作在2.4G模式. nrf24L01+使用以前调试通过程序,两个nrf24L01+通信良好. nrf52832模 ...
- NRF52832与W25Q80通信
1 NRF52832SPI主机的功能描述 nRF52832SPIM的主要特征 3个SPI实例 支持SPI的模式0到模式3 支持DMA Individual selection of IO pin fo ...
- [单片机框架][bsp层][nrf52832][nrf52840][nrf52810][nrf52820][ESB(2.4G)] ESB(2.4G)使用说明
这个指南描述了什么是ESB(Enhanced ShockBurst)以及如何在nRF5系列中使用ESB. ESB支持双向数据包通信,包括数据包缓冲,数据包确认和丢失数据包的自动重传的基本协议.ESB提 ...
- Enhanced ShockBurst (ESB)原文翻译
自我学习为主,同时也为所需要的提供一份资料 官方地址 增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲.数据包确认和丢失数据包的自动重传.ESB以低功耗提供无线通 ...
- nrf52 ESB通信协议底层探讨
这里写自定义目录标题 nrf52 ESB通信协议底层分析 RADIO 数据包配置 ESB向导 nrf52 ESB通信协议底层分析 此文主要探讨nrf52832 2.4G RADIO数据传输过程,以及e ...
- Shuttle ESB实现消息推送
ESB全称Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物. ESB的出现改变了传统的软件架构,能够提供比传统中间件产品更为便宜的解 ...
最新文章
- lua 开发环境搭建(windows 平台)
- SQLServer 数据库变成单个用户后无法访问问题的解决方法
- android device monitor命令行窗口在哪里_Vulkan在Android使用Compute shader
- CentOS/用FTP客户端软件连接到服务器
- EPPLUS之外的选择,EXCEL的操作(NPOI,POI(java))
- vue cli 对解析的html内容的图片添加样式
- conda 安装指定版本tensorflow cpu/gpu
- [转载]Qt之模型/视图(实时更新数据)
- 797. 差分(有图解)
- Tomcat修改端口号(7.0 version)
- 自动部署 mysql_MySQL5.7自动部署脚本(持续更新)
- AndroidStudio Debug调试使用
- 编辑栏不见了_微信图文编辑器集合和使用技巧
- python基础四 面向对象编程
- 高效的JS 拼接字符串
- Pat(Advanced Level)Practice--1054(The Dominant Color)
- R语言使用循环语句一次性画出多幅图
- 各版本最新的Visual C++可再发行组件包(Redistributable Package)下载和合集
- python获取上一级目录
- 艺赛旗(RPA)Python 学习之异常
热门文章
- 2020北大信科计算机考研公示,2020年北京大学信息科学技术学院硕士研究生拟录取名单.pdf...
- emoji表情mysql报错_MySql存储emoji表情报错的处理方法
- bigemap手机版app如何加载矢量数据
- element ui注册页面(form+input+steps)
- 这世界就是,一些人总在昼夜不停地运转,而另外一些人,起床就发现世界已经变了。...
- 浪漫主义和革命英雄主义的回忆
- 每日工作记录——ERROR:Simulator:793 - Unable to elaborate instantiated module work
- 第3课:郭盛华教学视频_PHP连接MySQL数据库的方法
- 虚地址到实地址的翻译过程
- 1、ABP 文档介绍