[蓝牙芯片] CH579蓝牙内部32K问题

[复制链接]
 楼主| 一周一天班 发表于 2020-9-25 15:44 | 显示全部楼层 |阅读模式
使用样例库HeartRate,改为内部32K,搜索名称有,但连接不上。外部32K没问题。如何处理?应该内部32K也可以的。
WCHTech2 发表于 2020-9-25 17:06 | 显示全部楼层
您好,可以到WCH官网更新最新的579例程V2.2版本,http://www.wch.cn/downloads/CH579EVT_ZIP.html
我用官方评估板测试使用内部32K可以正常连接,如果您是自己做的板子,需要使用外部32K晶振输入引脚,可以尝试手动关闭外部晶振输入:
  1. void HAL_TimeInit( void )
  2. {
  3. #if( CLK_OSC32K )
  4.         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;  
  5.         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  6.         R8_CK32K_CONFIG &= ~RB_CLK_XT32K_PON;
  7.         R8_SAFE_ACCESS_SIG = 0;
  8.         Calibration_LSI();
  9. #else
  10.   R8_SAFE_ACCESS_SIG = 0x57;
  11.   R8_SAFE_ACCESS_SIG = 0xa8;
  12.   R8_CK32K_CONFIG    |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON | RB_CLK_XT32K_PON;
  13.   R8_SAFE_ACCESS_SIG = 0;
  14. #endif
  15.   RTC_InitTime( RTC_INIT_TIME_HOUR, RTC_INIT_TIME_MINUTE, RTC_INIT_TIME_SECEND ); //RTC时钟初始化当前时间
  16.   TMOS_TimerInit( 0 );
  17. }



32K.png

 楼主| 一周一天班 发表于 2020-9-26 10:52 | 显示全部楼层
可能板子有问题
 楼主| 一周一天班 发表于 2020-9-28 10:06 | 显示全部楼层
用了WCH开发板测试,内部RC32K还是BLE连接失败,外部就可以。晕。
 楼主| 一周一天班 发表于 2020-9-28 12:39 | 显示全部楼层
Calibration_LSI这个函数有问题。用官方函数,得到的最后值R16_INT32K_TUNE=0X2ED,我用步进加减,得到的是0x64b,差太多。
        /* 校准 */
        basev = ( calv &0xfff );                                // 获取校准标称值   
        // loc = 1023*(f-26030)/f/((44220-26030)/44220)  经验曲线
    loc = R16_INT32K_TUNE;
        loc = 1000;
    diff_2 = 0;
    diffc = 0;
   
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;               
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    R8_OSC_CAL_CTRL = RB_OSC_CNT_EN;
        do
        {
        R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;               
            R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
            R16_INT32K_TUNE = loc;
        R8_SAFE_ACCESS_SIG = 0;
               
                /* 读取当前值 */
        while(!(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT));
        i = R16_OSC_CAL_CNT;                        // 用于丢弃
        while(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT);               
        while(!(R8_OSC_CAL_CTRL&RB_OSC_CNT_HALT));
        i = R16_OSC_CAL_CNT;                        // 实时校准后采样值       
               
                if( i > basev )
                {
                        loc++;
                }
                else
                {
                        loc--;
                }
               
//        k++;
//        
//        diff_1 = i-basev;
//        
//        if( diff_1 == 0 ){
//            return 0;                // 校准正好
//        }
//        else if((diff_1*diff_2)<0){                                        // 处于两点之间
//                if((diffc == 1) || (diffc == -1) || (diffc == 0))
//            {            
//                // 都变成正数
//                if( diff_2<0 )        diff_2 = ~(diff_2-1);
//                else                     diff_1 = ~(diff_1-1);
//                    
//                if(diff_1>diff_2){
//                    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;               
//                    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
//                    R16_INT32K_TUNE = loc_t;
//                    R8_SAFE_ACCESS_SIG = 0;
//                    
//                    return (diff_2*1000/basev);                                // 返回误差值,千分之
//                }
//                else        return(diff_1*1000/basev);                        
//            }
//        }
//               
//        // 保存上一次值       
//        diff_2 = diff_1;               
//        loc_t = loc;        
//        diffc = diff_1/CNT_STEP_K;
//        loc = loc - diffc;
//        if( loc == loc_t )
//        {
//            if( diff_1 > 0 )        loc = loc+1;        // 当前频率偏小
//            else                                loc = loc-1;        // 当前频率偏大
//        }
    }while( k<20 );       
请官方技术看看是否这个原因,我改下这个函数,看看能否正常工作。
 楼主| 一周一天班 发表于 2020-9-28 12:59 | 显示全部楼层
上例子不对,初始值超过1000,溢出,结果和官方一样
 楼主| 一周一天班 发表于 2020-9-28 13:14 | 显示全部楼层
本帖最后由 一周一天班 于 2020-9-28 13:15 编辑

在编译option宏定义添加CLK_OSC32K就好了。又是宏定义的坑,之前RTC的SLEEP也是。官方的代码问题不少啊。这种宏定义方式真心不希望使用,太坑了。config.h有定义啊,多一个编译的宏定义就是两个定义一件事情,范忌讳的风格。
WCHTech2 发表于 2020-9-28 14:35 | 显示全部楼层
一周一天班 发表于 2020-9-28 13:14
在编译option宏定义添加CLK_OSC32K就好了。又是宏定义的坑,之前RTC的SLEEP也是。官方的代码问题不少啊。这 ...

您好,开启内部32K的宏在config.h文件中有说明,需在option->C/C++ Define添加 define.png
工程中的CH57x_common.h文件中需要根据CLK_OSC32K的值定义CAB_LSIFQ宏,避免先后编译顺序问题,强调在option中进行宏定义。

 楼主| 一周一天班 发表于 2020-9-29 15:40 | 显示全部楼层
WCHTech2 发表于 2020-9-28 14:35
您好,开启内部32K的宏在config.h文件中有说明,需在option->C/C++ Define添加
工程中的CH57x_common.h文 ...

上图没有明确指出需要CLK_OSC32K=1,模糊不轻
 楼主| 一周一天班 发表于 2020-9-29 15:43 | 显示全部楼层
WCHTech2 发表于 2020-9-28 14:35
您好,开启内部32K的宏在config.h文件中有说明,需在option->C/C++ Define添加
工程中的CH57x_common.h文 ...

还有Calibration_LSI只对LSI 32K有效,LSE完全没必要,那么还需要CAB_LSIFQ宏定义做什么,直接赋值32000就好了。CLK_OSC32K==1只在这里判断了一次,别的地方都没。
WCHTech2 发表于 2020-9-29 16:22 | 显示全部楼层
一周一天班 发表于 2020-9-29 15:43
还有Calibration_LSI只对LSI 32K有效,LSE完全没必要,那么还需要CAB_LSIFQ宏定义做什么,直接赋值32000 ...

根据宏CLK_OSC32K 的值设定CAB_LSIFQ宏为 32000或32768,CAB_LSIFQ宏在Calibration_LSI函数中调用。如果CAB_LSIFQ直接赋值32000,当CLK_OSC32K宏定义为2时,即选择内部32.768K时钟,在校准时采用32000会产生一定的误差。
 楼主| 一周一天班 发表于 2020-9-29 17:23 | 显示全部楼层
内部有32.768K?
WCHTech2 发表于 2020-9-29 18:11 | 显示全部楼层

内部软件算法校准后得到32.768K,参考数据手册第96页 LSI.png
chenjun89 发表于 2020-10-5 19:24 | 显示全部楼层
库函数还不熟悉
weifeng90 发表于 2020-10-5 21:02 | 显示全部楼层
配置没对?
便携手到老 发表于 2020-10-9 14:24 | 显示全部楼层
可以到WCH官网更新最新的579例程V2.2版本
别看我照片 发表于 2020-10-10 08:49 | 显示全部楼层
搜索名称有,但连接不上。外部32K没问题。如何处理?应该内部32K也可以的。
自己造声卡 发表于 2020-10-10 09:45 | 显示全部楼层
搜索名称有,但连接不上。外部32K没问题。如何处理?应该内部32K也可以的。
真爱吴迪迪 发表于 2020-10-12 21:18 | 显示全部楼层
可以到WCH官网更新最新的579例程V2.2版本,http://www.wch.cn/downloads/CH579EVT_ZIP.html。
勇者无惧你和我 发表于 2020-10-13 10:00 | 显示全部楼层
改为内部32K,搜索名称有,但连接不上。外部32K没问题。如何处理?应该内部32K也可以的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

527

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

14

主题

527

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部