打印
[LKS32 软件]

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

[复制链接]
1070|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
公羊子丹|  楼主 | 2024-10-4 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近我在一个项目中用到了凌鸥的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[2] = {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[0] << 8) | data[1];
    uint16_t hum = (data[3] << 8) | data[4];

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

    // 打印温湿度数据
    char buffer[50];
    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[6];

    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吗?

使用特权

评论回复
5
万图| | 2024-10-4 13:40 | 只看该作者
太棒了!一直没弄明白的地方,这篇帖子一看就通了。

使用特权

评论回复
6
Wordsworth| | 2024-10-4 13:40 | 只看该作者
我之前还不太懂LKS的定时器配置,这个例子简直太实用了!

使用特权

评论回复
7
Bblythe| | 2024-10-4 13:41 | 只看该作者
能不能再分享一下其他外设的配置代码?学习中,多谢!

使用特权

评论回复
8
Pulitzer| | 2024-10-4 13:41 | 只看该作者
这个LKS的低功耗模式用起来怎么样?代码里有涉及吗?

使用特权

评论回复
9
Uriah| | 2024-10-4 13:41 | 只看该作者
LKS的I2C配置是不是也能像这样简单?希望能多点教程!

使用特权

评论回复
10
Clyde011| | 2024-10-4 13:42 | 只看该作者
谢谢分享,我是刚开始接触凌鸥MCU的,确实有点摸不到头绪,这篇文章帮了我大忙

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

4118

帖子

1

粉丝