下面是在开发CH585/592等蓝牙芯片时遇到的一些常见问题的整理:
一.GPIO常见问题
Q1:CH585/4 CH583/2使用GPIO中断功能时,为什么PB22,PB17等IO不可以触发中断?
A1:CH5xx蓝牙芯片支持中断的引脚为PA0-PA15/B0-PB15(PB22/PB23和PB8/PB9属于映射关系)
所以PB17不支持中断功能,PB22/PB23使用时需调用映射函数:
GPIOBGPPCfg(ENABLE, RB_PIN_INTX);
Q2:CH5xx在使用GPIO功能时PB23为什么不能正确输出电平?(同源问题:PB23引脚无法使用定时器,串口等功能)
A2:PB23引脚是芯片的硬件RST引脚,若使用其IO非硬件复位功能需在烧录是去除使能RST作为手工复位输入引脚的勾选。
Q3:CH5xx的GPIO读取接口读出来一直是0(即低电平)?
A3:GPIO读函数读取的是一个32位的寄存器,若定义的是一个8位的变化,则会丢失高位的数据导致读出来一直是0。
#define GPIOA_ReadPortPin(pin) (R32_PA_PIN & (pin))
#define GPIOB_ReadPortPin(pin) (R32_PB_PIN & (pin))
二.UART常见问题
Q1:CH572D串口映射到PA0-PA1无法收发数据,请问是什么原因?
A1:CH572D中PA0-PA1的SWD功能默认是打开的,使用其他复用功能需将其关闭,关闭接口可操作寄存器。
R16_PIN_ALTERNATE &= ~(1<<14);
Q2:CH5xx如果修改打印的串口?
A2:第一步:修改DEBUG宏定义为对应串口号,如使用串口0将DEBUG=0,使用串口1将DEBUG=1
DEBUG修改路径:右击工程选择Properties:
Properties -> C/C++ Build -> Build Settings -> Tool Settings -> GNU RISC-V Cross C Compiler -> Preprocessor
第二步:修改串口初始化程序为修改后的IO:
//注意点:使用手册中带下划线的串口引脚时需调用Remap函数进行映射
GPIOPinRemap(ENABLE, RB_PIN_UART0); //注意点:使用手册中带下划线的串口引脚时需调用Remap函数进行映射
GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
UART0_DefInit();
Q3:为什么移植的串口中断无法接收数据?(同源问题:中断服务函数运行不正常如死机等)
A3:移植中断服务函数时忽略了这两行程序,下面这两行程序是一定要添加的,__INTERRUPT和__HIGH_CODE
__INTERRUPT //硬件压栈
__HIGH_CODE //程序放ram运行
void UART1_IRQHandler(void)
{
...
}
三.晶振常见问题
Q1:CH5xx芯片的晶振为什么没有贴匹配电容?
A1:CH5xx芯片内置了软甲可调节的匹配电容,无需外置匹配电容。
晶振推荐参数:高频:32MHz-10pf-10ppm 低频:32.768KHz-12.5pf-20ppm
Q2:CH5xx芯片的两个晶振都需要贴吗?
A2:32M晶振是必须要贴的,只有CH584在不跑蓝牙,对主频精度要求不高时可以不贴。
32.768K晶振可以选贴:
若对RTC精度要求不高(内部校准后误差一天约2分钟,接外部晶振误差一天约2秒钟),不需要蓝牙主机功能可以不接,
需要蓝牙主机功能和uA级别低功耗必须接。
Q3:晶振如何调节偏差?
HSECFG_Capacitance(HSECap_16p); //外部高频匹配电容
LSECFG_Capacitance(LSECap_21p); //外部低频匹配电容
电容计算公式为(C1*C2)/(C1+C2)+C3 通常C1 C2相等,C3是寄生电容,通过用2pf带入计算,则为C/2+2,若选用晶振为10pf,计算可得C=16pf,此时软件应配置16pf挡位,所以默认值推荐使用32MHz-10pf-10ppm晶振。
四.FLASH常见问题
Q1:为什么芯片codeflash擦除后不是0xFF?
A1:codeflash读取是加扰的,擦除后读取是0xF3F9BDA9四字节循环(不同芯片值有细微差异可自行读取)
Q2:调用GetMACAddress和FLASH写和读等接口时为什么会复位?
A2:传入的指针地址需要四字节对齐否则会复位,通常在定义结构体变量时会有此问题。
Q3:HEX编译出来文件大小是500K,芯片Flash才448K,为什么可以下载进去?
A3:因为HEX包含地址等信息,实际上bin文件只有100k左右。
Q4:为什么dataflash无法写入数据?
A4:dataflash操作接口是相对地址,不要使用绝对地址,如使用首地址擦写读时地址应传0。
Q5:CH32V208的flash为什么只有128k?
A5:CH32V208的codeflash实际上是480k,128k为零等待区。
五.ADC常见问题
Q1:CH5xx为什么测量ADC值时会出现65532等异常值?
A1:因为模拟值是一个有符号的数,校准值可能是负数,若值小于0应直接当0处理。
Q2:CH5xx例程为什么采集2.1v以上就满量程了?
A2:例程使用的PGA增益是0,电压采集范围是0-2.1v,若需要采集更高的电压应使用其他PGA增益。
Q3:CH5xx的ADC测量值为什么很大?
A3:当误差值相差大几十,大几百毫伏时可能是某一个GPIO上的电压超过了VCC电压导致ADC采集异常。
六.功耗常见问题
Q1:使用开发板测试sleep和shutdown低功耗模式是为什么功耗是mA级别?
A1:测试时从3v3供电开发板板的LED和LDO均产生功耗,3v3和vcc有跳帽的开发板可以将跳帽拔下
直接从vcc供电测试功耗,无跳帽的开发板需将LED和LDO去除后进行测试。
Q2:DCDC电感的参数有什么要求?
A2:CH573/1 CH583/2--22uH/DCR<=2ohnm/额定电流>=100mA(开发板用的是顺络SPH202012H220MT/YNR2016-220)
CH585/4 CH592/1--10uH-22uH/DCR<=1ohnm/额定电流>=50mA(DCR也可稍大,DCR越大,DCDC效率稍有降低)
七.下载常见问题
Q1:CH585/592的BOOT引脚是哪一个?
A1:芯片的默认BOOT引脚为PB22,也可下ISP下载时配置为PB11。
八.蓝牙相关问题
Q1:为什么自己设计的蓝牙板子可以正常打印但是没有蓝牙信号?
A1:首先需要检查下VINTA引脚的电压值需在1.035v-1.065v左右,如为0v可能时焊接不良或者其引脚上电容损害导致,若为3.3v可能是硬件设计时错误的将vcc接到此引脚,
其次检查下芯片周围电源引脚上的电容的GND是否走最短回路到芯片的GND,若回路较差可以在芯片背面刮一刮使用较粗的连接线见GND走最短路线(直线)连接测试。
Q2:在使用OTA固定库例程测试时,使用OTA软件连接后为什么显示"不是目标设备"?
A2:因为固定库升级方式需跳转到IAP程序中才能进行OTA升级,例程预留的跳转方式是0xFFE3 UUID收到一个字节数据开启跳转,需先使用BLE调试助手连接上通过此UUID发送任意一个字节数据才能触发。
Q3:使用IOS和MACOS设备扫描蓝牙时,扫描不到CH5xx蓝牙的广播?
A3:这是正常的,这是IOS和MACOS的过滤策略导致的,IOS和MACOS认为透传设备应使用透传APP进行连通信故将其过滤,使用BLE HID例程便可以被扫描到,或者将HID的广播内容放入到透传例程的广播包中也可使其被搜索到。
Q4:蓝牙通信的MTU如何修改?
A4:首先需要将主机端和从机端的代码中BLE_BUFF_MAX_LEN都修改为251,
主机交互代码:
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(centralConnHandle, &req, centralTaskId);
从机端交换代码:
1.在初始化函数Peripheral_Init()中添加GATT_InitClient();
2.在蓝牙连接后调用GATT_ExchangeMTU来修改MTU:
attExchangeMTUReq_t req;
req.clientRxMTU = 247;
GATT_ExchangeMTU(peripheralConnList.connHandle, &req, Peripheral_TaskID);
若使用的是Peripheral例程从机端还需修改gattprofile.h宏定义SIMPLEPROFILE_CHAR1_LEN为244,
主机若是上位机软件的话一般软件会有接口进行交互,从机端只需要修改宏BLE_BUFF_MAX_LEN为251。
九.时间常见问题
Q1:CH5xx为什么上电后10s/20s/60s/120s才运行?
A1:若上电较长时间才运行且下载程序无明显延时,可能是BOOT引脚上电出发BOOT等待升级,如PB22一直为低电平,若BOOT切换成PB11也可能是PB11一直为高电平导致。
Q2:CH5xx的TMOS任务为什么定时不准?设置为1000延时实际上只有600多毫秒?
A2:TMOS的时间单位是0.625ms,1000个时间单位正好是625ms,设置为1600才是1000毫秒。
Q3:CH5xx在运行蓝牙时为什么调用RTC设置函数设置后就复位?
A3:蓝牙的运行是依赖RTC实时时钟的,在运行过程中不可修改,若需要校准时间可以在程序中记录一个偏差值,每次获取时间时加上这个偏差值。
浙公网安备 33010602011771号