[其它应用] 基于中颖MCU的I2C通信实现及代码示例

[复制链接]
3037|9
 楼主| 公羊子丹 发表于 2024-10-4 17:20 | 显示全部楼层 |阅读模式
最近我在用中颖的MCU开发一个传感器读取的项目,主要涉及到I2C通信的实现。中颖MCU在I2C通信上有不错的支持,配置起来也比较简单。今天我就分享一下这个过程中遇到的问题和解决方案,并提供一个代码示例,供大家参考。

I2C通信的简介
I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,适用于短距离设备间的通信。它使用两个线(SDA和SCL)进行数据传输,主设备可以通过I2C总线与多个从设备进行通信。在我的项目中,我用中颖MCU作为主控,连接了一颗温湿度传感器进行数据读取。

硬件连接
  • SDA(数据线)连接主控MCU的I2C数据引脚。
  • SCL(时钟线)连接MCU的I2C时钟引脚。
  • 电源和地线正常接线即可。

I2C代码示例
这里的代码示例主要演示如何使用中颖MCU的I2C模块与传感器进行通信,读取温湿度数据。

  1. #include "i2c.h"
  2. #include "gpio.h"

  3. // I2C初始化
  4. void I2C_Init(void)
  5. {
  6.     // 设置I2C时钟,初始化SDA和SCL引脚
  7.     I2C_ConfigClock();
  8.     I2C_Enable();
  9. }

  10. // I2C写操作
  11. void I2C_Write(uint8_t deviceAddr, uint8_t registerAddr, uint8_t data)
  12. {
  13.     I2C_Start();
  14.     I2C_SendByte(deviceAddr);    // 发送设备地址
  15.     I2C_WaitAck();
  16.     I2C_SendByte(registerAddr);  // 发送寄存器地址
  17.     I2C_WaitAck();
  18.     I2C_SendByte(data);          // 发送数据
  19.     I2C_WaitAck();
  20.     I2C_Stop();
  21. }

  22. // I2C读操作
  23. uint8_t I2C_Read(uint8_t deviceAddr, uint8_t registerAddr)
  24. {
  25.     uint8_t data;

  26.     I2C_Start();
  27.     I2C_SendByte(deviceAddr);    // 发送设备地址
  28.     I2C_WaitAck();
  29.     I2C_SendByte(registerAddr);  // 发送寄存器地址
  30.     I2C_WaitAck();
  31.    
  32.     I2C_Start();                 // 重新启动信号
  33.     I2C_SendByte(deviceAddr | 0x01); // 发送读操作
  34.     I2C_WaitAck();
  35.    
  36.     data = I2C_ReadByte();        // 读取数据
  37.     I2C_SendNAck();
  38.     I2C_Stop();

  39.     return data;
  40. }

  41. int main(void)
  42. {
  43.     uint8_t temperature;
  44.     I2C_Init();  // 初始化I2C

  45.     // 读取温度寄存器的数据
  46.     temperature = I2C_Read(0x48, 0x00);  // 假设设备地址为0x48,寄存器地址为0x00

  47.     // 进行相应的处理,比如通过串口输出数据
  48.     printf("Current Temperature: %d°C\n", temperature);

  49.     while(1)
  50.     {
  51.         // 主循环
  52.     }
  53. }

代码说明:
  • I2C_Init:初始化I2C外设,配置SCL和SDA引脚。
  • I2C_Write:向从设备的指定寄存器写入数据。
  • I2C_Read:从从设备的指定寄存器读取数据。
  • main:在主函数中,初始化I2C,并通过读取温度传感器的数据进行处理。

总结
通过中颖MCU的I2C模块,我们可以方便地与外部传感器进行通信。代码中展示了如何通过I2C与设备进行读写操作,结合实际硬件可以实现更多的功能。
希望这个分享能帮助到大家,如果有问题,欢迎一起讨论!

周半梅 发表于 2024-10-4 17:21 | 显示全部楼层
这代码写得挺清楚的,我正好也在搞I2C,准备试试这个方法。感谢分享!
帛灿灿 发表于 2024-10-4 17:21 | 显示全部楼层
中颖的MCU我还没用过,感觉看起来挺好上手的,有机会我也试试!
童雨竹 发表于 2024-10-4 17:21 | 显示全部楼层
刚好手头有个温湿度传感器没用呢,用你的代码应该能马上搞定,太赞了!
万图 发表于 2024-10-4 17:21 | 显示全部楼层
我之前写I2C通信的时候卡了好久,没想到这么简单的思路,受教了!
Wordsworth 发表于 2024-10-4 17:22 | 显示全部楼层
你这个I2C代码封装得挺好,我可以直接拿来用,不用再自己折腾了,哈哈。
Bblythe 发表于 2024-10-4 17:22 | 显示全部楼层
一直听说中颖的MCU不错,这次看了你的代码,感觉确实挺实用的!
Pulitzer 发表于 2024-10-4 17:22 | 显示全部楼层
老哥,I2C通信有时候不稳定,你这个方案跑久了会不会遇到问题?
Uriah 发表于 2024-10-4 17:22 | 显示全部楼层
还以为I2C挺复杂的,原来只要几个步骤就能搞定,感谢详细代码!
Clyde011 发表于 2024-10-4 17:23 | 显示全部楼层
之前用其他MCU搞I2C有点折腾,没想到中颖的还挺友好,代码也简洁!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

216

主题

6710

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部