AS6221EvalKit:精度最高的数字温度传感器开发使用
1 硬件介绍
AS6221 是市场上精度最高的数字温度传感器系统(+/- 0.09℃)。它具备完整的数字化系统,可以快速准确的获取测试位置的温度信息,准确的还原温度值并且通过标准I2C接口输出。可实现理想的健康温度监测,或应用于各种恒温场景的温度监控。
● 超高的测量精度±0.09℃(20℃至42℃)
● 超低功耗(6μA@4Hz/0.1μA@Standby)
● 支持电池供电的使用场景
● 支持预警模式,可以灵活设置阈值,实现精确的温度监控高集成化设计,设计灵活
● 集成完整的数字模块,支持标准IIC 通讯模式
● 支持8 组IIC 地址,可以多颗器件系统配合使用小尺寸,使用简单
● 产线完整单体一致性测试,无需标定/ 校准·WLCSP 封装,尺寸:1.5×1.0 mm

1.1 AS6221内部架构
AS6221是完整的高精度数字温度传感器系统。它由一个硅基双极温度传感器模拟前端、一个ADC和一个数字传感器组成,通过IIC通信数字总线与其他设备通讯。器件支持多路IIC地址设定,支持中断预警模式。

2 硬件连接
2.1 开发板选择(PB_03F_kit)
PB_03F_kit开发板的IIC硬件介绍如下:硬件支持2路I2C,可配置MASTER或SLAVE。
硬件TX FIFO 深度8 字节,硬件RX FIFO 深度8字节。
PCLK 时钟等于HCLK,可分频,不建议分频。当系统休眠时,I2C 信息会丢失,唤醒后需要重新配置。
所有可fmux 的 IO 都可以复用为I2C。I2C 使用时需要接上拉电阻,比如2.2 kΩ或4.7 kΩ。
FULLMUX 模式(FULLMUX 是指将GPIO 复用为其他模块引脚):
除TEST_MODE、P16、P17、P1 之外的其他GPIO都支持GPIO FULLMUX 功能,可根据应用GPIO 配置为UART,I2C、PWM 等功能。

2.2 连接方式(IIC通讯模式 / 数据解析)
2.2.1 AS6221 Eval Kit 模块引脚介绍:
Pin符号说明备注

注:不要将引脚5接到VSS,此引脚只用于ALERT功能

2.2.2 I2C地址选择方式:
使用跳线帽设置I2C 的地址,且两个位置的跳线帽不能打开。
配置方式如下所示:

2.2.3 MCU与模块连接方式:
SDA->P33
CLK->P34
ALERT警报功能未使用,不连接。(根据实际情况自行配置)

2.2.4 模块输出数据解析
1. TVAL(0×0 寄存器地址):当前获取的温度值。
2. CONFIG(0×1 寄存器地址):当前配置的相关信息。
3. TLOW(0×2 寄存器地址):温度下限警报值。
4. THIGH(0×3 寄存器地址):温度上限警报值。

➀温度值TVAL数据解析
为获取模块的温度值,需要读取TVAL(0×0 寄存器地址)的值,输出的温度数值为2 字节数据(例:0×b,0×22)
LSB = (1 / 128)℃ = 0.0078125 ℃
实际数值=读取到的数值* LSB = 2850(0×b22[hex]) * LSB ≈ 22.265 ℃

➁配置CONFIG数据解析
例:获取的数据为0×40,0×20;即0100 0000 0010 0000。
根据下表,可知每位代表的含义,以及是否可修改相关属性;


➂TLOW / THIGHT数据解析
例:TLOW获取的值为0×25,0×80;即75℃。THIGHT获取的值为0×28 0×00;即80℃
若要使用TLOW,THIGHT;需配置ALERT中断引脚,相关转换过程如下。

3 代码编写
修改跳线帽位置使从机(模块)I2C 地址如“上图”的第一种方式(0×44)
主要代码如下:
i2c_demo.c 代码如下:
view plaincopy to clipboardprint?
1. #include “OSAL.h”
2. #include “i2c_demo.h”
3. #include “log.h”
4.
5. #include “gpio.h”
6. #include “clock.h”
7.
8. #include “pwrmgr.h”
9. #include “error.h”
10. #include “key.h”
11.
12. #include “fl ash.h”
13. #include “i2c.h”
14.
15.
16. #include “pwrmgr.h”
17. #include “error.h”
18.
19.
20. #define I2C_MASTER_SDA P33
21. #define I2C_MASTER_CLK P34
22.
23. #define slave_i2c_addr 0x44 // 从机设备地址
24. #define Tval_ADDR 0 // 温度寄存器的地址
25. #define Config_ADDR 1
26. #define Tlow_ADDR 2
27. #define Thight_ADDR 3
28.
29. static void* master_pi2c;
30. static uint8_t i2c_TaskID;
31.
32. #define I2C_MASTER_RX_DATA_LEN 2
33.
34. uint8 I2C_RX_data[I2C_MASTER_RX_DATA_LEN]= {0}; // 接收温度数据
35. uint8 I2C_Config_data[I2C_MASTER_RX_DATA_LEN]= {0};
36. uint8 I2C_Tlow_data[I2C_MASTER_RX_DATA_LEN]= {0};
37. uint8 I2C_Thight_data[I2C_MASTER_RX_DATA_LEN]= {0};
38.
39. // 从I2C 从设备读取数据
40. static int I2CRead(void* pi2c, uint8* data,uint8 len,uint8 slave_addr,uint8 Addr)
41. {
42. int ret ;
43. ret=hal_i2c_read(pi2c,slave_addr,Addr,data,len);
44.
45. return ret;
46. }
47.
48. // 初始化I2C
49. void I2c_Demo_Init(uint8 task_id)
50. {
51. i2c_TaskID = task_id;
52. LOG(“i2c demo start...rn”);
53. // 初始化SDA CLK 相关引脚(Input / 上拉)
54. hal_gpio_pin_init(I2C_MASTER_SDA,IE);
55. hal_gpio_pin_init(I2C_MASTER_CLK,IE);
56. hal_gpio_pull_set(I2C_MASTER_SDA,STRONG_PULL_UP);
57. hal_gpio_pull_set(I2C_MASTER_CLK,STRONG_PULL_UP);
58. hal_i2c_pin_init(I2C_0, I2C_MASTER_SDA, I2C_MASTER_CLK); // 开启硬件I2C_0
59. master_pi2c=hal_i2c_init(I2C_0,I2C_CLOCK_400K);
60.
61. if(master_pi2c==NULL)
62. {
63. LOG(“I2C master init failrn”);
64. }
65. else
66. {
67. LOG(“I2C master init OKrn”);
68. }
69. osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 10);
70. }
71.
72. // 任务进程
73. uint16 I2c_ProcessEvent( uint8 task_id, uint16events )
74. {
75. if(task_id != i2c_TaskID)
76. {
77. return 0;
78. }
79.
80. if( events & KEY_I2C_READ_DATA_EVT)
81. {
82. uint8_t Tval,Config,Tlow,Thight;
83.
84. // 将获取到的数据,保存到相关数组中
85. Tval = I2CRead(master_pi2c,I2C_RX_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tval_ADDR);
86. Config = I2CRead(master_pi2c,I2C_Config_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Config_ADDR);
87. Tlow = I2CRead(master_pi2c,I2C_Tlow_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tlow_ADDR);
88. Thight = I2CRead(master_pi2c,I2C_Thight_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Thight_ADDR);
89.
90.
91. if(Tval==PPlus_SUCCESS)
92. {
93. LOG(“I2C_Tval_data=[“);
94.
95. for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)
96. {
97. LOG(“0x%x,”,I2C_RX_data[i]);
98. }
99.
100. LOG(“]rn”);
101.
102.
103. LOG(“I2C_Config_data=[“);
104.
105. for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)
106. {
107. LOG(“0x%x,”,I2C_Config_data[i]);
108. }
109.
110. LOG(“]rn”);
111.
112. LOG(“I2C_Tlow_data=[“);
113.
114. for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)
115. {
116. LOG(“0x%x,”,I2C_Tlow_data[i]);
117. }
118.
119. LOG(“]rn”);
120.
121.
122. LOG(“I2C_Thight_data=[“);
123.
124. for(uint8 i=0; i<I2C_MASTER_RX_DATA_LEN; i++)
125. {
126. LOG(“0x%x,”,I2C_Thight_data[i]);
127. }
128.
129. LOG(“]rn”);
130.
131. //1000ms 获取一次数据
132. osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 1000);
133. }
134.
135. return (events ^ KEY_I2C_READ_DATA_EVT);
136. }
137.
138. LOG(“NO Datarn”);
139.
140. return 0;
141. }
3.1 获取的各个寄存器的原始数据,如下图所示

3.2 对数据进行处理,并输出
view plaincopy to clipboardprint?
1.数据处理后的相关代码:
2.
3. if( events & KEY_I2C_READ_DATA_EVT)
4. {
5. uint8_t Tval;
6.
7. // 将获取到的数据,保存到相关数组中
8. Tval = I2CRead(master_pi2c,I2C_RX_data,I2C_MASTER_RX_DATA_LEN,slave_i2c_addr,Tval_ADDR);
9.
10. if(Tval==PPlus_SUCCESS)
11. {
12.
13. // 转换后的数据
14. char Rx[4];
15. sprintf(Rx,”%02x%02x”,I2C_RX_data[0],I2C_RX_data[1]);
16. char *endptr;
17. long int Data = strtol(Rx, &endptr, 16);
18. double T = (double)Data * 0.0078125;
19.
20. usart_printf(“T = %.3frn”,T); // 串口输出温度数据
21.
22. //500ms 获取一次数据
23. osal_start_timerEx(i2c_TaskID, KEY_I2C_READ_DATA_EVT, 500);
24. }
25.
26. return (events ^ KEY_I2C_READ_DATA_EVT);
27. }
28.
29. return 0;
30. }
31.
32.
33. 部分代码的实现:
34.
35. #include <stdarg.h>
36.
37. void usart_printf(char *format,...)
38. {
39. char String[100]; // 定义输出字符串
40. va_list arg; // 定义一个参数列表变量va_list 是一个类型名,arg 是变量名
41. va_start(arg,format); / / 从format 位置开始接收参数表放在arg 里面
42.
43. //sprintf 打印位置是String,格式化字符串是format,参数表是arg,对于封装格式sprintf要改成vsprintf
44. vsprintf(String,format,arg);
45.
46. va_end(arg); // 释放参数表
47. hal_uart_send_buff (UART0, (uint8_t*)String,strlen(String)); //uart.c 的函数
48.
49. }
输出当前室内温度数据:

当手紧握模块时,温度迅速上升:

(本文来源于《EEPW》202509)












评论