要使用 M030G 微控制器的 I2C 接口读取 NCT7712Y 温度传感器数据,遵循以下步骤:
1. 硬件连接
确保正确连接传感器: |
NCT7712Y 引脚 |
M030G 引脚 |
|---|
SDA |
I2Cx_SDA |
SCL |
I2Cx_SCL |
VDD |
3.3V |
GND |
GND |
x 表示使用的 I2C 通道号(如 0)。
- 确保 I2C 总线接上拉电阻(通常 4.7kΩ)。
2. I2C 通信参数
参数 |
值 |
|---|
设备地址 |
0x4C (7-bit) |
寄存器地址 |
温度高位 0x00 |
|
温度低位 0x01 |
I2C 时钟速度 |
≤ 400 kHz |
3. M030G 代码实现
#include "NuMicro.h"
#define NCT7712Y_ADDR 0x98 // 写地址: 0x4C << 1
#define TEMP_HIGH_REG 0x00 // 温度高位寄存器
#define TEMP_LOW_REG 0x01 // 温度低位寄存器
void I2C_Init(void) {
// 启用 I2C0 时钟
CLK_EnableModuleClock(I2C0_MODULE);
// 设置 PB4(SDA0), PB5(SCL0) 为 I2C 功能
SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB4MFP_Msk | SYS_GPB_MFPL_PB5MFP_Msk))
| (SYS_GPB_MFPL_PB4MFP_I2C0_SDA | SYS_GPB_MFPL_PB5MFP_I2C0_SCL);
// 配置 I2C:主机模式,100kHz
I2C_Open(I2C0, 100000);
}
float Read_NCT7712Y(void) {
uint8_t write_data[1];
uint8_t read_data[2];
float temperature = 0.0;
// 步骤 1: 设置指针到温度高位寄存器 (0x00)
write_data[0] = TEMP_HIGH_REG;
I2C_WriteByte(I2C0, NCT7712Y_ADDR, write_data, 1);
// 步骤 2: 读取两个字节(高位 + 低位)
I2C_ReadByte(I2C0, NCT7712Y_ADDR | 0x01, read_data, 2); // 读地址: 0x99
// 组合数据并转换温度
uint16_t temp_raw = ((uint16_t)read_data[0] << 8) | read_data[1];
uint8_t int_part = read_data[0]; // 有符号整数部分
uint8_t frac_part = read_data[1] >> 4; // 小数部分(高4位)
temperature = (float)int_part + (frac_part * 0.0625); // 0.0625 = 1/16
return temperature;
}
int main(void) {
SYS_Init(); // 系统初始化
I2C_Init(); // 初始化 I2C
while(1) {
float temp = Read_NCT7712Y();
printf("Temperature: %.2f°Cn", temp);
CLK_SysTickDelay(2000000); // 延迟2秒
}
}
4. 关键代码解释
- I2C 初始化:
- 启用 I2C0 时钟并配置引脚。
- 设置 I2C 速度为 100 kHz。
- 温度读取流程:
- 写寄存器指针:发送
0x00(温度高位寄存器地址)。
- 读取数据:连续读取 2 字节(温度高位 + 温度低位)。
- 温度转换:
- 整数部分:字节
0(有符号数,最高位为符号位)。
- 小数部分:字节
1 的高 4 位,每单位代表 0.0625°C。
5. 注意事项
- 地址格式:
- I2C 写地址:
0x98(0x4C << 1)。
- I2C 读地址:
0x99。
- 数据格式:
- 温度值可能为负值(整数部分用补码表示)。
- 温度范围:
-40°C 至 +125°C。
- 错误处理:
- 在
I2C_ReadByte/I2C_WriteByte 后检查返回值。
- 如果通信失败,需加入重试逻辑或错误处理。
6. 常见问题
- 无响应:检查硬件连接、I²C 地址是否匹配、上拉电阻是否正常。
- 数据错误:确保 I²C 速率不超过传感器的最大值(400 kHz)。
- 负温度处理:整数部分为有符号 8 位数(
int8_t 类型转换)。
通过上述步骤和代码,即可成功读取 NCT7712Y 的温度数据。
要使用 M030G 微控制器的 I2C 接口读取 NCT7712Y 温度传感器数据,遵循以下步骤:
1. 硬件连接
确保正确连接传感器: |
NCT7712Y 引脚 |
M030G 引脚 |
|---|
SDA |
I2Cx_SDA |
SCL |
I2Cx_SCL |
VDD |
3.3V |
GND |
GND |
x 表示使用的 I2C 通道号(如 0)。
- 确保 I2C 总线接上拉电阻(通常 4.7kΩ)。
2. I2C 通信参数
参数 |
值 |
|---|
设备地址 |
0x4C (7-bit) |
寄存器地址 |
温度高位 0x00 |
|
温度低位 0x01 |
I2C 时钟速度 |
≤ 400 kHz |
3. M030G 代码实现
#include "NuMicro.h"
#define NCT7712Y_ADDR 0x98 // 写地址: 0x4C << 1
#define TEMP_HIGH_REG 0x00 // 温度高位寄存器
#define TEMP_LOW_REG 0x01 // 温度低位寄存器
void I2C_Init(void) {
// 启用 I2C0 时钟
CLK_EnableModuleClock(I2C0_MODULE);
// 设置 PB4(SDA0), PB5(SCL0) 为 I2C 功能
SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB4MFP_Msk | SYS_GPB_MFPL_PB5MFP_Msk))
| (SYS_GPB_MFPL_PB4MFP_I2C0_SDA | SYS_GPB_MFPL_PB5MFP_I2C0_SCL);
// 配置 I2C:主机模式,100kHz
I2C_Open(I2C0, 100000);
}
float Read_NCT7712Y(void) {
uint8_t write_data[1];
uint8_t read_data[2];
float temperature = 0.0;
// 步骤 1: 设置指针到温度高位寄存器 (0x00)
write_data[0] = TEMP_HIGH_REG;
I2C_WriteByte(I2C0, NCT7712Y_ADDR, write_data, 1);
// 步骤 2: 读取两个字节(高位 + 低位)
I2C_ReadByte(I2C0, NCT7712Y_ADDR | 0x01, read_data, 2); // 读地址: 0x99
// 组合数据并转换温度
uint16_t temp_raw = ((uint16_t)read_data[0] << 8) | read_data[1];
uint8_t int_part = read_data[0]; // 有符号整数部分
uint8_t frac_part = read_data[1] >> 4; // 小数部分(高4位)
temperature = (float)int_part + (frac_part * 0.0625); // 0.0625 = 1/16
return temperature;
}
int main(void) {
SYS_Init(); // 系统初始化
I2C_Init(); // 初始化 I2C
while(1) {
float temp = Read_NCT7712Y();
printf("Temperature: %.2f°Cn", temp);
CLK_SysTickDelay(2000000); // 延迟2秒
}
}
4. 关键代码解释
- I2C 初始化:
- 启用 I2C0 时钟并配置引脚。
- 设置 I2C 速度为 100 kHz。
- 温度读取流程:
- 写寄存器指针:发送
0x00(温度高位寄存器地址)。
- 读取数据:连续读取 2 字节(温度高位 + 温度低位)。
- 温度转换:
- 整数部分:字节
0(有符号数,最高位为符号位)。
- 小数部分:字节
1 的高 4 位,每单位代表 0.0625°C。
5. 注意事项
- 地址格式:
- I2C 写地址:
0x98(0x4C << 1)。
- I2C 读地址:
0x99。
- 数据格式:
- 温度值可能为负值(整数部分用补码表示)。
- 温度范围:
-40°C 至 +125°C。
- 错误处理:
- 在
I2C_ReadByte/I2C_WriteByte 后检查返回值。
- 如果通信失败,需加入重试逻辑或错误处理。
6. 常见问题
- 无响应:检查硬件连接、I²C 地址是否匹配、上拉电阻是否正常。
- 数据错误:确保 I²C 速率不超过传感器的最大值(400 kHz)。
- 负温度处理:整数部分为有符号 8 位数(
int8_t 类型转换)。
通过上述步骤和代码,即可成功读取 NCT7712Y 的温度数据。
举报