TI论坛
直播中

李慧

8年用户 971经验值
私信 关注
[问答]

ADC128S022配置为其他路数据的时候,数据不能正常读出,为什么?


  • 整个系统的连接关系图如下所示:
    (MG2455/51单片机-12MHz晶振)  <--(模拟SPI)-->   (ADC128S022)
    问题:
    (1) 当使用第8路数据的时候,数据能正常读出;
    (2) 当使用第第7路数据的时候,数据能正常读出;
    (3) 当配置为其他路数据的时候,数据不能正常读出;特别是当设置为0x00时,应读取第一路数据,但从读取的数据来看,没有读取到任何数据;

    模拟程序如下:

    void Reading_ADC_Data(unsigned char serial_number, unsigned short *adc_data)
    {
    //function's relative variable define  
    unsigned char lvuc_adc_input  = 0x00;  
    unsigned char lvuc_adc_cnt  = 0x00;  
    unsigned short lvus_adc_data  = 0x0000;           
    unsigned char lvuc_adc_numbytes = 0x00;
    //Initial the function's relative variable according to ADC's datasheet
    lvuc_adc_numbytes = 16;  
    lvus_adc_data  = 0;  
    ADC_CSN    = 1;  
    ADC_SCK    = 1;  
    ADCDelay(2);  
    ADC_CSN    = 0;   
    //The main processing for the processing of Reading ADC
    //step 1: according to the input's serial number and confirm the adc's input  
    switch(serial_number)  
    {   
    case 0:    lvuc_adc_input = ADC_INPUT0;    break;  
    case 1:    lvuc_adc_input = ADC_INPUT1;    break;   
    case 2:    lvuc_adc_input = ADC_INPUT2;    break;   
    case 3:    lvuc_adc_input = ADC_INPUT3;    break;   
    case 4:    lvuc_adc_input = ADC_INPUT4;    break;   
    case 5:    lvuc_adc_input = ADC_INPUT5;    break;   
    case 6:    lvuc_adc_input = ADC_INPUT6;    break;   
    case 7:    lvuc_adc_input = ADC_INPUT7;    break;   default:    break;  }
    #if 1 //debug the AD with all bit setting '1'  
    lvuc_adc_input = 0xe1;
    #endif  
    //Step2: sending the controller register and reading the convert data  
    for(lvuc_adc_cnt = 0; lvuc_adc_cnt < lvuc_adc_numbytes; lvuc_adc_cnt++)  
    {   
    //Step 2A: drop-down the SclK signal to low period   
    ADCDelay(4);   
    ADC_SCK  = 0;     
    //Step 2a: sending the ADC's input address into the ADC registers  
    if(lvuc_adc_cnt < 5)   {   
    //setting the SPI output interference signal   
    if(lvuc_adc_input&0x80)    {     ADC_DOU = 1;    }    else    {     ADC_DOU = 0;    }
       //left moving the sending byte   
    lvuc_adc_input <<= 1;   }   
    else   {    ADC_DOU = 0;   }
      //Step 2B: reading the data from the ADC  
    ADCDelay(5);   ADC_SCK = 1;   ADCDelay(1);
      //recording the data reading from ADC   
    if(lvuc_adc_cnt >= 4 )   
    {    //recording the history data   
    lvus_adc_data <<= 1;    //setting the SPI output interference signal   
    if(ADC_DIN)    {     lvus_adc_data |= 0x0001;    }    else    {     lvus_adc_data &= 0xfffe;    }   }   else   {    ;   }     }
    //Step 4: letting the ADC going to deep-sleeping modeling  ADC_CSN    = 1;  ADC_SCK    = 1;
    //getting the ADC values  *adc_data   = lvus_adc_data;   
    return; }

                                  

回帖(2)

李桂英

2025-1-13 16:14:31
最好能有原理图4线SPI的波形截图,帮助分析。
所指的没有任何数据是,Dout上恒为低吗?
测试时候通道输入端是怎样连接的?
芯片默认如果不配置就是IN0, 试下,如果不配置通道,是否有Dout?
举报

贺服窍

2025-1-14 17:47:56
根据您提供的信息和问题描述,我们可以分析以下几个可能的原因:

1. **通道配置问题**:ADC128S022是一个8通道的模数转换器,每个通道对应一个输入引脚。如果配置为其他路数据时数据不能正常读出,可能是因为通道配置不正确或者通道没有被正确激活。请检查您的配置代码,确保每个通道都被正确设置。

2. **通道输入问题**:如果某些通道没有连接到有效的模拟信号源,或者连接的信号源不稳定,那么读取的数据可能会有问题。请检查所有通道的输入信号,确保它们都是有效的。

3. **SPI通信问题**:SPI通信是单片机与ADC128S022之间数据传输的桥梁。如果SPI通信出现问题,可能会导致数据读取错误。请检查SPI通信的配置,包括时钟频率、CPOL、CPHA等参数,确保它们符合ADC128S022的要求。

4. **单片机程序问题**:您的程序可能在读取数据时存在逻辑错误。请检查您的程序,特别是读取数据的部分,确保数据被正确读取并存储。

5. **硬件连接问题**:硬件连接错误也可能导致数据读取问题。请检查所有连接,包括电源、地线、数据线等,确保它们都是正确的。

6. **ADC128S022本身问题**:如果以上都检查过了,还是有问题,那么可能是ADC128S022本身存在问题。可以尝试更换一个新的ADC128S022来测试。

针对您的问题,您可以尝试以下步骤来解决问题:

- **检查通道配置**:确保您的程序中通道配置是正确的,特别是当您设置为0x00时,确保这是正确的通道配置。
- **检查输入信号**:确保所有通道都有有效的输入信号。
- **检查SPI通信**:确保SPI通信参数设置正确,并且通信正常。
- **调试程序**:在程序中添加调试信息,比如在读取数据前后打印一些关键变量的值,帮助您定位问题。
- **硬件检查**:检查所有的硬件连接,包括电源、地线、数据线等。

希望这些建议能帮助您解决问题。如果问题仍然存在,您可能需要提供更多的信息,或者考虑寻求专业的技术支持。
举报

更多回帖

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