记录一个困扰了一天的问题,最近一个产品需要更换对讲芯片,测试的时候发现无论如何接受数字哑音读取不出来,代码是从另一个工程拷贝过来的,在给对讲芯片写完数据之后,打开了CDCSS的中断,经过实际测试,关掉中断就好了,实际上读取CDCSS状态码使用的轮询的方式,也用不到中断,直接把代码拷贝过来用,在以后的工作中,需要多多思考,他人的代码也并不是完全正确。

放一个生成24位的CDCSS码留着备用,目前工程中的码都是用的是查表法。

unsigned int CalDcs23BitData(unsigned short DcsCode, unsigned char InvertEn)
{
    unsigned short DcsTmpCode, DcsTmpCode1;
    unsigned int DcsTmpCode2;
    //9 bits + 100 ==> 12 bits
    DcsTmpCode1 = DcsCode & 0x01FF;     //179&0x1FF=179=0xB3
    DcsTmpCode1 = DcsTmpCode1 | 0x0800; //179|0x800=0x8B3

    //Normal or Invert DCS
    DcsCode = DcsCode & 0x6000; //=0
    if (InvertEn == 0)          //注意此格式为当为反向时为1
        DcsTmpCode1 = (~DcsTmpCode1) & 0x0fff;
    DcsTmpCode = DcsTmpCode1; //0x8B3
    for (unsigned char i = 12; i > 0; i--)
    {
        if (DcsTmpCode & 0x0001)
        {
            DcsTmpCode = DcsTmpCode >> 1;
            DcsTmpCode = DcsTmpCode | 0x8000;
            DcsTmpCode ^= 0x863A;
        }
        else
            DcsTmpCode = DcsTmpCode >> 1;
    }
    DcsTmpCode2 = (long)DcsTmpCode;
    DcsTmpCode2 = DcsTmpCode2 << 12;
    DcsTmpCode2 = DcsTmpCode2 | (long)(DcsTmpCode1);

    return DcsTmpCode2;
}

其中的输入参数为十六位数据,低九位有效,比如127赫兹的状态码,输入低九位就是 001 010 111,输入进去输出数据就是24bit的码,直接传参数用。