#include "ADS1115.h"
#include "stm32f10x_i2c.h"
#include "delay.h"
#include <stdbool.h>
unsigned char BUF[8];
void I2C_GPIO_ADS1115_Init(){
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;// SCL SDA
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //硬件I2C2
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_DeInit(I2C2);//使用I2C2
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0xA0;//主机的I2C地址,随便写的
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;//100K
I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
}
//---------------------------------------------------------//
void AD_init(unsigned char id,unsigned char write_address,unsigned char byte1,unsigned char byte2) {
I2C_GenerateSTART(I2C2,ENABLE); //产生起始条件
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //等待ACK
I2C_Send7bitAddress(I2C2,id,I2C_Direction_Transmitter); //向设备发送设备地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待ACK
I2C_SendData(I2C2, write_address);//配置寄存器 //寄存器地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待ACK
I2C_SendData(I2C2, byte1);//c-an0 d-an1 e-an2 f-an3 0->6.144 2->4.096,高字节配置 //发送数据
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送完成
I2C_SendData(I2C2, byte2);//低字节 最高转换速度
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //发送完成
I2C_GenerateSTOP(I2C2, ENABLE); //产生结束信号
}
//----------------------------------------------------//
void I2C_ADpoint(unsigned char id,unsigned char write_address) {
I2C_GenerateSTART(I2C2,ENABLE); //产生起始条件
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //等待ACK
I2C_Send7bitAddress(I2C2,id,I2C_Direction_Transmitter); //向设备发送设备地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待ACK
I2C_SendData(I2C2, write_address); //寄存器地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2, ENABLE); //产生结束信号
}
//----------------------------------------------------------//
void I2C_Read2(unsigned char id, unsigned char read_address) {
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); //等待I2C
I2C_GenerateSTART(I2C2, ENABLE); //产生起始信号
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //EV5
I2C_Send7bitAddress(I2C2, id, I2C_Direction_Transmitter); //发送地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //EV6
I2C_Cmd(I2C2, ENABLE); //重新设置可以清楚EV6
I2C_SendData(I2C2, read_address); //发送读得地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //EV8
I2C_GenerateSTART(I2C2, ENABLE); //重新发送
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //EV5
I2C_Send7bitAddress(I2C2, id, I2C_Direction_Receiver); //发送读地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //EV6
while(!(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED)));
BUF[1] = I2C_ReceiveData(I2C2);
I2C_GenerateSTOP(I2C2, ENABLE);
I2C_AcknowledgeConfig(I2C2, DISABLE);//关闭应答和停止条件产生
while(!(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED)));
BUF[2] = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2, ENABLE);
}
//------------------------------------------//
u16 read_ADS1115() {
int valu;
AD_init(0x90,0x01,0xc2,0xe2); //器件地址90,配置寄存器01,寄存器高位,寄存器低位e2 //高字节配置:c-an0 d-an1 e-an2 f-an3 0->6.144 2->4.096
DelayMs(1);
I2C_ADpoint(0x90,0x00);
DelayMs(2);
I2C_Read2(0x91,0x00);
valu=(BUF[1] << 8) | BUF[2];
if(valu>0x7fff)valu-=0xffff;
return valu;
}
void I2C2_WriteData(uint8_t addr, uint8_t dataH, uint8_t dataL){
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2, ENABLE);//开启I2C2
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
I2C_Send7bitAddress(I2C2, 0x90, I2C_Direction_Transmitter);//器件地址 -- 默认0x90
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2, addr);//寄存器地址
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, dataH);//发送数据
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, dataL);//发送数据
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2, ENABLE);//关闭I2C2总线
}
bool ADS1115_Init(){
I2C_GPIO_ADS1115_Init();
DelayMs(100);
return true;
}