lugl4313820 发表于 2022-3-2 15:04

【沁恒RISC-V内核 CH582】BLE 点灯

<p>前面有@<a href="https://home.eeworld.com.cn/space-uid-769832.html" target="_blank">yangjiaxu</a>发布的天猫精录点灯的评测报告。也准备入手蓝牙功能,把学习过程记录如下:</p>

<p>1、网上找了视频,看了泌恒的蓝牙开发的基础,他讲到了TMOS这个任务管理系统,看得似懂非懂,最后也就明白,蓝牙的实现是基于这个管理系统来运行的。B站的视频,看了几遍,了解了一个大概,网址为:<a href="https://www.bilibili.com/video/BV1uo4y1D7Qi">RISC-V系列课程(五)&mdash;&mdash;基于CH573的低功耗蓝牙初探_哔哩哔哩_bilibili</a>。</p>

<p>2、下载了《沁恒低功耗蓝牙软件开发手册》,这个手册在例程的BLE下面有。</p>

<p>3、查看例程的说明,说明在CH583/EVT的目录下的《CH583_List.txt》,详细的注明了BLE目录下的例程。</p>

<pre>
<code>-- BLE
|      |      |      |      |-- Broadcaster:广播者角色例程,处于广播态一直广播
|      |      |      |      |-- CyclingSensor:骑行传感器例程,连接主机后定时上传速度和踏频
|      |      |      |      |-- CentPeri:主从一体例程,整合了主机例程和从机例程的功能同时运行
|      |      |      |      |-- Central:主机例程,主动扫描周围设备,连接至给定的从机设备地址,寻找自定义服务及特征,执行读写命令,需与从机例程配合使用,并将从机设备地址修改为该例程目标地址,默认为(84:C2:E4:03:02:02)
|      |      |      |      |-- HeartRate:心率计例程,连接主机后定时上传心率
|      |      |      |      |-- Peripheral:外设从机角色例程,自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读
|      |      |      |      |-- RunningSensor:跑步传感器例程,连接主机后定时上传速度
|      |      |      |      |-- HID_Keyboard:蓝牙键盘例程,模拟键盘设备,连接主机后定时上传键值
|      |      |      |      |-- HID_Mouse:蓝牙鼠标例程,模拟鼠标设备,连接主机后定时上传键值
|      |      |      |      |-- HID_Consumer:蓝牙拍照器例程,模拟用户控制设备,连接主机后定时上传音量键下键
|      |      |      |      |-- HID_Touch:蓝牙触摸例程,模拟触摸笔设备,连接主机后定时上传触摸值
|      |      |      |      |-- MultiCentral:主机多连接例程,主动扫描周围设备,连接至给定的三个从机设备地址,寻找自定义服务及特征,执行读写命令,需与从机例程配合使用,并将从机设备地址修改为该例程目标地址,三个从机设备地址默认为 (84:C2:E4:03:02:02)、(84:C2:E4:03:02:03)、(84:C2:E4:03:02:04)
|      |      |      |      |-- Observer:观察者角色例程,定时扫描,如果扫描结果不为空,则打印扫描到的广播地址
|      |      |      |      |-- DirectTest:直接测试例程,测试指定通信频道发送数据包
|      |      |      |      |-- RF_PHY:非标准无线收发例程
|      |      |      |      |-- RF_PHY_Hop:非标准无线跳频收发例程
|      |      |      |      |-- MESH
|      |      |      |      |      |-- adv_ali_light:天猫精灵灯例程,可通过天猫精灵找队友配网设备,控制开关状态。默认只有开关属性,如需添加其余属性(亮度,电量,温度等),需要自行根据阿里云产品配置的属性描述添加对应处理函数以及状态上报函数。
|      |      |      |      |      |-- adv_ali_light_add_lightness:MESH通用属性添加例程。天猫精灵灯例程的基础上,添加了亮度属性,用于对照原天猫精灵灯例程,快速熟悉添加其他MESH通用属性的方法。
|      |      |      |      |      |-- adv_ali_light_add_windspeed:天猫定义属性添加例程。天猫精灵灯例程的基础上,添加了风速属性,用于对照原天猫精灵灯例程,快速熟悉添加其他天猫定义属性的方法。
|      |      |      |      |      |-- adv_ali_light_multi_element:多元素天猫精灵风扇灯例程。同时包含风扇开关摇头和灯开关颜色控制。用于对照原天猫精灵灯例程,快速熟悉添加多个属性的方法。
|      |      |      |      |      |-- adv_ali_light_with_peripheral:天猫精灵灯例程的基础上,支持手机BLE调试助手连接控制。
|      |      |      |      |      |-- adv_proxy:代理节点例程,可通过PB_GATT层(BLE连接)进行配网。
|      |      |      |      |      |-- adv_vendor:厂商自定义模型例程,配合self_provisioner_vendor使用,支持有应答传输和无应答透传两种通信属性,自行拟定通信协议。
|      |      |      |      |      |-- adv_vendor_friend:厂商自定义模型例程的基础上,支持朋友节点功能
|      |      |      |      |      |-- adv_vendor_low_power:厂商自定义模型例程的基础上,支持低功耗节点功能,需与朋友节点配合使用
|      |      |      |      |      |-- adv_vendor_self_provision:厂商自定义模型例程的基础上,支持本地自配网,适配无配网者或简化配网流程等特殊应用场景
|      |      |      |      |      |-- self_provisioner_vendor:厂商自定义模型自配网发起者例程,配合adv_vendor使用,自动配网周围未配网设备,并将其加入自身mesh网络,默认支持配网6个设备。默认配置设备绑定1个APPKEY,用于有应答传输和无应答透传,配置设备绑定1个订阅地址,用于群发无应答消息
|      |      |      |      |      |-- self_provisioner_vendor_with_peripheral:厂商自定义模型自配网发起者例程的基础上,支持手机BLE调试助手连接控制,中转手机与mesh网络的通信,可自行拟定通信协议实现手机控制mesh网络中所有设备。
|      |      |      |      |      |-- MESH_LIB:MESH协议栈库文件及其头文件
|      |      |      |      |-- BackupUpgrade_IAP:备份无线升级IAP例程,检测当前代码标志,判断是否搬运备份区代码到用户区并运行用户区代码
|      |      |      |      |-- BackupUpgrade_JumpIAP:备份无线升级跳转IAP例程,放在代码起始地址,负责跳转到IAP程序
|      |      |      |      |-- BackupUpgrade_OTA:备份无线升级用户例程,外设从机例程基础上添加OTA功能,可将升级固件保存到备份区后跳转IAP程序进行升级
|      |      |      |      |-- OnlyUpdateApp_IAP:固定库无线升级IAP例程,具备OTA功能,接收升级固件后对用户区代码进行升级
|      |      |      |      |-- OnlyUpdateApp_JumpIAP:固定库无线升级跳转IAP例程,放在代码起始地址,负责跳转到IAP程序
|      |      |      |      |-- OnlyUpdateApp_Peripheral:固定库无线升级用户例程,外设从机例程基础上添加跳转IAP程序进行后续升级的功能
|      |      |      |      |-- BLE_UART:蓝牙串口透传例程,详细说明参考根目录&lt;说明.txt&gt;文档
|      |      |      |      |-- SYNC_ADV:周期同步广播例程
|      |      |      |      |-- SYNC_SCAN:周期同步扫描例程
|      |      |      |      |-- HAL:例程共用的硬件相关文件
|      |      |      |      |-- LIB:BLE协议栈库文件及其头文件
|      |      |      |      |-- 沁恒低功耗蓝牙软件开发参考手册.pdf
|      |      |      |      |-- BLE认证证书:产品:WCH CH58xQDID:xxxxxx</code></pre>

<p>4、打开各个例程从头看到尾,起先总也看不明白什么。结合软件开发参考手册,反复弄了三天,也下载了例程到开发板上,查看串口的输出信息,找到打印的地方,逐一个的查看各个函数的功能。以前CH58x的其他例程,基本上都有中文注释,但是蓝牙的程序的注释大部分是英文的,只有翻译过来逐一的分析。</p>

<p>5、手机下载了BLE调试助手,我用的是荣耀的手机,只接从应用市场可以下载得到。</p>

<p>6、开发板下载adv_ali_light_with_peripheral:天猫精灵灯例程的基础上,支持手机BLE调试助手连接控制。下载例程后,打开BLE调试助手:</p>

<p>这里看到有一个Simple Peripheral的蓝牙设备,点击CONNECT,进入下面的界面:</p>

<p>然后一顿乱点,也没整明白什么,N次以后才明白点什么:</p>

<p>&nbsp;点这个下载似的按键,成功看到device name:</p>

<p></p>

<p>然后进代码区去看了,找到定义Simple Peripheral的地方:</p>

<p>&nbsp;在peripheral.c中找到这两个地方有这个定义: &nbsp;</p>

<p>到这里终于明白有点什么东东了:</p>

<p>&nbsp;7、查看开发板的DEBUG输出信息:</p>

<p>&nbsp;这里应该好象是信号的意思:</p>

<p>按RST出现了:</p>

<p>&nbsp;用蓝牙助手连接后出现:</p>

<p></p>

<p>&nbsp;然后就又没有什么头绪了,按开发板上的按键也没有反应,前前后后翻看程序,里面找到:</p>

<pre>
<code>/*********************************************************************
* @fn      send_led_state
*
* <a href="home.php?mod=space&amp;uid=159083" target="_blank">@brief</a> 发送当前灯的状态给天猫精灵
*
* @param   none
*
* <a href="home.php?mod=space&amp;uid=784970" target="_blank">@return</a> none
*/
void send_led_state(void)
{
    APP_DBG(&quot;&quot;);
    struct indicate_param param = {
      .trans_cnt = 0x09,
      .period = K_MSEC(300),
      .send_ttl = BLE_MESH_TTL_DEFAULT,
      .tid = als_avail_tid_get(),
    };

    toggle_led_state(MSG_PIN);

    if(!bt_mesh_is_provisioned())
    {
      APP_DBG(&quot;Local Dev Unprovisioned&quot;);
      return;
    }

    send_led_indicate(&amp;param);
}
</code></pre>

<p>这个应该是按键的驱动,找到MSG_PIN的定义:</p>

<p>结果看到是定义为GPIO_Pin_12,我试着把他改为原先做点灯程序的GPIO_Pin_19,然后跳好线,重新编译后下载到开发板上,按下S3键,LED-&gt;D4就一亮一灭了。。。。然后点了一支烟。。。</p>

<p>8、然后一顿猛按按键,结果惊喜无处不在:</p>

<p></p>

<p>串口打印出跟以前的不同:</p>

<p>按照打印的提示,在程序里查找打印 &ldquo;Local Dev Unprovisioned&rdquo;这个关键字:找到也还是没什么结果。然后就没有然后,休息。。。。。。。。。。。。。</p>

<p>经过两天的拆腾,修改H:\CH583EVT\EVT\EXAM\BLE\Peripheral&nbsp; 下面的例程,把工程调通了:</p>

<p>主要修改的地方:</p>

<p></p>

<p>手机APP的制作是学习了这个贴子:&nbsp;&nbsp;</p>

<p><a href="https://bbs.21ic.com/icview-3173112-1-1.html">开发BLE蓝牙手机上位机软件竟是如此的简单 </a></p>

<p>主要的思路是:</p>

<p>1、找到跟指定的设备名称:LuglBLE,就停止搜索了:</p>

<pre>
<code>事件 BLE蓝牙1.发现设备(名称 为 文本型,地址 为 文本型,MajorID 为 整数型,MinorID 为 整数型,配对状态 为 整数型)
        如果 名称 = "LuglBLE" 则
          弹出提示("发现设备")
          列表框1.添加项目("名称:" &amp; 名称 &amp; "\n地址:" &amp; 地址)
          列表框1.置项目标记(列表框1.取项目数()-1,地址)
        结束 如果
结束 事件</code></pre>

<p>2、然后进行连接,找到指定的服务UIDD后就记录下来:</p>

<pre>
<code>事件 BLE蓝牙1.发现服务(服务信息 为 集合)
        如果 服务信息.取项目总数() &lt; 0 则
                退出
        结束 如果

        变量 计次 为 整数型
        变量 信息数组 为 文本型()
        变量 分组索引 为 整数型
        变量 计次2 为 整数型
        变量 通道属性 为 文本型
        弹出提示("发现服务")
        计次 = 0
        判断循环首 计次 &lt; 服务信息.取项目总数()               
                信息数组 = 服务信息.取项目(计次)
                如果 信息数组(0) = "0000ffe0-0000-1000-8000-00805f9b34fb" 则
                        服务UUID = 信息数组(0)
                        通道UUID = 信息数组(1)
                        计次 = 服务信息.取项目总数()
                        按钮1.标题 = "开始搜索"
                时钟1.时钟周期 = 0
                结束 如果
                计次 = 计次 + 1
        判断循环尾
结束 事件</code></pre>

<p>3、创建按钮发送:</p>

<pre>
<code>事件 按钮2.被单击()
        如果 按钮2.标题 = "开灯" 则       
          BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("1","GBK"))
                按钮2.标题 = "关灯"
        否则
             BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("0","GBK"))
                按钮2.标题 = "开灯"
        结束 如果
结束 事件</code></pre>

<p>后面将完善程序,把LED修改为继电器,用来控制取暖器的开关。</p>

<p>经过这段时间的学习,感觉沁恒在蓝牙方面的贴子非常少,学习起来很是吃力。</p>

<p>工程附后:</p>

<p><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&amp;lessonid=32762" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>

你好22 发表于 2022-5-17 15:52

大佬你好,请问CH582m如果我用它作为主机,那扫描出来的设备该如何获取他们的广播包呢,我用的是主从一体的历程,找了好久都没有找到这个接口函数在哪、

lugl4313820 发表于 2022-5-17 16:13

你好22 发表于 2022-5-17 15:52
大佬你好,请问CH582m如果我用它作为主机,那扫描出来的设备该如何获取他们的广播包呢,我用的是主从一体的 ...

<p>我回去翻翻再回答你。好久没用了,忘得差不多了。</p>

sans5555 发表于 2022-5-18 20:16

<p>大佬你好,我最近用的沁恒的蓝牙CH9141,他的官网一个例程也没有,这个蓝牙例程可以通用吗,</p>

lugl4313820 发表于 2022-5-19 09:53

sans5555 发表于 2022-5-18 20:16
大佬你好,我最近用的沁恒的蓝牙CH9141,他的官网一个例程也没有,这个蓝牙例程可以通用吗,

<p>你找一下相同的芯片的例程,只要核心一样,应该差不多,如果您需要例程,可以去他们的论坛发帖子,或者给官方发邮件,沁恒的服务做得不错的。</p>
页: [1]
查看完整版本: 【沁恒RISC-V内核 CH582】BLE 点灯