|
CMT2119A是一款国产的SubG无线发射IC, 频率范围是240~960MHz, 支持FSK/GFSK/OOK调制方式, 输出功率从-10dBm到+13dBm可调, 封装是小巧的SOT23-6, 是不是很不错? 于是买两个回来, 搭个可变频率信号源试试. 反正这类东西玩法都差不多, 查一下寄存器设置, 把需要的频率和功率写进去就行.
然后才发现问题: datasheet里居然没有寄存器设置, 只给了示例代码, 示例代码里的寄存器具体取值从哪来? 得下载个他的RFPDK软件, 填上需要的频率功率之类, 他给生成寄存器值. 这么一来, 想自己自由设置频率就不行了. 鸡贼成这样还真是稀罕, 骂一句CNDY的. 找到一个CMT2119B的寄存器说明, 然而一试, 根本对不上号, 看来这俩型号完全不是一回事, 仅供参考吧.
没办法, 只能自己破解了. 既然频率范围是240~960MHz, 那就250/350/450, 每100MHz一个点, 各生成一组寄存器值试试, 粘贴到excel里, 是这样的:
密密麻麻, 看晕了有没有? 再仔细看看, 其实大部分寄存器的值是保持不变的, 这些寄存器咱们就不关心了, 可以去掉. 不过也有可能后面零头有影响, 所以找几个随机值添上, 再试试, 果然和频率相关的就那几个, 标记一下, 是这样的:
其中变化最大的是寄存器7, 这个一定是频率的低位数了. 怎么得到它和频率的具体关系呢? 再添加几个和现有频率非常接近的值试试, 250.01, 350.01, 550.01, 试试. 和之前猜测的一样, 频率变化很小时, 只有寄存器7的值不一样. 那么我们试着找一下它们的关系.
先看250.000和250.010这一组, 频率变化0.01MHz, 寄存器7的变化量是0xb1d2-0xb13b=151, 也就是说, 寄存器7每变化1个单位, 频率会变化66Hz左右. 这个数是怎么来的? 这时参考一下CMT2119B那个说明, 原来是外部26M晶振的频率先若干倍频, 再小数分频, 而寄存器7就是这里第二步分频系数的小数部分的低位数.
下一步, 小数部分总共20位二进制, 也就是说这里小数部分的分母是2^20=1048576, 0.01MHz/26MHz*1048576=403, 再用403/151=2.6688, 大约是8/3, 是个简单分数, 看来有戏了.
再把250MHz除以8/3, 得到93.75. 93.75/26=3.605769, 小数部分乘以1048576得到635194, 转换成16进制, 是0x9B13A. 和上面的寄存7的内容对比一下, 破案了吧? 把公式复制粘贴一下, 看放到别的格子对不对.
和预想的差不多, 低频段的几个都对上了, 从350MHz开始不对了, 大概是因为不同频段的分频系数不同. 在350MHz旁边添加350.01MHz的寄存器参数, 再用上面的老办法, 解决了.
最底下的是算出来的寄存器值, 可见低16位就是寄存器7的内容, 高4位是寄存器8的次高4位, 而寄存器8的最高4位则是之前算出来的分频系数的整数部分, 到此寄存器7和8彻底解决了.
再看寄存器1和6, 很明显, 寄存器1在较低频率时是0x5400, 较高频率时是 0x5000, 分界线是450MHz和550MHz之间的某个频率. 用二分法很容易就能找到, 是480MHz.
寄存器6的情况类似, 中间这个分界线也是480MHz, 两边两个呢, 再用二分法, 左边试出来是320MHz, 右边自然会想到是640MHz, 一试, 果然是.
有了1, 6, 7, 8四个寄存器, 应该够了, 寄存器13和16就先不管了, 估计是在不同频率下对输出功率做了点补偿. 按上面的规律, 编程, 串口设定频率, TinySA这边马上显示我要的频率了, 成功!
- unsigned short reg1, reg6, reg7, reg8;
- int mul;
- if(freq > 480000000UL) {
- reg1 = 0x5000;
- if(freq > 640000000UL) {
- reg6 = 0x0000;
- mul = 2;
- }
- else {
- reg6 = 0x0001;
- mul = 3;
- }
- }
- else {
- reg1 = 0x5400;
- if(freq > 320000000UL) {
- reg6 = 0x0000;
- mul = 4;
- }
- else {
- reg6 = 0x0001;
- mul = 6;
- }
- }
- float div = freq * mul / 16 / 26e6;
- unsigned short div_n = (int)div;
- unsigned long div_k = (div - div_n) * 1048576UL;
- reg7 = div_k & 0xffff;
- reg8 = ((div_k >> 16) << 8) | (div_n << 12);
- write_2nd_reg(1, reg1);
- write_2nd_reg(6, reg6);
- write_2nd_reg(7, reg7);
- write_2nd_reg(8, reg8);
复制代码
最后再骂一句厂家, 你算哪根葱, 糊弄你祖宗是吧?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|