abcd
abcd - 认证专家
我只是个路过的老年人~

注册于 2年前

回答
118
文章
10
关注者
2

没有产生广播事件指的是用手机收不到设备这个广播吗?手机端用蓝牙助手类的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的状态,然后根据旋转编码器的时序来判断旋转方向。

联网成功后,调用gethostbyname接口来获取域名对应的IP地址。

SDK的doc目录下有w800_apis.chm文件,里面有各个模块的接口。具体使用demo目录下都有相关的demo参考。

发布
问题