27,375
社区成员
发帖
与我相关
我的任务
分享
#define ADS1115_ADD 0X90
#define SCL PB_ODR_ODR4
#define SDA PB_ODR_ODR5
#define SDA_IN PB_IDR_IDR5
#define SET_SCL_OUT() {PB_DDR_DDR4=1;PB_CR1_C14=0;PB_CR2_C24=0;}
#define SET_SDA_OUT() {PB_DDR_DDR5=1;PB_CR1_C15=0;PB_CR2_C25=0;}
#define SET_SDA_IN() {PB_DDR_DDR5=0;PB_CR1_C15=0;PB_CR2_C25=0;}
void Init_IIC(void)
{
I2C_CR1 &= 0xFE; // PE=0, disable IIC module
SET_SDA_OUT();
SDA=1;
SET_SCL_OUT();
SCL=1;
}
//--------------------------------------------------------------
//IIC主时钟定时用延时函数
//--------------------------------------------------------------
void Delay_CLK()
{
NOP();NOP();NOP();NOP();NOP();
}
//--------------------------------------------------------------
//IIC 启动信号发送
//--------------------------------------------------------------
void IIC_Start(void)
{
SDA = 0;
Delay_CLK();
SCL = 0;
}
//--------------------------------------------------------------
//IIC 停止信号发送
//--------------------------------------------------------------
void IIC_Stop(void)
{
SDA = 1;
Delay_CLK();
SCL = 1;
}
//--------------------------------------------------------------
//MASTER模式 发送ACK应答
//--------------------------------------------------------------
void IIC_SendACK(u8 ACK)
{
SDA = ACK;
SCL = 1;
Delay_CLK();
Delay_CLK();
SCL = 0;
}
//--------------------------------------------------------------
//IIC单字节发送+ACK检测
//--------------------------------------------------------------
u8 IIC_SendByte(u8 Send_DAT)
{
u8 CHK_ACK;
for (u8 i=0;i<8;i++)
{
SCL = 0;
Delay_CLK();
SDA=Send_DAT>>7;
Send_DAT <<= 1;
SCL = 1;
Delay_CLK();Delay_CLK();
}
SCL = 0;
Delay_CLK();
SET_SDA_IN();
Delay_CLK();
SCL = 1;
CHK_ACK = (u8)SDA_IN;
SET_SDA_OUT();
Delay_CLK();
SCL = 0;
Delay_CLK();
return CHK_ACK;
}
//--------------------------------------------------------------
//IIC 单字节接受
//--------------------------------------------------------------
u8 IIC_RecvByte()
{
u8 Recv_DAT = 0;
SDA = 1;
SET_SDA_IN();
for (u8 i=0; i<8; i++)
{
Recv_DAT <<= 1;
SCL = 1;
Delay_CLK();
Recv_DAT+=(u8)SDA_IN;
NOP();NOP();
SCL = 0;
Delay_CLK();
}
SET_SDA_OUT();
return Recv_DAT;
}
//--------------------------------------------------------------
//ADS1115 写控制项
//--------------------------------------------------------------
void config_ads1115(u8 regadd,u8 wdata,u8 wdata1)
{
IIC_Start();
IIC_SendByte(ADS1115_ADD);//根据需要,这里可以加上ACK检测
IIC_SendByte(regadd);
IIC_SendByte(wdata);
IIC_SendByte(wdata1);
IIC_Stop();
}
//--------------------------------------------------------------
//ADS1115 读转换结果
//--------------------------------------------------------------
int Read_ads1115(u8 REG_ADD)
{
int READ_TMP;
IIC_Start();
IIC_SendByte(ADS1115_ADD); //写地址为7位器件地址+读写位=0
IIC_SendByte(REG_ADD);
IIC_Stop();
IIC_Start();
IIC_SendByte(ADS1115_ADD|1); //读地址为7位器件地址+读写位=1
*((u8*)(&READ_TMP))= IIC_RecvByte();
IIC_SendACK(0);
*((u8*)(&READ_TMP)+1)= IIC_RecvByte();
IIC_SendACK(0);
IIC_Stop();
return READ_TMP;
}