[蓝牙芯片]

CH579蓝牙内部32K问题

[复制链接]
1283|19
手机看帖
扫描二维码
随时随地手机跟帖
一周一天班|  楼主 | 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晶振输入引脚,可以尝试手动关闭外部晶振输入:
void HAL_TimeInit( void )
{
#if( CLK_OSC32K )
        R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;  
        R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
        R8_CK32K_CONFIG &= ~RB_CLK_XT32K_PON;
        R8_SAFE_ACCESS_SIG = 0;
        Calibration_LSI();
#else
  R8_SAFE_ACCESS_SIG = 0x57;
  R8_SAFE_ACCESS_SIG = 0xa8;
  R8_CK32K_CONFIG    |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON | RB_CLK_XT32K_PON;
  R8_SAFE_ACCESS_SIG = 0;
#endif
  RTC_InitTime( RTC_INIT_TIME_HOUR, RTC_INIT_TIME_MINUTE, RTC_INIT_TIME_SECEND ); //RTC时钟初始化当前时间
  TMOS_TimerInit( 0 );
}



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。

使用特权

评论回复
改为内部32K,搜索名称有,但连接不上。外部32K没问题。如何处理?应该内部32K也可以的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

517

帖子

3

粉丝