CH592 蓝牙透传模块

news/2024/10/1 17:22:49

设备架构

img

串口透传协议说明

模块通过串口和用户MCU相连,建立用户MCU 和 BLE 设备之间的双向通讯。
用户可以通过串口,使用指定的AT指令对串口波特率、BLE连接间隔,以及不同的发包间隔,模块将会有不同的数据吞吐能力。
串口默认配置为 115200bps。
模块的串口Rx一次最大可输入3K字节。
模块会根据蓝牙协议协商情况进行分包或者发送完整包。
BLE设备之间的通信,必须在对应的服务通道进行。当模块收到主机或从机发来的无线包后,会先从INT口输出低电平信号再从模块串口Tx端输出数据。
以“TTM:”开头且以“\r\n\0”结尾的字符串会被当成AT指令进行解析并执行,并返回执行结果(“TTM:OK\r\n\0”或者 “TTM:REP\r\n\0”等).不符合AT 指令规则的串口数据包,将被视为透传数据。

透传数据通道

透传数据通道【服务 UUID: 0xFFF0】

特征值UUID 可执行操作 字节数: 备注
FFF1 Notify 跟随MTU长度 从模块串口Rx输入的数据将会在此通道产生通知发给主机
FFF2 Write 跟随MTU长度 写入的数据将会从串口的 Tx输出。

BLE 数据转串口输出,主机端通过 “FFF2” 通道写操作后,数据将会从串口Tx 输出。串口输入转BLE数据输出,如果打开了“FFF1”通道的通知使能开关,串口Rx收到透传的数据
将会通过notify事件发送到

如何验证串口透传协议成功

  1. 蓝牙模块默认为从机模式
  2. 等待设备启动完成,使用AT指令 TTM:ADV-START 启动从机的广播功能。
  3. 在手机上连接蓝牙模块。
  4. 通过串口 发送 透传数据, 手机上面的 0xFFF1 通道能接收到 串口透传的数据
  5. 通过手机上 0xFFF2 通道 write 消息,在串口上能够打印出来。
  6. 使用 TTM:ADV-OFF 关闭广播功能, 手机上将不会扫描到 该蓝牙的信息。

ble_uart 说明文档

CH592 简单的串口透传:
特性:
1, 使用两个128bit uuid,
2, 两个uuid 分别是write without respone,和 notify 方式,分别对应串口收和发,可以在工程文件ble_uart_service/ble_uart_service.c中修改
3, 可以兼容 N* 家的 ble uart 的工程,
4, 支持MTU在20-247 中任意设置,自适适应当前的mtu
5, 默认在CH592上调试,串口使用的UART3,TXD3@PA5,RXD3@PA4,其他的串口需要修改代码
透传UART3口
img
6, ble 名称为"chCH592le_uart" 已经修改成 qf_ble_uart
7, 默认开启串口notify 成功回写,不需要需要可以去掉代码,在ble service 的回掉函数,BLE_UART_EVT_BLE_DATA_RECIEVED 事件中 屏蔽即可
8, 默认开启串口调试,使用串口1,PA9_TXD 115200.
DEBUG打印UART1口
img

一些参数修改:

见工程的config.h文件

1 修改mtu 长度,最大为251此时对应mtu是247,但是实际mtu是多少,要看central端连接时候协商的值
2 修改每个连接 最多传输多少个包数量
3,全局宏定义建议在mounriver stdio工程的properties>C/C++ General> Path and Symbols 的Symbols 标签下设置

代码分析

问题

extern const unit_8 VER_LIB[];应该在库里面

TMOS 常见的接口

bool tmos_memcmp(const void *src1, const void *src2, unit32_t len);
void tmos_memset( void * pDst, uint8_t Value, uint32_t len )
注册事件回调函数
tmosTasklD TMOS_ProcessEventRegister( pTaskEventHandIerFn eventCb )

厂商提供的BLE库(参考)

常见的数据结构

typedef struct tag_ble_clock_config {...} bleClockConfig_t; /*ble clock control config struct */
typedef struct tag_ble_pa_control_config {...} blePaControlConfig_t;
typedef struct {...} tmos_event_hdr_t;
#define VER_FILE  "CH59x_BLE_LIB_V1.2" // 版本号
struct tag_ble_config { uint32_t MEMAddr;               // library memory start address  BLE蓝牙库的开始地址// MEM_BUF[BLE_MEMHEAP_SIZE / 4] // -- MEM_BUF[1536]uint16_t MEMLen;                // library memory size    库的内存大小// -- 1024 * 6uint32_t SNVAddr;               // SNV flash start address( if NULL,bonding information will not be saved )                         ? SNV flash 开始地址uint16_t SNVBlock;              // SNV flash block size ( default 256 )  ??uint8_t SNVNum;                 // SNV flash block number ( default 1 )  ??uint8_t BufNumber;              // Maximum number of sent and received packages cached by the controller( default 5 )         controller 缓存的 最大的发送和接收包的数量 默认为 5//  -- 5// Must be greater than the number of connections.uint16_t BufMaxLen;             // Maximum length (in octets) of the data portion of each HCI data packet( default 27 )            8进制格式的 HCI data 的 数据部分的 最大长度  默认 27//  -- 27 // SC enable,must be greater than 69  SC使能时,必须大于69// ATT_MTU = BufMaxLen-4,Range[23,ATT_MAX_MTU_SIZE]// ATT_MTU = uint8_t TxNumEvent;             // Maximum number of TX data in a connection event ( default 1 ) -- 1uint8_t RxNumEvent;             // Maximum number of RX data in a connection event ( default equal to BufNumber )uint8_t TxPower;                // Transmit power level( default LL_TX_POWEER_0_DBM(0dBm) )uint8_t ConnectNumber;          // Connect number,lower two bits are peripheral number,followed by central numberuint8_t WindowWidening;         // Wait rf start window(us)uint8_t WaitWindow;             // Wait event arrive window in one system clockuint8_t MacAddr[6];             // MAC address,little-endianpfnSrandCB srandCB;             // Register a program that generate a random seedpfnIdleCB idleCB;               // Register a program that set idlepfnTempSampleCB tsCB;           // Register a program that read the current temperature,determine whether calibration is needpfnLSICalibrationCB rcCB;       // Register a program that LSI clock calibrationpfnLibStatusErrorCB staCB;      // Register a program that library status callbackpfnFlashReadCB readFlashCB;     // Register a program that read flashpfnFlashWriteCB writeFlashCB;   // Register a program that write flash
} bleConfig_t 

TX POWER 定义

ERR_LIB_INIT lib初始化错误定义

#define ERR_LLE_IRQ_HANDLE              0x01  // 中断错误?
#define ERR_MEM_ALLOCATE_SIZE           0x02  // 内存分配的大小错误
#define ERR_SET_MAC_ADDR                0x03  //  MAC地址设置错误
#define ERR_GAP_ROLE_CONFIG             0x04  //   GAP_ROLE 配置错误
#define ERR_CONNECT_NUMBER_CONFIG       0x05  //   连接数量错误
#define ERR_SNV_ADDR_CONFIG             0x06  //  SNV 地址错误
#define ERR_CLOCK_SELECT_CONFIG         0x07   // 时钟选择错误

BLE_STATUS_VALUES BLE 默认的状态值

#define bleInvalidTaskID                INVALID_TASK  //!< Task ID isn't setup properly
#define bleEecKeyRequestRejected        0x06   //!< key missing
#define bleNotReady                     0x10   //!< Not ready to perform task
#define bleAlreadyInRequestedMode       0x11   //!< Already performing that task
#define bleIncorrectMode                0x12   //!< Not setup properly to perform that task
#define bleMemAllocError                0x13   //!< Memory allocation error occurred
#define bleNotConnected                 0x14   //!< Can't perform function when not in a connection
#define bleNoResources                  0x15   //!< There are no resource available
#define blePending                      0x16   //!< Waiting
#define bleTimeout                      0x17   //!< Timed out performing function
#define bleInvalidRange                 0x18   //!< A parameter is out of range
#define bleLinkEncrypted                0x19   //!< The link is already encrypted // link被加密了
#define bleProcedureComplete            0x1A   //!< The Procedure is completed
#define bleInvalidMtuSize               0x1B   //!< SDU size is larger than peer MTU. SDU size的大小比 MTU大

LINKDB

// Special case connection handles
#define INVALID_CONNHANDLE              0xFFFF // Invalid connection handle, used for no connection handle
#define LOOPBACK_CONNHANDLE             0xFFFE // Loopback connection handle, used to loopback a message
// Link state flags
#define LINK_NOT_CONNECTED              0x00   // Link isn't connected
#define LINK_CONNECTED                  0x01   // Link is connected
#define LINK_AUTHENTICATED              0x02   // Link is authenticated
#define LINK_BOUND                      0x04   // Link is bonded
#define LINK_ENCRYPTED                  0x10   // Link is encrypted
// Link Database Status callback changeTypes
#define LINKDB_STATUS_UPDATE_NEW        0      // New connection created
#define LINKDB_STATUS_UPDATE_REMOVED    1      // Connection was removed
#define LINKDB_STATUS_UPDATE_STATEFLAGS 2      // Connection state flag changed

GATT UUID

定义了很多功能的UUID 详细参考 CH59xBLE_LIB.h

MESSAGE ID

ATT MTU SIZE

/************************************ATT***************************************/
#define ATT_MTU_SIZE                    23   //!< Minimum ATT MTU size
#define ATT_MAX_MTU_SIZE                512  //!< Maximum ATT MTU size

ATT Methods

ATT Error Codes

PDU

GATT Attribute Access Permission Bit Fields

GATT Charateristic Properties Bit Fields

GAP ROLE 主从角色的定义

GAPBOND 匹配码的定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

项目冲刺——第三篇Scrum冲刺博客

作业所属课程 所属课程作业要求 作业要求作业目标 总结第二天的敏捷开发,安排好第三天敏捷开发冲刺一、站立式会议 1、会议图片2、昨天已完成的内容成员 任务肖杨、梁丽贤 完成注册登陆页面设计黄诃华、欧文杰 完成用户注册登陆功能姚佳如、李慧娣 完成发布帖子模块的设计廖莹…

团队作业4——项目冲刺 第3篇 Scrum 冲刺博客

这个作业属于哪个课程 软件工程这个作业要求在哪里 团队作业4——项目冲刺这个作业的目标 团队完成任务的分配,明确团队每个人在接下来七天敏捷冲刺的目标其他参考文献这个作业所属团队 SuperNewCode团队成员 张楠 曾琳备 黄铭涛 张小宇 周广1.每日举行站立时会议2.燃尽图3.每…

linux增加环境变量示例

首先,通过 vim ~/.bashrc 命令进入我这个用户的.bashrc文件内 然后在这个文件末尾添加环境变量,比如下面红框中的内容表示添加了路径/home/nfs_new/wangpeng/VSCode-linux-x64/bin为环境变量,实际上这里是把vscode启动命令添加作为环境变量了。其中, $PATH 表示之前所有的…

基于harris角点和RANSAC算法的图像拼接matlab仿真

1.算法运行效果图预览2.算法运行软件版本 MATLAB2022a3.算法理论概述Harris角点检测是一种局部特征检测方法,它寻找图像中具有显著局部曲率变化的位置,即边缘转折点或角点。主要通过计算图像窗口内的自相关矩阵M,并对其特征值进行评估。Harris响应函数H由自相关矩阵M的两个主…

go学习笔记——Kratos框架

官方文档https://go-kratos.dev/en/docs/getting-started/start/1.安装Go 参考:mac安装go1.20 2.安装Kratos框架 kratos依赖protobuf grpc等框架,需要先进行安装brew install grpc brew install protobuf brew install protoc-gen-go brew install protoc-gen-go-grpc验证pro…

m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下:遗传优化迭代过程:误码率对比:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Code, LDPC码)因其优越的纠错性能和近似香农极限的潜力,在现代通信系统中扮演着重要角色。归一化最小和(Normalized Min-Sum, NMS)…