#include "main.h"
#include "usr_i2c.h"
#define ACK 0
#define NACK 1
#define I2C_WRITE 0
#define I2C_READ 1
#define SDA_PORT GPIOA
#define SCL_PORT GPIOA
#define HAL_SDA_PIN GPIO_PIN_10
#define SDA_PIN GPIO_PIN_10
#define SCL_PIN GPIO_PIN_11
#define READ_SDA HAL_GPIO_ReadPin(SDA_PORT,HAL_SDA_PIN)
#define IIC_SDA_1 HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,1)
#define IIC_SDA_0 HAL_GPIO_WritePin(SDA_PORT,SDA_PIN,0)
#define IIC_SCL_1 HAL_GPIO_WritePin(SCL_PORT,SCL_PIN,1)
#define IIC_SCL_0 HAL_GPIO_WritePin(SCL_PORT,SCL_PIN,0)
uint8_t adcTest2=10;
uint8_t adcTest3=10;
static uint16_t ConfigRegValue = 0;
/*--------------------------------------------------------------*/
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/*-------------------------------------------------------------*/
//sda输出配置
static void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
//sda输入配置
static void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = HAL_SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
//延迟
static void BSP_Delay_us(uint16_t us)
{
uint32_t cnt = us*50;
while(cnt--);
}
//i2c 启动
static void I2C_Start(void)
{
SDA_OUT();
IIC_SDA_1;
IIC_SCL_1;
BSP_Delay_us(10);
IIC_SDA_0;
BSP_Delay_us(10);
IIC_SCL_0;
}
//i2c 停止
static void I2C_Stop(void)
{
SDA_OUT();
IIC_SCL_0;
IIC_SDA_0;
BSP_Delay_us(10);
IIC_SCL_1;
BSP_Delay_us(10);
IIC_SDA_1;
BSP_Delay_us(10);
}
//等待ack
static uint8_t I2C_WaitAck(void)
{
uint8_t ucErrTime=0;
IIC_SDA_1;
SDA_IN();
BSP_Delay_us(10);
IIC_SCL_1;
BSP_Delay_us(10);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>50)
{
I2C_Stop();
return 1;
}
BSP_Delay_us(3);
}
IIC_SCL_0;
return 0;
}
//master发送ack
static void I2C_SendAck(void)
{
SDA_OUT();
IIC_SCL_0;
IIC_SDA_0;
BSP_Delay_us(10);
IIC_SCL_1;
BSP_Delay_us(10);
IIC_SCL_0;
}
//i2c nack
static void IIC_NAck(void)
{
SDA_OUT();
IIC_SCL_0;
IIC_SDA_1;
BSP_Delay_us(10);
IIC_SCL_1;
BSP_Delay_us(10);
IIC_SCL_0;
}
//i2c发送数据
static uint8_t I2C_SendByte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL_0;
BSP_Delay_us(10);
for(t=0;t<8;t++)
{
if((txd&0x80) == 0x80)
{
IIC_SDA_1;
}else
{
IIC_SDA_0;
}
txd<<=1;
BSP_Delay_us(10);
IIC_SCL_1;
BSP_Delay_us(10);
IIC_SCL_0;
BSP_Delay_us(10);
}
//检测ACK
if(I2C_WaitAck() !=0)
return 1;
else
return 0;
}
//i2c读数据
static uint8_t I2C_RcvByte(void)
{
unsigned char i,receive=0x00;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL_1;
BSP_Delay_us(10);
receive<<=1;
if(READ_SDA == 1)
{
receive += 0x01;
}
BSP_Delay_us(10);
IIC_SCL_0;
BSP_Delay_us(10);
}
//ACK
I2C_SendAck();
return receive;
}
/*--------------------------------ADS1015----------------------------*/
//读寄存器
uint8_t ADS1015_readReg(uint8_t regadd,uint16_t* value)
{
uint16_t ret;
uint8_t Hdata,Ldata;
I2C_Start();
ret=I2C_SendByte(ADS1015ADD|I2C_WRITE);
if(ret!=0)
{
I2C_Stop();
return 1;
}
ret=I2C_SendByte(regadd);
if(ret!=0)
{
I2C_Stop();
return 2;
}
I2C_Start();
ret=I2C_SendByte(ADS1015ADD|I2C_READ);
if(ret!=0)
{
I2C_Stop();
return 3;
}
Hdata=I2C_RcvByte();
I2C_SendAck();
Ldata=I2C_RcvByte();
I2C_SendAck();
I2C_Stop();
*value = Hdata;
*value <<= 8;
*value += Ldata;
return 0;
}
//写寄存器
uint8_t ADS1015_writeReg(uint8_t regadd,uint16_t value)
{
int ret;
uint8_t Hdata,Ldata;
Hdata = value >> 8;
Ldata = value & 0x00ff;
I2C_Start();
ret=I2C_SendByte(ADS1015ADD|I2C_WRITE); //发送地址 写入
if(ret!=0)
{
I2C_Stop();
return 1;
}
ret=I2C_SendByte(regadd); //目的寄存器地址
if(ret!=0)
{
I2C_Stop();
return 2;
}
ret=I2C_SendByte(Hdata); //写入值的高位
if(ret!=0)
{
I2C_Stop();
return 3;
}
ret=I2C_SendByte(Ldata);//写入值的低位
if(ret!=0)
{
I2C_Stop();
return 3;
}
I2C_Stop();
return 0;
}
//初始化-配置
int ADS1015_init(void)
{
uint16_t con=0;
uint16_t rcon=0;
uint8_t ret;
I2C_Init();//初始化端口
ConfigRegValue |= REG_STARTCONVERSION;
ConfigRegValue |= CHAN_AIN1_GND;
ConfigRegValue |= PGA_FS4096;
ConfigRegValue |= OPERATIONAL_CONT;
ConfigRegValue |= DR_860SPS;
ConfigRegValue |= TRADITIONAL_COM;
ConfigRegValue |= NON_LATCHING;
ConfigRegValue |= DIS_CONVERSION;
ret = ADS1015_writeReg(CONFIG_REG,ConfigRegValue);
if(ret != 0)
{
return ret;
}
return 0;
}
//读数据
uint16_t ADS1015_readData(uint16_t *adcdata)
{
return ADS1015_readReg(CONV_REG,adcdata);
}
//获取总线电压 放大10倍
uint16_t ADS1015_getBusVoltage(uint16_t *busVolt)
{
uint8_t ret =0;
uint16_t val = 0;
//读取值
ret = ADS1015_readReg(CONV_REG,&val);
if(ret!=0)
{
return 2;
}
//计算实际值
uint32_t temp = 0;
val >>= 4;
temp = val * 96;
temp /= 100;
*busVolt = (uint16_t)temp;
return 0;
}
//获取油门电压 放大10倍
uint16_t ADS1015_getAccVoltage(uint16_t *accVolt)
{
uint8_t ret =0;
uint16_t val = 0;
//读取值
ret = ADS1015_readReg(CONV_REG,&val);
if(ret!=0)
{
return 2;
}
//计算油门电压
val >>= 4;
val *= 6;
val /= 100;
*accVolt = val;
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于STM32的ADS1015程序
共2个文件
c:1个
h:1个
需积分: 45 27 下载量 153 浏览量
2019-07-20
09:26:22
上传
评论
收藏 2KB RAR 举报
温馨提示
使用stm32hal库通过I2C总线与ADS1015模数转换芯片进行通信,实现通道的读取及配置。
资源推荐
资源详情
资源评论
收起资源包目录
Src.rar (2个子文件)
usr_i2c.h 3KB
usr_i2c.c 6KB
共 2 条
- 1
资源评论
iKihui
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功