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