自我学习为主,同时也为所需要的提供一份资料
官方地址
增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲、数据包确认和丢失数据包的自动重传。ESB以低功耗提供无线通信,并且实现的代码量小且易于使用。
ESB协议嵌入了传统nRF24L系列的硬件中。增强型ShockBurst模块使nRF5系列设备能够使用ESB协议与nRF5或nRF24L系列设备通信。
ESB具有自动数据包事务处理功能,可轻松实现可靠的双向数据链路。事务是两个收发机之间的分组交换,其中一个收发机充当主接收机(PRX),另一个收发机作为主发射机(PTX)。
特点:
- 支持星形网络拓扑,通常具有一个主接收机(PRX)和最多8个主发射机(PTX)
- 传统模式下的1到32字节动态有效负载长度
- nRF5系列设备之间的1至252字节静态有效负载长度
- 每个PTX和PRX之间的双向数据传输
- 数据包确认和自动数据包重传功能
- 每个管道拥有单独TX和RX FIFO
- 向后兼容传统nRF24Lxx增强型ShockBurst
- 支持外部前端模块
资源
ESB要求独占访问增强型ShockBurst库的所有固定和配置资源,以确保正确操作
注意没有MPU强制执行这种独占访问,因此操纵这些资源会产生未定义的行为。
无线电和定时器中断处理程序以优先级0(最高级别)运行,ESB回调函数以优先级1运行。应用程序使用的其他中断必须使用优先级级别2或更低(级别2到7)以确保正确操作。
ESB需要MPSL库来支持前端模块。该库始终链接到构建中,但是,默认情况下,它不会被初始化,以便为应用程序和ESB协议提供对所有硬件资源的访问。有关详细信息,请参阅Direct support。
向后兼容性
增强型ShockBurst库与传统的nRFgo SDK兼容。要确保使用nRFConnect SDK构建的应用程序可以与运行使用nRFgo SDK构建的程序的nRF24设备通信,请使用配置ESB_LEGACY_CONFIG。
但是,请注意,两个SDK中提供的示例并不对应,因此您不能将一个SDK中的发送器示例与另一个SDK的接收器示例一起使用
数据包事务
增强型ShockBurst包事务由来自PTX的包传输发起,并在PTX从PRX接收到确认包(ACK包)时成功完成。
为了启用双向数据链路,允许PRX将数据有效载荷附加到ACK分组。为此,PRX向其TX FIFO添加一个分组,该分组作为下一个ACK分组中的有效载荷发送。
如果PTX在初始发送的分组之后没有接收到ACK,则它尝试重新发送分组,直到最终接收到ACK。允许的最大重传尝试次数和每次尝试之间的延迟由最近一次调用esb_init()(其中esb_config结构中esb_config.retransmission_count和esb_config_retransmission_delay的值分别指定重传尝试的次数和它们之间的延迟)或函数esb_set_rest_count()和esb_set_rest_delay()。重传延迟被定义为每次传输尝试开始之间的持续时间。注意,这与传统的nRF24L系列硬件实现不同,后者将延迟定义为从数据包传输结束到重传开始的持续时间。
如果从PRX发送到PTX的ACK分组丢失,但初始分组和随后的重传尝试都被PRX成功接收,则重复的分组将被PRX丢弃。这防止了PRX应用程序接收重复的数据包。然而,重复的数据包将始终被PRX确认,即使它们被丢弃。
PTX可以选择发送到PRX的各个分组不需要从PRX返回ACK。当应用程序使用传递给esb_write_bayload()函数的esb_paiload参数的esb_pyload.noack字段将数据包上载到TX FIFO时,会做出此决定。
当PRX接收到不需要ACK的分组时,它不向PTX发送ACK分组,因此PTX将继续重传该分组,直到达到允许的最大重传尝试次数。
设置ESB应用程序
执行以下步骤设置应用程序以发送和接收数据包:
-
使用ESB_init()初始化ESB。您可以使用ESB_default_CONFIG中的默认参数作为p_CONFIG参数的起点,并在需要时重新配置它们。
-
如有必要,请使用以下任一函数更新地址、地址前缀、信道和比特率:
esb_set_base_address_0()
esb_set_base_address_1()
esb_set_prefixes()
esb_set_rf_channel()
esb_set_bitrate() -
确保高频时钟正在运行:
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
-
开始发送或接收数据包:
-如果节点是PTX:
通过调用esb_write_bayload()将数据包添加到TX FIFO。
根据最近一次调用esb_init()时使用的esb_config.tx_mode的值,您可能需要 调用esb_start_tx()来启动传输。
无线电收到确认或超时后,处理ESB_EVENT_TX_SUCCESS、ESB_EVENT_TX_FAILED和ESB_EVERT_RX_RECEIVE事件。 -
如果节点是PRX:
-
当数据包传入时,处理ESB_EVENT_RX_RECEIVED事件。每个事件之间可能有多个数据包到达RX FIFO。
-
为了将有效载荷附加到确认数据包(即ACK包),请使用esb_write_bayload()将它们先添加到TX FIFO。在接收数据包之前,必须对payload进行排队。当在队的payload被发送并收到确认后,此时就假设它已经到达了另一个设备。因此,ESB_EVENT_TX_SUCCESS事件被触发进入事件等待队列。
要停止ESB模块,请调用ESB_disable()。但是,请注意,如果在禁用模块时事务正在进行,则事务不会完成。因此,在禁用模块之前,您可能需要检查模块是否空闲。
频率选择
ESB可以使用nRF5芯片可以使用的任何通道发送或接收数据包。通过调用esb_set_rf_channel()函数来选择通道。
注意:PTX和PRX必须配置为使用相同的频率来交换数据包。
管道和寻址
节点上的每个逻辑地址都称为管道。每个管道映射到发送或接收数据包时使用的一个广播地址。
广播地址由前缀地址和基地址组成,基地址为2-4字节,前缀地址为1字节。注意,nRF5无线电使用0和1的交替序列作为分组的前导码。因此,为了正确接收数据包,基址的最高有效字节不能是0和1的交替序列,也就是说,它不能是0x55或0xAA。
管道0具有自己的唯一基址(基址0),而管道1-7使用相同的基址(基址1)。8个管道中的每一个都有一个唯一的一字节长的前缀地址。
广播时,首先传输每个地址字节的最高有效位。2-4字节长的基地址的最高有效字节是第一个发送的地址字节,而前缀字节是最后一个发送的。
地址不能由0x00前缀和格式为0x00XXXXXX(长度4)/0x0000XXXX(长度5)的地址组成。这样的零地址将导致返回错误代码NRF_error_INVALID_PARAM。
注意,ESB和nRF5无线电外围设备中的字节顺序不同,因为地址字节在ESB中被重新排列以匹配nRF24L无线电。
数据包标识
从PTX发送到PRX的任何分组由分组报头中的两位分组ID字段(PID)以及分组的循环冗余校验(CRC)字段唯一标识。如果新分组具有相同的有效载荷,则该分组ID用于区分新分组与前一分组。
在PRX,重传的分组被丢弃,并且不添加到RX FIFO。并且ESB_EVENT_RX_RECEIVED事件不会被调用。
除了PID之外,还使用CRC来识别唯一的分组。这降低了当发生多次连续失败的分组传输尝试时,分组被错误地识别为重传尝试并被PRX丢弃的可能性。此功能非常有用,因为PID只有两位。
FIFOs
在每个节点上,RX和TX都有一个FIFO队列。FIFO由所有管道共享,esb_paiload.pipe表示数据包的管道。对于接收的数据包,此字段指定数据包来自哪个管道。对于传输的数据包,它指定数据包将通过哪个管道发送。
当多个数据包排队时,它们以FIFO方式处理,忽略管道。
PTX FIFO处理
当ESB在PTX模式下启用时,上传到TX FIFO的任何数据包都将在下一次机会传输。
当从PRX成功接收到ACK时,PTX假设payload已成功接收并添加到PRX的RX FIFO。成功传输的数据包j将从PTX的TX FIFO中删除,以便可以传输FIFO中的下一个数据包。
如果PTX接收到的ACK包含了payload,则将该payload添加到PTX的RX FIFO。
PRX FIFO处理
当ESB在PRX模式下启用时,所有启用的管道(地址)都会同时监视传入的数据包。
如果接收到先前未添加到PRX的RX FIFO的新数据包,且RX FIFO具有用于该数据包的可用空间,则就将该数据包添加到RX FIFO,并将ACK发送回PTX。如果PRX的TX FIFO包含任何数据包,则TX FIFO中的下一个可用数据包将作为payload附加到ACK包。注意,在接收到PTX的数据包之前,此可用数据包必须已上载到TX FIFO。
事件处理
当无线电上出现事件时,增强型ShockBurst模块会分析其原因,并在必要时将事件排入应用程序队列。这些事件包括成功操作、失败操作或RX FIFO中有可用的新数据。
在第一次触发软件中断时,事件会以标志的形式进行排队。因此,实际发送到应用程序的每个事件之间可能存在多个无线电中断。单个ESB_EVENT_TX_SUCCESS或ESB_EVENT_TX_FAILED事件分别指示一个或多个成功或失败的操作。ESB_EVENT_RX_RECEIVED事件指示RX FIFO中至少有一个新数据包。事件处理程序应确保在适当时完全清空RX FIFO。
前端模块支架
ESB协议支持外部前端模块。有关详细信息,请参阅使用RF前端模块。
勘误表解决方案和nRF52832芯片修订
nRF52832设备上的模块实现包括一组硬件错误的解决方案。这些错误需要几百字节的代码空间来确定运行时哪些解决方案适用于运行固件的设备。这是为了确保基于较新SDK的固件在较旧和较新版本芯片上都能正常工作。如果您知道您的固件只能在某些设备上运行,则可以通过删除解决方法来节省数百字节的代码空间。如果您确定不需要支持修订版1芯片,则可以删除格式If((NRF_FICR->INFO.VARIANT&0x0000FF00)==0x00004200)中If语句中的所有代码块。如果您确定不需要支持修订版2芯片,则可以删除格式If((NRF_FICR->INFO.VARIANT&0x0000FF00)==0x00004500)中If语句中的所有代码块。