STM8 ADS1115 IIC例程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//适当插入延时,准备
启动1115
config_ads1115(0x01,0xC2,0xE3); //控制寄存器地址0x01
,连续转换模式,通道0,
while (1)
{
u16 TEST_1115=Read_ads1115(0); //读
取到ADS1115转换数据
//插入延时程序
for(u16 i=0;i<3000;i++);
Delay_CLK(); SCL = 1; }
//--------------------------------------------------------------
//MASTER模式 发送ACK应答
//--------------------------------------------------------------
#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;}
/*IIC控制引脚还是采用STM8S103的IIC复用引脚,不需要写选项字节,采用模
拟IIC控制方式,上拉电阻为10K,时钟频率大约250K,总线时序完全符合IIC标
准,容错性好,在IAR for STM8 1.41.1 环境调试通过*/
/*
------------------------Includes-------------------------------------
if (cove_data>=0x8000)cove_data=0;
return cove_data;
} void main(void)
{
CLK_ICKR |=0X01;
CLK_CKDIVR=0X00;
//设置系列时钟为最高
内部时钟
Init_I2C();
for(u16 i=0;i<3000;i++);
void I2C_Start(void)
{
SDA = 0; Delay_CLK(); SCL = 0; } //-------------------------------------------------------------//IIC 停止信号发送 //-------------------------------------------------------------void I2C_Stop(void) { SDA = 1;
-----*/
#include "stm8s.h"
#include "IOSTM8S103F3.h"
/* Private defines
-----------------------------------------------------------*/
#define NOP()
asm("nop")
#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_I2C(void)
{
I2C_CR1 &= 0xFE;
+读写位=1
cove_data = I2C_RecvByte();
cove_data<<=8;
I2C_SendACK(0);
cove_data+= I2C_RecvByte();
I2C_SendACK(0);
I2C_Stop();
//1115是正负输出,负数采用标准补码形式,这里只处理+极
性读数,-极性统一作0处理。
void I2C_SendACK(u8 ACK)
{
SDA = ACK;
SCL = 1;
Delay_CLK();
Delay_CLK();
SCL = 0;
}
//--------------------------------------------------------------
//IIC单字节发送+ACK检测
void Delay_CLK()
{
NOP();NOP();NOP();NOP();NOP();
}
//--------------------------------------------------------------
//IIC 启动信号发送
//--------------------------------------------------------------
void config_ads1115(u8 regadd,u8 wdata,u8 wdata1)
{
I2C_Start();
I2C_SendByte(ADS1115_ADD); //如果需要这里可加上ACK检
测
I2C_SendByte(regadd);
I2C_SendByte(wdata);
I2C_SendByte(wdata1);
}
}
Delay_CLK();
return CHK_ACK;
}
//--------------------------------------------------------------
//IIC 单字节接受
//--------------------------------------------------------------
//禁止硬件 I2C
SET_SDA_OUT();
SDA=1;
SET_SCL_OUT();
SCL=1;
}
//--------------------------------------------------------------
//IIC主时钟定时用延时函数
//--------------------------------------------------------------
//--------------------------------------------------------------
u8 I2C_SendByte(u8 Send_DAT)
{
u8
CHK_ACK;
for (u8 i=0;i<8;i++)
{
SCL = 0;
Delay_CLK();
wk.baidu.com
SDA=Send_DAT>>7;
u8 I2C_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;
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;
I2C_Stop();
}
//--------------------------------------------------------------
//ADS1115 读转换结果
//--------------------------------------------------------------
Delay_CLK();
}
SET_SDA_OUT();
return Recv_DAT;
}
//--------------------------------------------------------------
//ADS1115 写控制项
//--------------------------------------------------------------
u16 Read_ads1115(u8 REG_ADD)
{
u16 cove_data;
I2C_Start();
I2C_SendByte(ADS1115_ADD);
//写地址为7位器件地址
+读写位=0
I2C_SendByte(REG_ADD);
I2C_Stop();
I2C_Start();
I2C_SendByte(ADS1115_ADD|1); //读地址为7位器件地址