使用凌鸥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通信上的表现还是很不错的,库函数易用,代码清晰。通过简单的代码就能实现传感器的数据读取和输出,非常适合快速开发项目。如果大家有类似的需求,希望这篇分享能对你们有所帮助。
欢迎大家交流和讨论!
这个代码挺清晰的,正好我也在用LKS系列,马上试试! 没想到LKS的应用这么灵活,这段代码对我帮助很大。 请问这个代码能适配其他型号的LKS MCU吗? 太棒了!一直没弄明白的地方,这篇帖子一看就通了。 我之前还不太懂LKS的定时器配置,这个例子简直太实用了! 能不能再分享一下其他外设的配置代码?学习中,多谢! 这个LKS的低功耗模式用起来怎么样?代码里有涉及吗? LKS的I2C配置是不是也能像这样简单?希望能多点教程! 谢谢分享,我是刚开始接触凌鸥MCU的,确实有点摸不到头绪,这篇文章帮了我大忙 HAL在哪获取的 1289964595 发表于 2025-2-16 00:41
HAL在哪获取的
可以通过官网获取库函数
页:
[1]