TI论坛
直播中

刘燕

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

ADS1112 SLAVE ADDR从机地址的疑问求解


  • 我在总线上挂了三个ADS1112,A1,A0分别接的GND,GND;
    VCC,NC;VCC,VCC;结果就只有地址0X90有反应,理论上地址应该分别为0X90,0X9A,0X9D,快帮忙吧,头都大了,谢谢










    /*********************************************************************
    *   Filename:       adc.c
    *   Revised:        Date: 2012-08-05 19:50 (七)
    *   Revision:       $
    *  Writer:   $Wuming Shen.
    *
    *   Description:    ADS读写程序
    *
    *   Notes:      
    *     QQ:276193028                                                
    *         E-mail:shenchangwei945@163.com   
    *   
    *   All copyrights reserved to Wuming Shen.
    *
    *********************************************************************/
    /*********************************************************************
    * INCLUDES
    */
    #include "Global.h"
    #include "STC12C5A60S2.H"
    #include "ADC.h"
    #include "Uart.h"
    /*********************************************************************
    * CONSTANTS
    */
    INT8U code ADS_ADDR[3] = { 0X90, 0X9A, 0X9C };
    /*********************************************************************
    * MACROS
    */
    /*********************************************************************
    * TYPEDEFS
    */
    /*********************************************************************
    * LOCAL VARIABLES
    */
      
    sbit  ADS_SDA = P0^0;          /*I2C的ADS_SDA线定义*/  
    sbit  ADS_SCL = P0^1;          /*I2C的ADS_SCL线定义*/
    //sbit  ADS_SDA = P1^1;          /*I2C的SDA线定义*/  
    //sbit  ADS_SCL = P1^0;          /*I2C的SCL线定义*/
    //sbit  ADS_A0 = P0^0;  
    //sbit ADS_A1 = P0^1;
    /*********************************************************************
    * GLOBAL VARIABLES
    */

    /*********************************************************************
    * LOCAL FUNCTIONS
    */
    BOOL ADS_Config ( INT8U addr, INT8U cfg );
    /*********************************************************************
    * GLOBAL FUNCTIONS
    */
    /*********************************************************************
    * EXTERN VARIABLES
    */
    /*********************************************************************
    * EXTERN FUNCTIONS
    */
    /*********************************************************************/

    /*********************************************************************
    * @fn      &:main
    * @brief   &:First function called after startup.
    * @return  &:don't care
    *********************************************************************/
    /*********************************************************************
    * 名    称:DDS_Init()
    * 功    能:
    * 入口参数:无
    * 出口参数:无
    * 作  者:无名沈
    * 创建日期:2011-04-07
    * 修    改:
    * 修改日期:
    *********************************************************************/
    void  ADS_Init( void )
    {
      /***********************************************
    * 描述:配置转换精度为16位
    * BIT 7 6 5 4 3 2 1 0
    * NAME ST/DRDY INP1 INP0 SC DR1 DR0 PGA1 PGA0
    * DEFAULT 1 0 0 0 1 1 0 0
    *
    * DR1  DR0  DATA RATE RESOLUTION
    * 0  0   240SPS 12 Bits
    * 0  1   60SPS 14 Bits
    * 1  0   30SPS 15 Bits
    * 1(1) 1(1) 15SPS(1) 16 Bits(1)
    */
      #define ADS_ACC_12_BIT  0X80
      #define ADS_ACC_14_BIT  0X84
      #define ADS_ACC_15_BIT  0X88
      #define ADS_ACC_16_BIT  0X8C
    //ADS_A0 = 0;
    //ADS_A1 = 1;
    ADS_Config(ADS_ADDR[0], 0x8c);  //0x84 14BOOL;0x8c 16BOOL;
    ADS_Config(ADS_ADDR[1], 0x8c);  //0x84 14BOOL;0x8c 16B
    ADS_Config(ADS_ADDR[2], 0x8c);  //0x84 14BOOL;0x8c 16BOOL;OOL;

    }
    /*********************************************************************
    * 名    称:DDS_Init()
    * 功    能:
    * 入口参数:无
    * 出口参数:无
    */
    //发起始位   
    #define start()  {  ADS_SDA=1;  
            ADS_SCL=1;
              ADS_SDA=0;  
           ADS_SCL=0;
           }
    //发停止位   
    #define  stop()  {  ADS_SDA=0;  
            ADS_SCL=1;
              ADS_SDA=1;  
           ADS_SCL=0;
           }  
    //发应答位   
    #define  mack()   {  ADS_SDA=0;  
            ADS_SCL=1;
              ADS_SDA=0;  
           ADS_SCL=0;
           }
    //发非应答位   
    #define  mnack()   {  ADS_SDA=0;  
            ADS_SCL=1;
              ADS_SDA=0;  
           ADS_SCL=0;
           }


    //应答位测试   
    BOOL sack(void)  
    {  
        BOOL  ack  = 0;
    INT8U timeOut = 20;
        ADS_SDA = 1;  
        ADS_SCL = 1;
        do {
         ack  = ADS_SDA;  
        } while (ack && --timeOut);
    ADS_SCL = 0;
        return (ack );  
    }
    /*********************************************************************
    * 名    称:ADSWriteByte()
    * 功    能:发一字节数据
    * 入口参数:无
    * 出口参数:无
    * 作  者:无名沈
    * 创建日期:2011-04-07
    * 修    改:
    * 修改日期:
    *********************************************************************/
    void ADS_WriteByte(INT8U dat)  
    {  
        INT8U i;  
        for (i=0;i<8;i++) {
      ADS_SDA = dat & 0X80;    // 高发送低位
      dat  = dat << 1;
            ADS_SCL = 1;  
            ADS_SCL = 0;   
        }  
    }
    /*********************************************************************
    * 名    称:ADSReadByte()
    * 功    能:收一字节数据
    * 入口参数:无
    * 出口参数:无
    * 作  者:无名沈
    * 创建日期:2011-04-07
    * 修    改:
    * 修改日期:
    *********************************************************************/     
    INT8U ADS_ReadByte(void)  
    {  
        INT8U  dat,i;  
        dat  = 0;  
    //    ADS_SCL = 0;
        for (i=0;i<8;i++) {
         ADS_SDA  = 1;
         ADS_SCL  = 1;
      dat |= (INT8U)ADS_SDA;   // 先收低位
      dat <<= 1;
            ADS_SCL = 0;  
        }  
        return (dat);     
    }  
      
    /*********************************************************************
    * 名    称:ADCReadData()
    * 功    能:读取AD转换值
    * 入口参数:无
    * 出口参数:无
    * 作  者:无名沈
    * 创建日期:2011-04-07
    * 修    改:
    * 修改日期:
    *********************************************************************/   
    INT16S ADS_ReadData( INT8U addr, INT8U ch, INT8S times )  
    {  
      //INT8U  addr;
        INT8U   dataH;      // AD高8位
    INT8U  dataL;      // AD低8位
    INT8U  cfgReg;
        float  result = 0.0;
    INT8S  cnt  = 0;
    INT8U  timeOut = 20;
    bit   cpu_sr;
    /***********************************************
    * 描述:
    */
    //addr   = addr;//ADS_ADDR[ch/2];
    //ch   = 0;//ch%2;
    UART_Printf(0,"Waddr:0x%X ch:%drn",(INT16U)addr,(INT16U)ch);
    /***********************************************
    * 描述:
    */
        if ( !ADS_Config( addr, 0x0C | ( ch << 5 ) ) ) {   //0B10001100
      UART_Printf(0,"Config Errrn");
      return FALSE;
    }
    addr += 1;
    UART_Printf(0,"Raddr:0x%X ch:%drn",(INT16U)addr,(INT16U)ch);
    /***********************************************
    * 描述:
    */
    do {
      timeOut  = 10;
    again:
      cpu_sr  = EA;        // 保存当前中断使能状态
      EA   = 0;        // 关闭中断
      /***********************************************
      * 描述:开始读
      */
         start();                       // 发起始位
      ADS_WriteByte( addr );       // ED0的读地址
         if ( sack() ) {
            EA   = cpu_sr;       // 恢复中断状态
       return FALSE;
      }
         /***********************************************
      * 描述:读取数据
      */
         dataH  = ADS_ReadByte();  
         mack();           // 发应答位   
         dataL  = ADS_ReadByte();
         mack();           // 发应答位   
         cfgReg  = ADS_ReadByte();
         mnack();          // 发非应答位   
         stop();           // 发送停止位
      UART_Printf(0,"H:0x%x L:0x%x R:0x%xrn",(INT16U)dataH,(INT16U)dataL,(INT16U)cfgReg);
      EA    = cpu_sr;       // 恢复中断状态
      /***********************************************
      * 描述:
      */
      if ( cfgReg & 0X80 ) {       // 判断是否有新的AD采样值,最高位为1表示无新值
       if ( --timeOut <= 0 )
        return 0xffff;
       OSTimeDly(OS_TICKS_PER_SEC/15);    // 16位精度为15次每秒
       goto again;         // 重新读取
      }
      result += (float)( ( (INT16S)dataH << 8 ) + dataL );
      
    } while ( ++cnt < times );  

    /***********************************************
    * 描述:
    */
        if ( times > 0 )
      result /= times;
        return ( INT16S )result;  
    }
       
    /*********************************************************************
    * 名    称:ADS_Config()
    * 功    能:设置ADS1100
    * 入口参数:无
    * 出口参数:无
    * 作  者:无名沈
    * 创建日期:2011-04-07
    * 修    改:
    * 修改日期:
    *********************************************************************/  
    BOOL ADS_Config( INT8U addr, INT8U cfg )  
    {  
    bit  cpu_sr = EA;
    EA    = 0;       // 关闭中断
    //addr = ADS_ADDR[addr];
        start();                       /*发起始位*/
        ADS_WriteByte( addr );
        if ( sack() ) {
         stop();
         EA   = cpu_sr;       // 恢复中断状态
      return FALSE;
    }
        ADS_WriteByte( cfg );
        if ( sack() ) {
         stop();
         EA   = cpu_sr;       // 恢复中断状态
      return FALSE;
    }  
        stop();

    EA    = cpu_sr;       // 恢复中断状态
    return TRUE;
    }
    /*********************************************************************
    *     end of file
    *********************************************************************/

回帖(1)

尚文清

2025-2-12 18:27:46
根据您的描述,您在I2C总线上挂了三个ADS1112,分别设置了A1和A0引脚。理论上,这三个设备的地址应该是0x90、0x9A和0x9D。但是,您发现只有0x90地址的设备有反应。

首先,我们需要检查硬件连接是否正确。请确保以下连接正确:

1. 所有ADS1112设备的SDA(数据线)和SCL(时钟线)都连接到I2C总线上。
2. 所有ADS1112设备的VCC和GND引脚都正确连接到电源和地。
3. A1和A0引脚根据您的描述已经正确连接。

如果硬件连接正确,那么可能是软件问题。请检查您的I2C通信代码,确保您正确地发送了地址和数据。以下是一些建议:

1. 确保您在发送地址时,正确地将A1和A0引脚的值包含在内。例如,对于地址0x9A,您需要发送0x4A(0x9A << 1)。
2. 确保您在发送数据时,正确地处理了I2C通信的起始位、地址位、数据位和停止位。
3. 检查您的I2C通信代码是否支持多个设备。有些I2C库可能只支持与单个设备通信。

如果您仍然无法解决问题,建议您使用示波器检查I2C总线上的信号,以确保通信正常。您还可以尝试使用其他I2C设备,以排除ADS1112设备本身的问题。

希望这些建议能帮助您解决问题。如果还有其他疑问,请随时提问。
举报

更多回帖

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