This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TLC2554无法读取采样数据



主控制是带四线制SPI接口的微处理器,设置为24位模式(16位模式也试过,现象是一样的),时钟信号12MHz,CLCK时钟滞后CS片选信号1.5us,读写SFR均正常。采样模式设置为单次采样,12CLCK转换时间,内部基准源。读取通道11、12、13测试通道的数据都是一样的,应该是没有实现数据转换。

  • 1. 是否监测采样时中断信号EOC的输出波形?

    2. 设计上如何处理CSTART管脚 ?对应的控制信号

    3. 方便时,将你处上传你的代码看看

  • CSTART和FS管脚都没用,直接通过电阻拉高,测试时采用延时测试,没有检测EOC引脚状态。下面是测试代码:

    static int adc_init(void);

    static int adc_write_data(unsigned int cmd);

    static int adc_get_data(unsigned int cmd);

    static int adc_get_analog(unsigned int cmd);

    static int adc_get_sfr(void);

    ADCSPI_T   adc = {

                       .value = 0.0,

                       .tdata = 0,

                       .sfr_data = 0,

                       .init = adc_init,

                       .get_data = adc_get_data,

                       .get_analog = adc_get_analog,

                       .get_sfr = adc_get_sfr

                    };

    static int adc_init(void)

    {

       PIO_ADC_CS->DATA.BITS.CS = 1;//这是后来将SPI数据位改成8位模式,并将CS引脚用IO脚模拟

       adc_write_data(0xa000);

       adc_write_data(0xa804);

       return 0;

    }                

    static int adc_write_data(unsigned int cmd)

    {

    /************16和24模式****************

    //    unsigned int cmd_temp; //

    //    cmd_temp = cmd<<8;

    */

    unsigned char cmd_h,cmd_l;

       cmd_l = cmd;

       cmd_h = cmd>>8;

       PIO_ADC_CS->DATA.BITS.CS = 0;

       usleep(2);

       ADC_SPI->TXDATA = cmd_h;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       ADC_SPI->TXDATA = cmd_l;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       usleep(5);

       PIO_ADC_CS->DATA.BITS.CS = 1;

       return 0;

    }                

    static int adc_get_sfr(void)

    {

       int ttdata;

    /************16和24模式****************  

    //    adc_write_data(0x9000);

    //    ttdata = ADC_SPI->RXDATA >>8;

    //    adc.sfr_data = ttdata & 0x0fff;

    */

       PIO_ADC_CS->DATA.BITS.CS = 0;

       usleep(2);

       ADC_SPI->TXDATA = 0x90;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       ttdata = ADC_SPI->RXDATA;

       ttdata = ttdata << 8;

       ADC_SPI->TXDATA = 0x00;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       ttdata = ttdata + ADC_SPI->RXDATA;

       usleep(5);

       PIO_ADC_CS->DATA.BITS.CS = 1;

       adc.sfr_data = ttdata & 0x0fff;

       return 1;

    }

    static int adc_get_data(unsigned int cmd)

    {

       int data;

           unsigned char cmd_h,cmd_l;

    /************16和24模式****************    

    //    adc_write_data(cmd);

    //    data = ADC_SPI->RXDATA;

    //    usleep(500);  

    //    while(PIO_ADC_ECO->DATA.BITS.ECO == 0);

    //    adc_write_data(cmd);

    //    data = ADC_SPI->RXDATA;

    */

       PIO_ADC_CS->DATA.BITS.CS = 0;

       usleep(2);

       ADC_SPI->TXDATA = cmd_h;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       data = ADC_SPI->RXDATA;

       data = data << 8;

       ADC_SPI->TXDATA = cmd_l;//cmd_temp;

       while(!(ADC_SPI->STATUS.BITS.TMT));

       data = data + ADC_SPI->RXDATA;

       usleep(5);

       PIO_ADC_CS->DATA.BITS.CS = 1;

       data = data >>12;

       return data;

    }

    static int adc_get_analog(unsigned int chn)

    {

       int ddata;

    //    float value;

       ddata = adc_get_data(chn);

       adc.tdata = ddata;

       adc.value = ddata *  MOD;// + OFFSET;

    //    dac_set_data(chn,ddata);

       return 1;

    }

  • 主程序0.5s读一次采样数据。时间上肯定能转换完成,准备延时采样测试成功再通过检测EOC采样。