首页 >> 大全

在ARM平台STM32及APM32下ASD1101温度传感器时序与源码

2023-10-28 大全 34 作者:考证青年

温度芯片

是一款高精度数字温度传感器。 可提供 24 位数字温度转换结果,具有 0.00003℃的分辨率,

无需用户校准即可在-20℃至+50℃的范围内实现 高 达±0.1℃的 精 度。 具 有 I2C 接 口与

SMBus 接口,具有可配置总线地址,可通过 ADDR 引脚配置成 4 种不同的地址。 具有可编程警

报功能。芯片内置一个可用于通用应用的 24*3 Bits 的 存储器,可掉电存储配置信息。

可在 1.8V 至 5.5V 电压范围内运行,最大转换速率 60Hz 下平均工作电流只有 90uA,这样的低功

耗可以最大限度减少芯片自发热对测量精度的影响。可作为铂电阻RTD的单芯片数字替代方案。

可实现不低于 AA 类 RTD 的精度,而芯片的功耗仅为 RTD 功耗的几分之一。相比 RTD 应用需要

精密基准、走线匹配、算法设计、用户校准等,用 则可以大大简化设计工作。

芯片的生产测试阶段经过 100%测试,校准及验证。

采用 2mm×2mm 的 DFN-6 封装。

温度芯片的读写时序及寄存器:

温度芯片在STM32平台下的读取方式源码:

/*
*********************************************************************************************************
*
*	模块名称 : ASD1101 是一款高精度数字温度传感器驱动模块
*	文件名称 : asd1101.c
*	版    本 : V1.0
*	说    明 : 实现ASD1101的读写操作。
*
*	修改记录 :
*		版本号  日期        作者     说明
*		V1.0    2023-05-01 acom  正式发布
*
*	Copyright (C), 2023-2034, 
*
*********************************************************************************************************
*/#include "i2c_gpio.h"
#include "asd1101.h"/*
*********************************************************************************************************
*	函 数 名: Asd1101_ReadBytes
*	功能说明: 从I2C 读Asd1101寄存器
*	形    参:  _usAddress : 起始地址
*			 _pReadBuf : 存放读到的数据的缓冲区指针
*	返 回 值: 0 表示失败,1表示成功
*********************************************************************************************************
*/
uint8_t Asd1101_ReadBytes(uint8_t *_pReadBuf, uint8_t _usAddress)
{uint8_t i;/* 采用串行EEPROM随即读取指令序列,连续读取若干字节 *//* 第1步:发起I2C总线启动信号 */i2c_Start();/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */i2c_SendByte(ASD1101_DEV_ADDR | I2C_WR);	/* 此处是写指令 *//* 第3步:等待ACK */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}/* 第4步:发送字节地址 */i2c_SendByte((uint8_t)_usAddress);/* 第5步:等待ACK */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}/* 第6步:重新启动I2C总线。下面开始读取数据 */i2c_Start();/* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */i2c_SendByte(ASD1101_DEV_ADDR | I2C_RD);	/* 此处是写指令 *//* 第8步:等待ACK */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}/* 第9步:循环读取数据 */for (i = 0; i < 3; i++){_pReadBuf[i] = i2c_ReadByte();	/* 读1个字节 *//* 每读完1个字节后,需要发送Ack, 最后一个字节不需要Ack,发Nack */if (i != 2){i2c_Ack();	/* 中间字节读完后,CPU产生ACK信号(驱动SDA = 0) */}else{i2c_NAck();	/* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */}}/* 发送I2C总线停止信号 */i2c_Stop();return 1;	/* 执行成功 */cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 *//* 发送I2C总线停止信号 */i2c_Stop();return 0;
}/*
*********************************************************************************************************
*	函 数 名: Asd1101_WriteBytes
*	功能说明: 向I2C的Asd1101寄存器写入数据
*	形    参:  _usAddress : 起始地址
*			 _pWriteBuf : 存放读到的数据的缓冲区指针
*	返 回 值: 0 表示失败,1表示成功
*********************************************************************************************************
*/
uint8_t Asd1101_WriteBytes(uint8_t *_pWriteBuf, uint8_t _usAddress)
{uint8_t i,m;/* 第1步:发起I2C总线启动信号 */i2c_Start();/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */i2c_SendByte(ASD1101_DEV_ADDR | I2C_WR);/* 第3步:发送一个时钟,判断器件是否正确应答--等待应答 */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}/* 第4步:发送字节地址, */i2c_SendByte((uint8_t)_usAddress);/* 第5步:发送一个时钟,判断器件是否正确应答--等待应答 */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}for (i = 0; i < 3; i++){/* 第6步:开始写入数据 */i2c_SendByte(_pWriteBuf[i]);/* 第7步:等待应答 */if (i2c_WaitAck() != 0){goto cmd_fail;	/* EEPROM器件无应答 */}}/* 命令执行成功,发送I2C总线停止信号 */i2c_Stop();return 1;cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 *//* 发送I2C总线停止信号 */i2c_Stop();return 0;
}/*
*********************************************************************************************************
*	函 数 名: Asd1101_ReadTemperature
*	功能说明: 用I2C读取Asd1101的温度
*	形    参:  void
*			 
*	返 回 值: 温度值
*********************************************************************************************************
*/
float Asd1101_ReadTemperature(void)
{uint8_t uTempBuf[3] = {0};uint32_t uiTempValue=0;float fTempValue=0.0001;Asd1101_ReadBytes(uTempBuf,0x00);uiTempValue = (uTempBuf[0]<<16) | (uTempBuf[1]<<8) | (uTempBuf[2]);if((uTempBuf[0] & 0x80) == 0x80){fTempValue = ASD1101_UNIT * (0x1000000 - uiTempValue);fTempValue = -fTempValue;}else{fTempValue = ASD1101_UNIT *  uiTempValue;}return fTempValue;
}

温度芯片在APM32平台下的读取方式源码:

#define ASD1101_DEV_ADDR			0x90		/* 设备地址 */
#define ASD1101_UNIT			0.0000305		/* 单格温度 *///----------------------------------------------------------------------------------------------------
// 从ASD1101的I2C读取温度
// 参数:	slave_addr 器件地址
// 参数:	indexREG 	读取的Port口, 0:port0 ;1:port1
//----------------------------------------------------------------------------------------------------
float I2C_ASD1101_ReadTemp(uint8_t slave_addr,uint8_t indexREG)
{uint8_t Recev1[4] = {0,0,0,0};//uint8_t Recev2 = 0x00;uint8_t i = 0x00;uint16_t uiCounter1 = 0x00;uint32_t uiInputValue = 0x00;float fTempValue=0.0001;//---------------------------------------------------------------I2CTimeout = I2CT_LONG_TIMEOUT;	while(I2C_ReadStatusFlag(I2C1,I2C_FLAG_BUSY) == SET)   //IF BUSY{I2CInit();if((I2CTimeout--) == 0) return 0;}//---------------------------------------------------------------/** I2C Send Configuration*/I2C_HandlingTransfer(I2C1,slave_addr,2,I2C_RELOAD_MODE_SOFTEND,I2C_GENERATE_START_WRITE);//---------------------------------------------------------------uiCounter1 = 0x00;//If Write OKwhile(I2C_ReadStatusFlag(I2C1,I2C_FLAG_TXBE) == RESET && uiCounter1<30000){uiCounter1++;}I2C_TxData(I2C1,slave_addr);//---------------------------------------------------------------uiCounter1 = 0x00;//If Write OKwhile(I2C_ReadStatusFlag(I2C1,I2C_FLAG_TXBE) == RESET && uiCounter1<30000){uiCounter1++;}I2C_TxData(I2C1,indexREG);	//写需要读的寄存号//---------------------------------------------------------------uiCounter1 = 0x00;while(I2C_ReadStatusFlag(I2C1,I2C_FLAG_TXCF) == RESET && uiCounter1<30000){uiCounter1++;}//---------------------------------------------------------------I2C_HandlingTransfer(I2C1,slave_addr,3,I2C_RELOAD_MODE_AUTOEND,I2C_GENERATE_START_READ);//---------------------------------------------------------------uiCounter1 = 0x00;//If Write OKwhile(I2C_ReadStatusFlag(I2C1,I2C_FLAG_TXBE) == RESET && uiCounter1<30000){uiCounter1++;}I2C_TxData(I2C1,slave_addr|0x01);//---------------------------------------------------------------for(i=0;i<3;i++){uiCounter1 = 0x00;//If Write OKwhile(I2C_ReadStatusFlag(I2C1,I2C_FLAG_RXBNE) == RESET && uiCounter1<30000){uiCounter1++;}Recev1[i]=I2C_RxData(I2C1);}//---------------------------------------------------------------// I2C1 Generate Stop signalI2C_EnableGenerateStop(I2C1);uiCounter1 = 0x00;//If Write OKwhile(I2C_ReadStatusFlag(I2C1,I2C_FLAG_STOP) == RESET && uiCounter1<30000){uiCounter1++;}//---------------------------------------------------------------uiInputValue=(Recev1[0]<<16)|(Recev1[1]<<8)|Recev1[2];if((Recev1[0] & 0x80) == 0x80){fTempValue = ASD1101_UNIT * (0x1000000 - uiInputValue);fTempValue = -fTempValue;}else{fTempValue = ASD1101_UNIT *  uiInputValue;}return fTempValue;}//------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------
gfTempValue=I2C_ASD1101_ReadTemp(ASD1101_DEV_ADDR,0x00);	//读取ASD1101的当下温度//------------------------------------------------------------------------------------------------------

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了