我在总线上挂了三个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
*********************************************************************/
Johnsin Tao:
建议你用示波器确认一下I2C的时序,可以参照datasheet: http://www.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=ads1112&fileType=pdf第十二页Figure 2/3.