Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据

时间:2024-05-18 21:53:00

一、前言

  官网资料介绍建议采用DMA传输,串口数据的接收是放到了fifo中,但是串口发送也是采用的DMA,问题在于串口发送并没有建立缓冲器,而是判断当前DMA是否忙,如果忙数据直接丢弃,这样做显然不合理。如果发送时DMA忙应该将数据放到缓冲器中,等DMA不忙时再进行发送。

                 Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据

二、代码修改

(1)启用串口 app_config_8258.h中 (app_config_8258.h一定要对应相应的工程不要调试mesh的工程而修改了spirit lpn的工程中的app_config_8258.h),

#if WIN32

#define HCI_ACCESS HCI_USE_USB

#else

#define HCI_ACCESS HCI_USE_NONE

#endif

 

#if (HCI_ACCESS==HCI_USE_UART)

#define UART_TX_PIN UART_TX_PB1

#define UART_RX_PIN UART_RX_PB0

#endif

修改为

#if WIN32

#define HCI_ACCESS HCI_USE_USB

#else

#define HCI_ACCESS HCI_USE_UART

#endif

 

#if (HCI_ACCESS==HCI_USE_UART)

#define UART_TX_PIN UART_TX_PB1

#define UART_RX_PIN UART_RX_PB0

#endif

 

启用串口时要注意,因为PWM占用了PB0和PB1可能或存在冲突问题因此要修改一下

app_config_8258.h中

//--------------- LED / PWM

#if(PCBA_8258_SEL == PCBA_8258_DONGLE_48PIN)

#define PWM_R GPIO_PWM1A3 //red

#define PWM_G GPIO_PWM0A2 //green

#define PWM_B GPIO_PWM3B0 //blue

#define PWM_W GPIO_PWM4B1 //white

修改为:

#define PWM_R GPIO_PWM1A3 //red

#define PWM_G GPIO_PWM0A2 //green

#define PWM_B GPIO_PWM1A3 //blue

#define PWM_W GPIO_PWM0A2 //white

修改完成后编译下载,调试,调试请参考SWS调试方式

Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据

 

 

接收中断次数增加,说明数据接收到

三、发送缓冲器代码实现

开始写软fifo,软件fifo参考之前fifo章节嵌入式开发|高效缓冲器设计(C语言)

首先修改下firmware\drivers\8258\uart.c中的函数

unsigned char uart_Send(unsigned char* data, unsigned int len)函数

修改为

Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据

建立fifo后在进行调试时发现竟然有数据丢失,尴尬不,开始找问题,中断明明接收到但是hci_rx_fifo中的数据缺没有,不靠谱呀。数据被别的地方处理了。

mesh_common.c程序中的int blc_hci_tx_to_uart (),就是他干的,我们看看在哪里调用的,在void user_init()中有个

blc_register_hci_handler (blc_rx_from_uart, blc_hci_tx_to_uart); //default handler注册了两个回调,

Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据

是不是很尴尬,注释掉以后再测试,问题解决

 

四、串口调试

Telink BLE MESH开发|ble mesh开发教程《三》telink_sig_mesh串口收发数据