Other Parts Discussed in Thread: ADS1115, OPA2187
Hi Team,
My customer now use ADS1115-Q1 and read the output value is 0.When reading the voltage, they only use three functions:
- Ads1115_Config();
- Ads1115_PointRegister();
- VOL=Ads1115_ReadData()
Could you please give some advice?
/************************************************************ FileName: bsp_iic.h Author: liamtsen Date: 2019/03/07 Description: IIC���� ***********************************************************/ #include "global.h" //IO�������� #define ADC_SDA_IN() SystemIoModeSetIn(GPIOB,RCC_AHB1Periph_GPIOB,GPIO_Pin_11) #define ADC_SDA_OUT() SystemIoModeSetOut(GPIOB,RCC_AHB1Periph_GPIOB,GPIO_Pin_11) #define ADC_SCL_OUT() SystemIoModeSetOut(GPIOB,RCC_AHB1Periph_GPIOB,GPIO_Pin_10) //IO�������� #define ADC_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_10) //SCL #define ADC_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_10) //SCL #define ADC_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_11) //SDA #define ADC_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_11) //SDA #define ADC_READ_SDA GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) //ʱ���õ�48M��һ����������1/48000000s void ADC_delay_us(u32 time) { u32 delay=0; while(time>0) { for(delay=0;delay<48;delay++); time--; } } //��ʼ��IIC void ADC_I2C_Init(void) { ADC_SDA_OUT(); ADC_SDA_H; ADC_SCL_OUT(); ADC_SCL_H; } //����IIC��ʼ�ź� void ADC_Start(void) { ADC_SDA_OUT(); ADC_SDA_H; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SDA_L; ADC_delay_us(4); ADC_SCL_L; ADC_delay_us(4); } //����IICֹͣ�ź� void ADC_Stop(void) { ADC_SDA_OUT();//sda����� ADC_SDA_L; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SDA_H; ADC_delay_us(4); } //�������ݺȴ�Ӧ���źŵ��� //����ֵ��1������Ӧ��ʧ�ܣ�IICֱ���˳� // 0������Ӧ��ɹ���ʲô������ u8 ADC_Wait_Ack(void) { u8 ucErrTime = 50; ADC_SDA_OUT();//sda����� ADC_SDA_H; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SDA_IN(); while(ADC_READ_SDA) { ucErrTime --; if(!ucErrTime) { ucErrTime = 0xff; break; } } ADC_SCL_L; ADC_delay_us(4); return(ucErrTime); } //����ACKӦ�� void ADC_Ack(void) { ADC_SDA_OUT(); ADC_SDA_L; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SCL_L; ADC_delay_us(4); } //������ACKӦ�� void ADC_NAck(void) { ADC_SDA_OUT(); ADC_SDA_H; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SCL_L; ADC_delay_us(4); } //IIC����һ���ֽ� //���شӻ�����Ӧ�� //1����Ӧ�� //0����Ӧ�� void ADC_Send_Byte(u8 txd) { u8 t = 8; ADC_delay_us(4); ADC_SDA_OUT(); while(t--) { if((txd&0x80)!=0) ADC_SDA_H; else ADC_SDA_L; ADC_delay_us(4); ADC_SCL_H; ADC_delay_us(4); ADC_SCL_L; ADC_delay_us(4); txd<<=1; } } //��1���ֽڣ�ack=1ʱ������ACK��ack=0������nACK u8 ADC_Read_Byte(void) { unsigned char i,receive=0; ADC_SDA_IN(); for(i=8;i!=0;i--) { ADC_SCL_H; ADC_delay_us(4); receive<<=1; if(ADC_READ_SDA) receive|=0x01; else receive&=0xFE; ADC_SCL_L; ADC_delay_us(4); } return(receive); } void Ads1115_Config(void) { ADC_Start(); ADC_Send_Byte(0x92); ADC_Wait_Ack(); ADC_Send_Byte(0x01); ADC_Wait_Ack(); ADC_Send_Byte(0x84); ADC_Wait_Ack(); ADC_Send_Byte(0x83); ADC_Wait_Ack(); ADC_Stop();//����һ��ֹͣ���� ADC_delay_us(200); } void Ads1115_PointRegister(void) { ADC_Start(); ADC_Send_Byte(0X92); //����������ַ0X30,д���� ADC_Wait_Ack(); ADC_Send_Byte(0x00); //���͵͵�ַ ADC_Wait_Ack(); ADC_Stop(); //����һ��ֹͣ���� ADC_delay_us(200); } u16 Ads1115_ReadData(void) { u8 ReadDataBuf[5]; u16 ADtemp; ADC_Start(); ADC_Send_Byte(0X93); //����������ַ0X30,д���� ADC_Wait_Ack(); ReadDataBuf[0] = ADC_Read_Byte(); ADC_Ack(); ReadDataBuf[1] = ADC_Read_Byte(); ADC_NAck(); ADC_Stop(); //����һ��ֹͣ���� ADC_delay_us(200); ADtemp = ReadDataBuf[0]; ADtemp <<= 8; ADtemp += ReadDataBuf[1]; return(ADtemp); }