一、前言
官網資料介紹建議採用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註冊了兩個回調,
是不是很尷尬,註釋掉以後再測試,問題解決
四、串口調試