【经验】无线蓝牙SoC EFR32BG22串口接收长数据出错问题的分析与解决

2021-08-30 世强
无线蓝牙SoC,EFR32BG22,Silicon Labs 无线蓝牙SoC,EFR32BG22,Silicon Labs 无线蓝牙SoC,EFR32BG22,Silicon Labs 无线蓝牙SoC,EFR32BG22,Silicon Labs

SILICON LABS无线蓝牙SoC EFR32BG22串口是一个常用的驱动,可以输出调试信息,也可以进行数据传输。EFR32BG22的串口数据传输功能,在平台上可以参考:https://www.sekorm.com/news/54167305.html。本文主要针对EFR32BG22串口接收长数据出错问题进行分析并解决。


通过串口,调用app_log进行信息打印,如果需要对数据进行接收,那么需要启动串口的数据接收功能,在工程的autogen目录下,可以找到相关的发送和接收入口,如下:

                                               


如果采用系统自动生成的串口接收入口,在进行较长的数据包发送的时候,经常会出现问题,实际测试200个字节,情况如下:

在第11个字节的时候就已经丢失数据了,出现这个问题的根本原因是串口在进行数据接收的时候,会被BLE协议栈打断,所以需要添加LDMA功能,来实现串口数据的接收。


步骤如下:

1.关掉工程里面的低功耗管理功能:


2. 如果安装了串口插件,需要屏蔽接收函数入口:


3.初始化UART和LDMA,接收部分开启LDMA通道

  // Receive data buffer

uint8_t buffer[255];

 

// Current position ins buffer

uint32_t inpos = 0;

uint32_t outpos = 0;

 

// True while receiving data (waiting for CR or BUFLEN characters)

bool receive = true;

 

// LDMA channel for receive and transmit servicing

#define RX_LDMA_CHANNEL 0

#define TX_LDMA_CHANNEL 1

 

// LDMA descriptor and transfer configuration structures for USART TX channel

LDMA_Descriptor_t ldmaRXDescriptor;

LDMA_TransferCfg_t ldmaRXConfig;

 

bool rx_done;

/**************************************************************************//**

 * @brief

 *    LDMA initialization

 *****************************************************************************/

void initLdma(void)

{

  // Enable clock (not needed on xG21)

  CMU_ClockEnable(cmuClock_LDMA, true);

 

  // First, initialize the LDMA unit itself

  LDMA_Init_t ldmaInit = LDMA_INIT_DEFAULT;

  LDMA_Init(&ldmaInit);

 

  ldmaRXDescriptor = (LDMA_Descriptor_t)LDMA_DESCRIPTOR_SINGLE_P2M_BYTE(&(USART1->RXDATA), buffer, 210);

  // Transfer a byte on receive data valid

  ldmaRXConfig = (LDMA_TransferCfg_t)LDMA_TRANSFER_CFG_PERIPHERAL(ldmaPeripheralSignal_USART1_RXDATAV);

  LDMA_StartTransfer(RX_LDMA_CHANNEL, &ldmaRXConfig, &ldmaRXDescriptor);

}

 

 

/**************************************************************************//**

 * @brief LDMA IRQHandler

 *****************************************************************************/

void LDMA_IRQHandler()

{

  uint32_t flags = LDMA_IntGet();

 

   /*

   * Clear the receive channel's done flag if set and change receive

   * state to done.

   */

  if (flags & (1 << RX_LDMA_CHANNEL))

  {

    LDMA_IntClear(1 << RX_LDMA_CHANNEL);

    rx_done = true;

    LDMA_StartTransfer(RX_LDMA_CHANNEL, &ldmaRXConfig, &ldmaRXDescriptor);

    sl_bt_external_signal(1); //这里添加蓝牙外部中断时事件

 

  }

  // Stop in case there was an error

  if (flags & LDMA_IF_ERROR)

    __BKPT(0);

}

/**************************************************************************//**

 * @brief

 *    GPIO initialization

 *****************************************************************************/

void initGpio(void)

{

  // Configure PA5 as an output (TX)

  GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 0);

 

  // Configure PA6 as an input (RX)

  GPIO_PinModeSet(gpioPortA, 6, gpioModeInput, 0);

}

 

/**************************************************************************//**

 * @brief

 *    CMU initialization

 *****************************************************************************/

void initCmu(void)

{

  // Enable clock to GPIO and USART1

  CMU_ClockEnable(cmuClock_GPIO, true);

  CMU_ClockEnable(cmuClock_USART1, true);

 

}

 

/**************************************************************************//**

 * @brief

 *    USART1 initialization

 *****************************************************************************/

void initUsart1(void)

{

  // Default asynchronous initializer (115.2 Kbps, 8N1, no flow control)

  USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;

 

  // Route USART1 TX and RX to PA5 and PA6 pins, respectively

  GPIO->USARTROUTE[1].TXROUTE = (gpioPortA << _GPIO_USART_TXROUTE_PORT_SHIFT)

      | (5 << _GPIO_USART_TXROUTE_PIN_SHIFT);

  GPIO->USARTROUTE[1].RXROUTE = (gpioPortA << _GPIO_USART_RXROUTE_PORT_SHIFT)

      | (6 << _GPIO_USART_RXROUTE_PIN_SHIFT);

 

  // Enable RX and TX signals now that they have been routed

  GPIO->USARTROUTE[1].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;

 

  // Configure and enable USART1

  USART_InitAsync(USART1, &init);

 

  NVIC_ClearPendingIRQ(USART1_TX_IRQn);

  NVIC_EnableIRQ(USART1_TX_IRQn);

}


4.       在app.c里面添加蓝牙事件

     case sl_bt_evt_system_external_signal_id:

      if (evt->data.evt_system_external_signal.extsignals == 1)  // 1 = UART RX data finish

      {

       // app_UartTxTest();

        for (i = 0; i < 200; i++) {

           USART_Tx(USART1, buffer[i]);

          }

       // USART_Tx(USART1, inpos);

        memset(buffer,0,sizeof(buffer));

        inpos = 0;

      }

break;

实际测试如下:


这个操作也是蓝牙数据透传的基础,在这个工程上增加

        sl_bt_gatt_server_send_notification(connHandle,gattdb_Notify_chara,

                                         evt->data.evt_gatt_server_attribute_value.value.len,

(const uint8_t * )&evt->data.evt_gatt_server_attribute_value.value.data[0]);


就可以进行数据透传了。

 


授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 1

本文由蜡笔小芯提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。

相关研发服务和供应服务

评论

   |   

提交评论

全部评论(1

  • 飞速成长 Lv7. 资深专家 2021-09-13
    很好,解决了大问题
没有更多评论了

相关推荐

【经验】芯科科技EFR32BG22系列蓝牙SOC修改自定义广播包的思路与具体实例

在蓝牙的实际应用中,往往需要自定义的蓝牙广播包来适应不同的应用环境,本文主要介绍基于SILICON LABS的EFR32BG22蓝牙SOC实现自定义广播数据包的方法。

2023-03-16 -  设计经验 代理服务 技术支持 批量订货

【经验】Silicon Labs蓝牙Soc芯片EFR32BG22的蓝牙广播功率设置及注意事项

用户在使用Silicon Labs的蓝牙Soc芯片EFR32BG22实现蓝牙广播功能时,在不同的应用场景中要设置广播的发射功率,有的是为了降低产品的功耗,有的是为了增加或缩短通信的距离。那要如何设置广播时的功耗以及在设置时有哪些需要注意的事项?

2021-12-24 -  设计经验 代理服务 技术支持 批量订货

【经验】低功耗蓝牙SoC EFR32BG22系列如何从软硬件两方面实现低功耗设计?

EFR32BG22是Silicon Labs公司主打的低功耗蓝牙SoC系列,对于新手工程师来说,如何控制好功耗,以延长电池类产品的寿命,有很多需要关注的地方。本文将从硬件和代码底层两方面分析SoC低功耗实现的关键点。

2021-03-16 -  设计经验 代理服务 技术支持 批量订货
2023/9/30  - SILICON LABS  - 成功案例 代理服务 技术支持 批量订货 查看更多版本

【经验】EFR32BG22系列蓝牙SOC电池电压与VDD供电电压检测ADC的方法

EFR32BG22作为低功耗蓝牙SOC方案,经常应用于电池供电的方案中,一般采用内部的ADC作为采集通道,内部的输入源作为输入接口,来测试VDD供电电压。本文将讲解电池电压与VDD供电电压检测ADC的方法。

2020-11-28 -  设计经验 代理服务 技术支持 批量订货

【经验】无线SOC EFR32BG22带安全功能的OTA怎么实现?

本文介绍实现SECURE OTA DFU的操作步骤,实现蓝牙SoC OTA的安全功能

2023-06-29 -  设计经验 代理服务 技术支持 批量订货

【经验】无线蓝牙SoC EFR32BG22用户自定义数据存取接口NVM使用指导

在使用EFR32BG22开发应用时,大部分应用需要保存一些参数,很多开发者不清楚BG22对数据进行存取的接口是哪个,本文将介绍Silicon Labs无线蓝牙SoC EFR32BG22上对数据进行存取的接口——NVM的使用。

2022-02-23 -  设计经验 代理服务 技术支持 批量订货

【经验】芯科科技EFR32BG22系列蓝牙SOC低功耗优化的相关配置

本文主要介绍Silicon Labs(芯科科技)EFR32BG22系列蓝牙SOC目前所有的低功耗优化的相关配置,实现目标: VDD=3V,VSCALE0=0.9V,温度25℃,EM2模式下深度休眠为1.4μA。

2021-09-27 -  设计经验 代理服务 技术支持 批量订货

【经验】如何解决Silicon Labs EFR32B22在开启一次ADC转换后,功耗变高的问题?

在使用芯科科技EFR32BG22蓝牙SoC开发低功耗应用时,可能会使用到ADC这个外设,但在ADC转换后,会出现芯片在休眠时功耗比较高的情况。本文将介绍如何解决EFR32B22在开启一次ADC转换后,功耗变高的问题?

2023-06-28 -  设计经验 代理服务 技术支持 批量订货

【经验】支持3线PTA的Bluetooth SDK,解决蓝牙与WIFI共存难题

在设计蓝牙产品时不可避免的要与WIFI一同使用,由于蓝牙与WIFI都是2.4GHz的频段,如何解决同频干扰是我们不得不面对的一个难题。Silicon Labs提供的Bluetooth SDK从V2.6.0版本开始引入了3线的PTA,可以解决蓝牙与WIFI共存的难题。Bluetooth SDK适用于Silicon Labs EFR32BG与EFR32MG系列的无线蓝牙SOC产品。

2018-06-12 -  设计经验 代理服务 技术支持 批量订货

【经验】Silicon Labs低功耗蓝牙SoC EFR32BG22如何通过GPIO唤醒UART通信

SiliconLabs的低功耗蓝牙SoC EFR32BG22系列芯片以极低的功耗和相对低廉的价格,达到了性价比的极致。目前大家开发EFR32BG22,大部分都会使其工作在休眠状态,一般会先用一个GPIO唤醒EFR32BG22,通过一定的条件使EFR32BG22停止休眠,再去串口通信,通信完成后,再进入休眠这样的流程。本文介绍下如何使用Silicon Labs的Bluetooth SDK实现该功能。

2020-07-03 -  设计经验 代理服务 技术支持 批量订货

【应用】芯科蓝牙SOC EFR32BG22保证电动汽车充电桩数据可靠性,接收灵敏度可达-106.7 dB

在实际应用中,芯科EFR32BG22芯片的典型应用是在充电桩中建立蓝牙连接,实现与用户移动设备之间的通信和数据传输。通过蓝牙连接,充电桩可以向用户的移动设备发送充电桩的状态信息(如电量、使用情况),并接受用户的控制命令,如启动、停止、调整充电功率等。

2023-06-10 -  应用方案 代理服务 技术支持 批量订货

【经验】如何使用Bluetooth NCP Commander和频谱仪测试EFR32BG22频偏和发射功率

使用Bluetooth NCP Commander 和频谱仪测试蓝牙SOC EFR32BG22的频偏和发射功率,首先需要在自己的开发板上烧录Bluetooth - NCP固件,然后才能通过PC端控制开发板。

2023-03-25 -  设计经验 代理服务 技术支持 批量订货

【经验】无线SoC EFR32BG22 EM4模式的进入与唤醒实现注意事项

Silicon Labs的无线SoC EFR32BG22的EM4模式支持nA级别的待机电流,对于功耗要求极为苛刻的应用非常合适,在这个模式下,只支持特定的GPIO以及reset唤醒。本文主要讲解EM4模式的进入与唤醒实现注意事项。

2021-06-02 -  设计经验 代理服务 技术支持 批量订货

【应用】芯科小体积蓝牙SOC芯片EFR32BG22满足CGM便携式需求,唤醒模式下功耗只有0.17μA

芯科EFR32BG22芯片可以实现极低的功耗,休眠模式下平均功耗1.40 μA,唤醒模式下功耗只有0.17 μA ,适合CGM等要求长时间使用的设备。通过对芯片进行灵活的功耗管理和优化,可以尽量延长设备的使用寿命,从而提高糖尿病患者的使用体验。

2023-06-06 -  应用方案 代理服务 技术支持 批量订货
展开更多

电子商城

查看更多

品牌:SILICON LABS

品类:Wireless Gecko SoC

价格:¥8.1764

现货: 102,628

品牌:SILICON LABS

品类:Mighty Gecko Multi-Protocol Wireless SoC

价格:¥27.0929

现货: 90,767

品牌:SILICON LABS

品类:Wireless SoC

价格:¥31.7756

现货: 88,140

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.5305

现货: 85,765

品牌:SILICON LABS

品类:Wireless SoC

价格:¥19.9760

现货: 84,418

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.9026

现货: 83,555

品牌:SILICON LABS

品类:Wireless SoC

价格:¥35.3989

现货: 76,852

品牌:SILICON LABS

品类:8位MCU

价格:¥5.8534

现货: 71,919

品牌:SILICON LABS

品类:Mixed-Signal MCU

价格:¥12.9143

现货: 61,558

品牌:SILICON LABS

品类:Transceiver

价格:¥15.8878

现货: 53,758

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:SILICON LABS

品类:Switch Hall Effect Magnetic Position Sensor

价格:¥2.2924

现货:126,000

品牌:SILICON LABS

品类:Light Sensor

价格:¥20.3400

现货:28,003

品牌:SILICON LABS

品类:8位MCU

价格:¥4.9000

现货:12,000

品牌:SILICON LABS

品类:Mixed-Signal MCU

价格:¥10.1700

现货:10,000

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥3.7900

现货:3,451

品牌:SILICON LABS

品类:Wireless SoC

价格:¥15.1400

现货:1,455

品牌:SILICON LABS

品类:Mixed-Signal MCU

价格:¥11.1200

现货:1,201

品牌:SILICON LABS

品类:8 BIT MCU

价格:¥16.8500

现货:550

品牌:SILICON LABS

品类:8位MCU

价格:¥56.0000

现货:550

品牌:SILICON LABS

品类:8位MCU

价格:¥5.1900

现货:396

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

内置FPC天线定制

可定制内置FPC天线的频率尺寸等参数,频率范围315MHz、433MHz、470MHz、868MHz、915MHz,2.4GHz、5.8GHz、2G(GSM)、3G、4G、5G、WIFI、蓝牙、LoRa、NB-IoT多频段可选。

最小起订量: 1000 提交需求>

内置弹簧天线定制

可定制弹簧天线频率范围:470MHz、315MHz、433MHz、868MHz、915MHz、490MHz、2.4GHz、GPRS、3G、蓝牙;增益:0~5dBi;电压驻波比V.S.W.R:≤2;天线尺寸不限。

最小起订量: 1000 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面