Telink BLE MESH開發|ble mesh開發教程《三》telink_sig_mesh串口收發數據

一、前言

  官網資料介紹建議採用DMA傳輸,串口數據的接收是放到了fifo中,但是串口發送也是採用的DMA,問題在於串口發送並沒有建立緩衝器,而是判斷當前DMA是否忙,如果忙數據直接丟棄,這樣做顯然不合理。如果發送時DMA忙應該將數據放到緩衝器中,等DMA不忙時再進行發送。

                 

二、代碼修改

(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調試方式

 

 

接收中斷次數增加,說明數據接收到

三、發送緩衝器代碼實現

開始寫軟fifo,軟件fifo參考之前fifo章節嵌入式開發|高效緩衝器設計(C語言)

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

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

修改爲

建立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註冊了兩個回調,

是不是很尷尬,註釋掉以後再測試,問題解決

 

四、串口調試

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章