abcd
abcd
我只是個路過的老年人~

注冊於 2年前

回答
45
文章
6
關注者
1

看下wm_ble_server_api_demo.c,裡面實現了server的例子,在這個結構體裡面定義了UUID以及屬性以及對應的回調函數,可以根據自己的應用情況加減屬性以及修改UUID,如果是讀寫屬性的,收到相關事件後會直接調用gatt_svr_chr_demo_access_func這個回調函數,在裡面實現自己的操作,如果是notify,直接用tls_ble_server_demo_api_send_msg接口發送數據就可以了。image.png

image.png

image.png

1.There is currently no W861 development board available.
2.The reason for NAK prompt is that in most cases, due to unstable serial port connections, some USB to serial port boards do not support high baud rates. If this error persists, you can try reducing the download baud rate.
3.The W806 chip does not have Wi-Fi function.
4.Unable to read firmware file from device.

沒有產生廣播事件指的是用手機收不到設備這個廣播嗎?手機端用藍牙助手類的APP是可以看到這個設備廣播的信息的,名字應該是WM-XXXX之類的。

使用的是W800嗎,芯片的具體絲印是什麼。感覺跟發射功率沒關系,發射功率都是一樣的設置,要不行都不行。發射功率的接口是tls_ble_set_tx_power,參數power_type寫11就行,默認index是2,對應4dB。我覺得可以用不行的芯片刷個標準固件執行下AT+WSCAN掃描指令,看下返回結果裡路由器的信號強度是什麼樣的,比如離得近的路由器的信號強度能到多少。

訂閱主題,demo裡有啊,在mqtt_demo_init裡連接mqtt成功後,調用mqtt_subscribe接口來訂閱自己的主題,這樣雲端有這個主題的消息時,會主動下發給訂閱該主題的設備。設備收到雲端發來的消息時,在循環裡mqtt_demo_loop就會能解析到這個消息,MQTTParseMessageType、mqtt_parse_pub_topic、mqtt_parse_publish_msg,然後做自己的處理就行了,demo裡就是收到消息後打印了出來,並回傳了一條消息。

粗略看了你的代碼下,有如下幾個問題:1、OutDQ0和OutDQ1定義錯誤,輸出高低電平並不是通過設置上下拉來實現的,tls_gpio_cfg設置為輸出後,還需要調用tls_gpio_write來設置輸出高、低電平,另外我記得電路外部是需要加上拉電阻的,所以這裡應該配置為上拉輸出;2、如果沒有外部電阻的情況下,IpuDQ配置為上拉,組好還是有外部上拉電阻,畢竟內部是個弱上拉;3、延時混亂,tls_os_time_delay()接口實現的延時單位是系統的1個tick,如果configTICK_RATE_HZ設置的是1000,那就是最小延時時間只能到1ms,想要實現us級別的延時,就需要用自習用for循環 + __NOP();來實際測量實現了,或者用樓上的方式試下行不行。
至於具體時序網上參考程序很多,主要是IO的操作和延時弄對了就不會有大問題,如果IO操作不清楚的,可以參考wm_gpio_demo.c程序。開一個帖子就行了。

The w80x chip did not consider the CAN interface in its design.

如果是w800做SPI主機,就參考demo目錄下wm_master_spi_demo.c。

tick最小改到1000,不能再小了。關於延時,如果延時時間大於tick值,可以用tls_os_time_delay(N * tick)來實現,如果想延時更小的時間,可以自己寫個for循環調用__NOP();接口來延時,具體循環多少次可以用個IOpin拉高拉低,用示波器或者邏輯分析儀來測量延時時間長短。

w800做softap時不會去連接路由器,它的作用並不是網絡覆蓋範圍變大,而是某些情況下需要起一個熱點創造一個局域網環境來通信。

g_crypto_ctx.gpsec_lock定義的是一個互斥鎖,在SDK的初始化時有調用tls_crypto_init,在這裡創建了該信號量,初始值是1,所以在沒有其他地方用到該模塊時,調用tls_os_sem_acquire(g_crypto_ctx.gpsec_lock, 0);會立即返回接著往下執行。如果有其他地方調用了就會等待,直到能獲取到信號量才能接著往下執行,起到一個互斥鎖的功能。調用tls_os_sem_acquire獲取,信號量的個數會減一,調用tls_os_sem_release釋放,信號量的個數會加一,這兩個接口是成對使用的。在使用信號量實現互斥鎖的功能時,創建信號量時初始值會設置為1,這樣有一個地方獲取了鎖的使用權後,其他地方就需要等待這裡釋放了才能獲取,起到防止出現同一個模塊或者變量或者接口被同時操作的情況。並不是一個物理信號。

可以看下技術文檔下面的《WM_W800_SDK_DEMO使用指導_V1.5.pdf》,需要先打開聯網和mqtt的demo宏,編譯固件,然後需要先發送聯網的命令,聯網成功後再發送mqtt的命令。但是demo中的服務器是不可用的,需要換成自己的服務器地址、端口號、client id等相關的參數。或者用mqtt.isme.fun:1883試下。https://www.winnermicro.com/html/1/156/158/558.html

為什麼用w800給自己的串口發送AT指令的?AT指令是上位機通過串口控制W800工作的,如果是用代碼,那就是在W800上做二次開發,直接調用相關的接口來實現功能就可以了,不需要用到AT指令。如果用自己的APP藍牙配網,可以參考官網的APP代碼把藍牙配網的功能加到自己的APP中,這樣就不需要改動W800的代碼了。也可以開發自己的配網協議,只是需要在W800端配套實現對應的協議。

旋轉編碼器就是2~3個普通的IO口,用W800的GPIO設置為輸入模式連接就可以。剩下的就是讀GPIO的狀態,然後根據旋轉編碼器的時序來判斷旋轉方向。

發布
問題