公羊子丹 发表于 2024-10-4 13:37

使用凌鸥LKS MCU实现I2C通信和温湿度传感器数据读取


最近我在一个项目中用到了凌鸥的LKS系列MCU,具体是LKS32MC321。这款MCU支持丰富的外设接口,我这次的任务是通过I2C接口读取一个温湿度传感器的数据,并将数据通过串口输出到PC上。下面分享一下我的实现过程和代码,希望能帮到有需要的朋友。

一、I2C初始化
首先是I2C接口的初始化。LKS MCU的I2C模块非常方便配置,通过HAL库直接调用相关函数即可实现。这里我用到的是HAL_I2C_Init()函数。
#include "LKS32_HAL.h"

I2C_HandleTypeDef hi2c1;

void I2C_Init(void)
{
    hi2c1.Instance = I2C1;
    hi2c1.Init.ClockSpeed = 100000;   // I2C时钟速度设为100kHz
    hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c1.Init.OwnAddress1 = 0;
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

    if (HAL_I2C_Init(&hi2c1) != HAL_OK)
    {
      // 初始化错误处理
      Error_Handler();
    }
}


二、读取温湿度传感器数据
接下来是通过I2C读取温湿度传感器的数据。以常用的SHT30传感器为例,传感器通过I2C地址0x44通信,首先向它发送测量命令,接着读取返回的数据。
#define SHT30_ADDR 0x44 << 1   // SHT30 I2C地址

void Read_Sensor_Data(uint8_t *data)
{
    uint8_t cmd = {0x2C, 0x06};// SHT30测量命令

    // 发送测量命令
    HAL_I2C_Master_Transmit(&hi2c1, SHT30_ADDR, cmd, 2, 100);

    HAL_Delay(500);// 延时等待测量结果

    // 读取传感器返回的数据
    HAL_I2C_Master_Receive(&hi2c1, SHT30_ADDR, data, 6, 100);
}



三、串口输出温湿度数据
最后,将从传感器获取的数据通过串口打印出来。这里同样使用HAL库提供的UART接口,配置好串口后,直接调用打印函数。

UART_HandleTypeDef huart1;

void UART_Init(void)
{
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
   
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
      Error_Handler();
    }
}

void Print_Sensor_Data(uint8_t *data)
{
    // 将原始数据处理为温度和湿度
    uint16_t temp = (data << 8) | data;
    uint16_t hum = (data << 8) | data;

    float temperature = -45 + 175 * ((float)temp / 65535);
    float humidity = 100 * ((float)hum / 65535);

    // 打印温湿度数据
    char buffer;
    sprintf(buffer, "Temperature: %.2f C, Humidity: %.2f%%\r\n", temperature, humidity);
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}


四、主程序流程
在主程序中,首先初始化I2C和UART外设,然后进入循环读取传感器数据并通过串口输出。
int main(void)
{
    HAL_Init();
    I2C_Init();
    UART_Init();

    uint8_t sensor_data;

    while (1)
    {
      Read_Sensor_Data(sensor_data);
      Print_Sensor_Data(sensor_data);
      HAL_Delay(1000);// 每隔1秒读取一次
    }
}


五、总结
凌鸥LKS MCU在I2C和UART通信上的表现还是很不错的,库函数易用,代码清晰。通过简单的代码就能实现传感器的数据读取和输出,非常适合快速开发项目。如果大家有类似的需求,希望这篇分享能对你们有所帮助。
欢迎大家交流和讨论!





周半梅 发表于 2024-10-4 13:39

这个代码挺清晰的,正好我也在用LKS系列,马上试试!

帛灿灿 发表于 2024-10-4 13:40

没想到LKS的应用这么灵活,这段代码对我帮助很大。

童雨竹 发表于 2024-10-4 13:40

请问这个代码能适配其他型号的LKS MCU吗?

万图 发表于 2024-10-4 13:40

太棒了!一直没弄明白的地方,这篇帖子一看就通了。

Wordsworth 发表于 2024-10-4 13:40

我之前还不太懂LKS的定时器配置,这个例子简直太实用了!

Bblythe 发表于 2024-10-4 13:41

能不能再分享一下其他外设的配置代码?学习中,多谢!

Pulitzer 发表于 2024-10-4 13:41

这个LKS的低功耗模式用起来怎么样?代码里有涉及吗?

Uriah 发表于 2024-10-4 13:41

LKS的I2C配置是不是也能像这样简单?希望能多点教程!

Clyde011 发表于 2024-10-4 13:42

谢谢分享,我是刚开始接触凌鸥MCU的,确实有点摸不到头绪,这篇文章帮了我大忙

1289964595 发表于 2025-2-16 00:41

HAL在哪获取的

MYWX 发表于 2025-2-17 14:20

1289964595 发表于 2025-2-16 00:41
HAL在哪获取的

可以通过官网获取库函数
页: [1]
查看完整版本: 使用凌鸥LKS MCU实现I2C通信和温湿度传感器数据读取