回答

收藏

[评测分享] 【RISC-V 沁恒微-CH585M-R1开发板试用体验】6. I2C总线测试

#板卡评测 #板卡评测 669 人阅读 | 0 人回复 | 2025-06-29

本帖最后由 stm1024 于 2025-6-30 00:06 编辑

I2C总线应该是嵌入式开发中芯片之间相互通讯很常见的一种总线,最开始由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。
今天测试一下I2C总线的通讯,本次进行通讯的设备是AHT11,是一个很小巧的温湿度传感器。

1. 硬件连接
设备端没啥好说的,就4根线,电源正负极,然后就是SCL和SDA,开发板的I2C总线选哪个呢?看schematic,SCL和SDA分别对应了开发板上的PB13和PB12,直接和设备之间进行连接:



2. 软件环境
CH585的库中I2C头文件及源文件仅提供了基本的定义和函数,但是在测试样例中,还提供了应用级别的头文件和源文件,亦即app_i2c.h和app_i2c.c,拿来吧你。
然后就是我们的代码:
贴个代码:
  1. #include "CH58x_common.h"

  2. #include "app_i2c.h"
  3. uint8_t TxBuff[100];
  4. #define SIZE            6
  5. #define MASTER_ADDR     0x66
  6. #define AHT11      0x38 //AHT11的地址
  7. uint8_t TxData[]={0xac,0x33,0x00};//AHT11读取数据的命令
  8. uint8_t RxData[SIZE];

  9. void i2c_config()
  10. {
  11.     //配置i2c
  12.     GPIOB_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13, GPIO_ModeIN_PU);
  13.     I2C_Init(
  14.         I2C_Mode_I2C,
  15.         400000,
  16.         I2C_DutyCycle_16_9,
  17.         I2C_Ack_Enable,
  18.         I2C_AckAddr_7bit,
  19.         MASTER_ADDR);
  20.     // while(I2C_GetFlagStatus(I2C_FLAG_BUSY) != RESET);
  21.     // I2C_GenerateSTART(ENABLE);
  22.     // while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  23.     // I2C_Send7bitAddress(0x70, I2C_Direction_Transmitter);
  24.     // while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  
  25.     // I2C_SendData(0x00);
  26.     // while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  27.     // I2C_GenerateSTOP(ENABLE);
  28.     DelayMs(100);
  29.     i2c_app_init(MASTER_ADDR);
  30. }

  31. void uart1_config()
  32. {
  33.     //配置串口1   
  34.     GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
  35.     GPIOA_SetBits(GPIO_Pin_9);
  36.     GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
  37.     UART1_DefInit();
  38. }

  39. int main()
  40. {
  41.     float humidity,temperature;
  42.     int ret;
  43.     HSECFG_Capacitance(HSECap_18p);
  44.     SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
  45.    
  46.     uart1_config();
  47.     memset(TxBuff,0x00,100);
  48.     sprintf((char*)TxBuff,"CH585M IIC Test\n");
  49.     UART1_SendString(TxBuff, strlen((const char *)TxBuff));
  50.    
  51.     i2c_config();
  52.    
  53.     while(1)
  54.     {      
  55.         ret = i2c_write_to(AHT11, TxData, sizeof(TxData), true, true);
  56.         // memset(TxBuff,0x00,100);
  57.         // sprintf((char*)TxBuff,"write to %#x %s\n",AHT11, ret ? "failed" : "success");
  58.         // UART1_SendString(TxBuff, strlen((const char *)TxBuff));
  59.         DelayMs(100);
  60.         ret = i2c_read_from(AHT11, RxData, 6, true, 1000);
  61.         // memset(TxBuff,0x00,100);
  62.         // sprintf((char*)TxBuff,"read %d byte(s) from %#x\n", ret, AHT11);
  63.         // UART1_SendString(TxBuff, strlen((const char *)TxBuff));
  64.         DelayMs(100);
  65.         //parser raw data
  66.         humidity=(RxData[1]<<12)+(RxData[2]<<4)+(RxData[3]>>4);
  67.         humidity=humidity/1024/1024*100;
  68.         temperature=((RxData[3] & 0x0f)<<16)+(RxData[4]<<8)+RxData[5];
  69.         temperature=temperature/1024/1024*200-50;
  70.         
  71.         memset(TxBuff,0x00,100);
  72.         sprintf((char*)TxBuff,"H=%5.2f%% T=%5.2f℃\n",humidity,temperature);
  73.         UART1_SendString(TxBuff, strlen((const char *)TxBuff));
  74.         DelayMs(800);
  75.     }
  76.     return 0;
  77. }

  78. /*

  79. uint8_t TxBuff[100];
  80. uint8_t cycle=0;
  81. void uart1_config()
  82. {
  83.     //配置串口1   
  84.     GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);// RXD-上拉输入
  85.     GPIOA_SetBits(GPIO_Pin_9);
  86.     GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-推挽输出,注意先让IO口输出高电平
  87.     UART1_DefInit();
  88. }
  89. */

  90. /*
  91.     uart1_config();
  92.     memset(TxBuff,0x00,100);
  93.     sprintf(TxBuff,"CH585M Basic PWM Test, FREQ_SYS=%ld\n",FREQ_SYS);
  94.     UART1_SendString(TxBuff, strlen(TxBuff));
  95. */
复制代码


接下来就是简单的编译,下载,运行效果如下:
对了,如果不能正常显示浮点数,则应该在工程选项中打开浮点数支持,然后清理工程,完全重新编译一下:
之后再下载。

不得不说,mounriver studio这个集成做的还是可以的,尤其是和WCH-link组合使用,调试下载,串口打印都能一口气搞定。
好了,今日关于I2C的评测就是这样。



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

5300 积分
55 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条