新唐MCU技术
直播中

李鑫

8年用户 1418经验值
私信 关注
[问答]

如何使用 M030G I2C 读取NCT7712Y热传感器?


  • 使用 M030G I2C 读取NCT7712Y热传感器

回帖(1)

陈利妮

2025-8-25 17:16:39

要使用 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。


  • 温度读取流程

    1. 写寄存器指针:发送 0x00(温度高位寄存器地址)。

    2. 读取数据:连续读取 2 字节(温度高位 + 温度低位)。

    3. 温度转换

      • 整数部分:字节 0(有符号数,最高位为符号位)。

      • 小数部分:字节 1 的高 4 位,每单位代表 0.0625°C。






5. 注意事项



  1. 地址格式

    • I2C 写地址:0x980x4C << 1)。

    • I2C 读地址:0x99


  2. 数据格式

    • 温度值可能为负值(整数部分用补码表示)。

    • 温度范围:-40°C+125°C


  3. 错误处理

    • I2C_ReadByte/I2C_WriteByte 后检查返回值。

    • 如果通信失败,需加入重试逻辑或错误处理。





6. 常见问题



  • 无响应:检查硬件连接、I²C 地址是否匹配、上拉电阻是否正常。

  • 数据错误:确保 I²C 速率不超过传感器的最大值(400 kHz)。

  • 负温度处理:整数部分为有符号 8 位数(int8_t 类型转换)。


通过上述步骤和代码,即可成功读取 NCT7712Y 的温度数据。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分