微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS1112 SLAVE ADDR

ADS1112 SLAVE ADDR

时间:10-02 整理:3721RD 点击:

我在总线上挂了三个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:%d\r\n",(INT16U)addr,(INT16U)ch);
 /***********************************************
 * 描述:
 */
    if ( !ADS_Config( addr, 0x0C | ( ch << 5 ) ) ) {   //0B10001100
  UART_Printf(0,"Config Err\r\n");
  return FALSE;
 }
 addr += 1;
 UART_Printf(0,"Raddr:0x%X ch:%d\r\n",(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%x\r\n",(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
 *********************************************************************/

 

建议你用示波器确认一下I2C的时序,可以参照datasheet:   http://www.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=ads1112&fileType=pdf第十二页Figure 2/3.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top