芯海科技
直播中

马旋

11年用户 36经验值
擅长:电源/新能源 MEMS/传感技术 嵌入式技术 模拟技术 处理器/DSP 接口/总线/驱动 控制/MCU
私信 关注
[ADC/AFE]

CS1237 设置640Hz采样,读出数据异常,设置40Hz,读出数据OK

100ms采样一次,设置640Hz时读出数据乱跳,设置40Hz时读出数据正常。
读函数如下:
int32_t Read_CS1237(void)
{
    unsigned char i;
    uint32_t dat=0;//读取到的数据
    unsigned int count_i=0;//溢出计时器
    int32_t temp;
   
//    OUT_OUT();
//    DOUT_1; //OUT引脚拉高
    SCLK_0;//时钟拉低
    OUT_IN();
    while( SDA ==1)//等待芯片准备好数据
    {
        delay_ms(1);
        count_i++;
        if(count_i > 300)
        {
            OUT_OUT();
            SCLK_1;    // CLK=1;
            DOUT_1;    // OUT=1;
            return 1;//超时,则直接退出程序
        }
    }
   
    dat=0;
    for(i=0;i<24;i++)//获取24位有效转换
    {
        SCLK_1;            // CLK=1;
        Delay_Us(10);
        dat <<= 1;
        if( SDA ==1)
            dat ++;
        SCLK_0;    // CLK=0;
        Delay_Us(10);
    }
   
    for(i=0;i<3;i++)//接着前面的时钟 再来3个时钟
    {
        SCLK_1;    // CLK=1;
        Delay_Us(10);
        SCLK_0;    // CLK=0;
        Delay_Us(10);
    }
   
    OUT_OUT();
    DOUT_1;   //OUT = 1;
   
    //ADC_BIT  16,舍弃低8位
   
    i = 24-ADC_BIT;
    dat >>= i;
   
    if(dat&0x00008000)// 判断是负数 最高位24位是符号位
    {
        temp=-(((~dat)&0x00007FFF) + 1);// 补码变源码
    }
    else
        temp=dat; // 正数的补码就是源码
//    temp = dat;
    return temp;
}


回帖(9)

付镜海

2020-5-14 08:26:24
问哈 两个CS1237可以用一个IO 控制SCLK吗?想节约一个IO
举报

游志荣

2020-6-22 10:12:05
1、640Hz接近1ms的数据刷新速度了,上面代码等待数据准备好的延时达到1ms同一个量级。很有可能采集到正在更新数据时的数据,出现读出来乱码的情况。
2、速度比较快的时候建议采用中断的方式采集数据。
1 举报
  • 星月电子2021: 我640Hz时,程序啥都不干,就专门查询,这样应该和中断差不多了吧?结果还是乱跳,设置为40Hz就能稳定

王谊

2020-8-23 09:21:26
我也遇到相同的问题,按照手册上的操作,设置640HZ不成功。你的问题解决了吗?
1 举报

Nian

2020-8-26 17:16:00
我使用查询的方法也遇到过,更糟糕,10Hz正常,40Hz异常,可能软件没有处理好
举报

更多回帖

发帖
×
20
完善资料,
赚取积分