最近我在一个项目中用到了凌鸥的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通信上的表现还是很不错的,库函数易用,代码清晰。通过简单的代码就能实现传感器的数据读取和输出,非常适合快速开发项目。如果大家有类似的需求,希望这篇分享能对你们有所帮助。
欢迎大家交流和讨论!
|