一、AS6221-EK介绍
AS6221是市场上精度最高的数字温度传感器系统,具备完整的数字化系统,可以快速准确的获取测试位置的温度信息,准确的还原温度值并且通过标准 I2C 接口输出。
特点如下:
- 在20℃在40℃温度范围内可实现±0.09℃的测量精度
- 输出数据速率为4Hz时功耗6uA,待机模式下功耗0.1uA
- 支持预警模式,可以灵活设置阈值,实现精确的温度监控
- 集成完整的数字模块,支持标准I2C通信,8组I2C地址可选
- 产线完整单体一致性测试,无需标定/校准
- 采用WLCSP封装,尺寸为1.5×1.0mm
AS6221内部架构
AS6221通过硅基双极温度传感器模拟前端将温度值转为电信号传给AD转换器,再由AD转换器输出为数字信号,经过数字处理,最后将温度值存储在寄存器中,可以通过标准I2C通信访问寄存器读取温度值。
二、寄存器介绍
(1)索引寄存器
索引寄存器是一个8位的寄存器,只有Bit0和Bit1可用,其它位都为0且只读,索引寄存器用来寻址特定的寄存器,通过配置索引寄存器Bit0和Bit1来访问不同寄存器,如:0x0用来访问温度寄存器,0x1用来访问配置寄存器。
(2)配置寄存器
配置寄存器是16位的寄存器,用来配置设备的工作模式,其中,Bit5-12和Bit15可用,其它位不可用
Bit | Bit name | 默认值 | R/W | 为0或1时 |
---|---|---|---|---|
5 | Alert Bit(AL) | 1 | RO | POL为0时:AL为0,表示温度在N个转换周期都大于THIGH,直到温度在N个转换周期都小于TLOW,AL为1 POL为1时:AL为1,表示温度在N个转换周期都大于THIGH,直到 温度在N个转换周期都小于TLOW,AL为0 |
6-7 | Conversion rate bits (CR[0] CR[1]) | CR[0]为0 CR[1]为1 | RW | CR[0]为0且CR[1]为0时:转换率为0.25 CR[0]为1且CR[1]为0时:转换率为1 CR[0]为0且CR[1]为1时:转换率为4 CR[0]为1且CR[1]为1时:转换率为8 |
8 | Sleep mode bit(SM) | 0 | RW | SM为0时:工作模式;SM为1时,睡眠模式 |
9 | Interrupt mode bit(IM) | 0 | RW | IM为0时:比较模式;IM为1时,中断模式 |
10 | Polarity bit(POL) | 0 | RW | POL为0时:温度大于THIGH时AL位输出0; POL为1时:温度大于THIGH时AL位输出1; |
11-12 | Consecutive faults bits (CF[0] CF[1]) | 0 | RW | CF[0]为0且CF[1]为0时:Consecutive faults(N)为1 CF[0]为1且CF[1]为0时:Consecutive faults(N)为2 CF[0]为0且CF[1]为1时:Consecutive faults(N)为3 CF[0]为1且CF[1]为1时:Consecutive faults(N)为4 |
15 | Single shot bit(SS) | 0 | RW | SS为0时:No conversion ongoing/ conversion finished SS为1时:Start single shot conversion / conversion ongoing |
(3)THIGH、TLOW寄存器
THIGH寄存器和TLOW寄存器用来设置温度阈值,二者都是16位寄存器,其中,Bit4-Bit15可用,上电默认值如下:
以TLOW寄存器默认值为例:二进制 0010 0101 1000 0000 转换为十进制为9600,寄存器一个Bit表示0.0078125℃,9600×0.0078125=75℃
(4)TVAL寄存器
TVAL寄存器存放的是测量的温度值,由两个字节表示,一个Bit表示0.0078125℃,AS6221用户手册说为了也能表示负值,温度值以二进制补码表示,所以二进制最高位为符号位,0正1负。
三、获取温度
(1)使用STM32获取数据
这里使用的开发板是STM32F103C8T6,PB10连接AS6221的SCL引脚,PB11连接AS6221的SDA引脚,I2C地址使用默认的地址。
/*AS6221.c文件*/
#include "stm32f10x.h"
#define AS6221_Clock RCC_APB2Periph_GPIOB
#define AS6221_Port GPIOB
#define AS6221_SCL_Pin GPIO_Pin_10
#define AS6221_SDA_Pin GPIO_Pin_11
#define AS6221_ADDRESS 0x48
uint8_t Data[2];
void AS6221_Init(void)
{
RCC_APB2PeriphClockCmd(AS6221_Clock,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Pin=AS6221_SCL_Pin | AS6221_SDA_Pin;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(AS6221_Port,&GPIO_InitStruct);
I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
I2C_InitStruct.I2C_ClockSpeed=100000;
I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_OwnAddress1=0xFF;
I2C_Init(I2C2,&I2C_InitStruct);
I2C_Cmd(I2C2,ENABLE);
}
void AS6221_Get(float *Temperature)
{
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) & 0xFE),I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
I2C_SendData(I2C2,0x00);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
I2C_GenerateSTART(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
I2C_Send7bitAddress(I2C2,((AS6221_ADDRESS<<1) | 0x01),I2C_Direction_Receiver);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
Data[0]=I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);
while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
Data[1]=I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,ENABLE);
*Temperature=((Data[0]<<8) | Data[1])*0.0078125;
}
/*main.c文件*/
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "AS6221.h"
#include "Delay.h"
float Temperature;
int main(void)
{
OLED_Init();
AS6221_Init();
OLED_ShowString(1,1,"T: .");
while(1)
{
AS6221_Get(&Temperature);
OLED_ShowNum(1,3,Temperature,2);
OLED_ShowNum(1,6,(uint16_t)(Temperature*1000)%1000,3);
Delay_ms(500);
}
}
(2)使用ESP8266开发板获取数据
这里ESP8266开发板的D1引脚连接AS6221的SCL引脚,D2引脚连接AS6221的SDA引脚,使用的是Github上的开源程序, AS6221驱动程序
#include "AS6221.h"
#include "Wire.h"
AS6221 temp;
void setup() {
Wire.begin(4, 5); // ESP8266: SDA=D2(GPIO4), SCL=D1(GPIO5)
Serial.begin(115200);
delay(1000); // 等待串口稳定
// 配置传感器参数(仅保留必要选项)
as6221_config_t conf = {
.cr = AS6221_CONV_RATE4, // 4次/秒采样率(250ms间隔)
.state = AS6221_STATE_ACTIVE, // 启用传感器
.alert_mode = AS6221_ALERT_COMPARATOR, // 比较模式
.cf = AS6221_CONSEC_FAULTS2 // 连续2次故障触发报警
};
temp.init(AS6221_DEFAULT_ADDRESS, conf);
}
void loop() {
double temperature = temp.getTemp();
// Serial.print("Temperature: ");
Serial.println(temperature, 3); // 显示3位小数
delay(1000);
}
串口绘图仪显示如下

