使用的是W800嗎,芯片的具體絲印是什麼。感覺跟發射功率沒關系,發射功率都是一樣的設置,要不行都不行。發射功率的接口是tls_ble_set_tx_power,參數power_type寫11就行,默認index是2,對應4dB。我覺得可以用不行的芯片刷個標準固件執行下AT+WSCAN掃描指令,看下返回結果裡路由器的信號強度是什麼樣的,比如離得近的路由器的信號強度能到多少。
使用的是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拉高拉低,用示波器或者邏輯分析儀來測量延時時間長短。
tls_os_time_delay(1 * HZ);
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的狀態,然後根據旋轉編碼器的時序來判斷旋轉方向。
聯網成功後,調用gethostbyname接口來獲取域名對應的IP地址。
SDK的doc目錄下有w800_apis.chm文件,裡面有各個模塊的接口。具體使用demo目錄下都有相關的demo參考。
DNS server是W801做softap模式時用到的,而且只是把dnsname和自己的IP地址對應,對於應用層來說,一般不會用到這裡的接口。
問 W800藍牙發射功率是否可以設置