woshi_ziyu
发表于: 2021-8-9 15:05:54 | 显示全部楼层

在本篇文章中,我们将使用STM8S控制器通过I2C通信连接MLX90614传感器,测量环境温度以及某个物体的温度,然后在LCD液晶屏上显示测量的温度。


所需的组件

●    STM8S103F3P6开发板

●    ST-Link V2编程器

●    1602液晶显示屏

●    电位器

●    连接线

●    1k电阻

●    MLX90614传感器模块

●    逻辑分析仪


MLX90614与STM8S控制器连接的电路图

下图显示了MLX90614传感器和LCD与STM8S的连接图。这个原理图与我们之前帖子中介绍的STM8S LCD教程非常相似。将传感器的SDA和SCL引脚与STM8S103F3P6开发板的SDA (PB5) 和 SCL(PB4) 引脚连接起来,然后使用5V为传感器和LCD供电。请注意,我们需要使用USB连接器为STM8S103F3P6开发板供电,以便该板为传感器和LCD提供5V电源。

Interface-MLX90614-and-LCD-with-STM8S.jpg


STM8S103F3P6开发上的I2C代码

我们将使用Cosmic C编译器和SPL库。但是我编写了另一个头文件stm8s103_i2c.h,它对于在STM8S上执行I2C通信非常有用。


完成项目工作区的设置后,您应该拥有以下头文件,我在下图中用红色圆圈标记了这些头文件。

I2C-On-STM8S103F3P6_0.jpg


请注意,在本文中我们不介绍 I2C的基础理论,将讨论在“stm8s103_i2c.h”头文件中创建的函数。然后我们将使用逻辑分析仪详细查看I2C通信的工作情况。


在“stm8s103_i2c.h”头文件中包含 I2C_Setup() 函数。您可以使用此设置函数初始化I2C。 CLK_GetClockFreq() 函数用于获取CPU时钟。它可以在“stm8s_clk.h”头文件中找到。 I2C_Init() 函数在“stm8s_i2c.h”文件中定义。您可以使用该函数初始化I2C协议。该函数采用一些默认参数。您可以右键单击该函数,然后选择“Go to Definition of I2C_Init”选项。它会将您重定向到定义函数的特定目的地。

  1. void I2C_Setup(void)
  2. {
  3.                 u8 Input_Clock = 0;
  4.    Input_Clock = CLK_GetClockFreq()/1000000;
  5.   I2C_Init(I2C_Speed, MLX90614_I2CADDR, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, Input_Clock);
  6. }
复制代码

然后我们还编写了I2C_ByteWrite() 函数,它允许从寄存器上写入数据。该函数将采用两个参数。 I2C_Slave_Address 是要写入数据的寄存器地址。而 iData 就是要写入目标寄存器的数据。 I2C_GenerateSTART() 用于启动 I2C。 I2C_Send7bitAddress() 函数用于发送从机的7位地址。

  1. void I2C_ByteWrite (u8 I2C_Slave_Address, u8 iData)
  2. {
  3.                 I2C_GenerateSTART(ENABLE);
  4.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  5.                 I2C_Send7bitAddress(I2C_Slave_Address, I2C_DIRECTION_TX);
  6.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  7.                 I2C_SendData(iData);
  8.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  9.                 I2C_GenerateSTOP(ENABLE);
  10. }
复制代码

I2C_ByteRead() 函数用于通过使用特定寄存器地址读取值。您可以参考I2C设备的数据手册来获取寄存器的地址。但是您需要提供读取任何I2C设备的指令位,这可以通过在该 I2C 设备的 7 位设备地址上加“1”来完成。在本例中,设备地址是“0x5A”,但在“stm8s_i2c.h”头文件的顶部,我定义了一个地址为“0xB5”的“MLX90614_I2CADDR”宏。这表示具有额外读取位(即“1”位)的设备地址。环境温度的寄存器地址为“0x06”,定义为宏“MLX90614_TA”。而宏“MLX90614_TOBJ1”代表对象温度的寄存器地址“0x07”。我们将使用这个宏作为“I2C_ByteRead()”函数中的“ReadAddr”参数。 I2C_ReceiveData() 函数用于接收数据,数据将通过 pBuffer 变量中的 I2C_ByteRead() 函数返回。

  1. u8 I2C_ByteRead(uint8_t I2C_Slave_Address, uint8_t ReadAddr)
  2. {
  3.                 u16 pBuffer;
  4.                 while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  5.                 I2C_GenerateSTART(ENABLE);
  6.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  7.                 I2C_Send7bitAddress(I2C_Slave_Address, I2C_DIRECTION_TX);
  8.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  9.                 I2C_SendData((u8)(ReadAddr));
  10.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  11.                 I2C_GenerateSTART(ENABLE);
  12.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  13.                 I2C_Send7bitAddress(I2C_Slave_Address, I2C_DIRECTION_RX);
  14.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  15.                 while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
  16.                 pBuffer = I2C_ReceiveData();
  17.                 I2C_AcknowledgeConfig(I2C_ACK_NONE);
  18.                 I2C_GenerateSTOP(ENABLE);
  19.                 return pBuffer;
  20. }
复制代码

在“main.c”文件中,我们编写了ReadTemperature(uint8_t a) 函数。它将获取从设备的目标寄存器地址,并返回从设备的测量值。在本例中,地址已经在“MLX90614_TA”和“MLX90614_TOBJ1”宏中定义。 “MLX90614_Read()”函数将打印环境温度和物体的温度值。

  1. uint16_t readTemperature(uint8_t a) {
  2.    uint16_t res;
  3.   res = I2C_ByteRead(MLX90614_I2CADDR, a);
  4.   return res;
  5. }
  6. void MLX90614_Read(void)
  7. {
  8.                                 uint16_t               temperature1;
  9.                                 uint16_t               temperature2;
  10.                                 temperature1 = readTemperature(MLX90614_TA);
  11.                                 delay_ms(20);
  12. temperature2 = readTemperature(MLX90614_TOBJ1);
  13.                                 Lcd_Set_Cursor(1,10);
  14.                                 LCD_Print_Int(temperature1);
  15.                                 Lcd_Set_Cursor(2,10);
  16.                                 LCD_Print_Int(temperature2);
  17.                                 delay_ms(2000);
  18. }
复制代码

在“main()”函数中,首先对GPIO引脚和I2C进行了反向初始化。然后可以找到在“stm8s103_i2c.h”头文件中声明的“I2C_Setup()”函数。有一些基本的LCD命令来初始化LCD和擦除LCD的屏幕。然后在while循环中,调用了MLX90614_Read()函数之后延迟了4秒。

  1. main()
  2. {
  3.                 /* Deinitializing the GPIOs and I2C */
  4.                 GPIO_DeInit(GPIOA);
  5.                 GPIO_DeInit(GPIOB);
  6.                 GPIO_DeInit(GPIOD);
  7.                 I2C_DeInit();              
  8. /* Initializing the I2C */
  9. I2C_Setup();
  10.                 /* Initializing te LCD */
  11.   Lcd_Begin();
  12.                 Lcd_Clear();
  13.                 Lcd_Set_Cursor(1,1);
  14.                 Lcd_Print_String("Initializing");
  15.                 Lcd_Set_Cursor(2,1);
  16.                 Lcd_Print_String("Wait...");
  17.                 delay_ms(1000);                             
  18.                                 Lcd_Clear();
  19.                                 Lcd_Set_Cursor(1,1);
  20.                                 Lcd_Print_String("Ambient:      F");
  21.                                 Lcd_Set_Cursor(2,1);
  22.                                 Lcd_Print_String("Object :      F");
  23.                                 delay_ms(100);                              
  24.                 while (1){
  25.                                                 MLX90614_Read();
  26.                                                 delay_ms(4000);
  27.                 }                              
  28. }
复制代码

跳转到指定楼层
woshi_ziyu
发表于: 2021-8-9 15:28:20 | 显示全部楼层

使用逻辑分析仪监控I2C通信

逻辑分析仪可以捕获和显示来自数字系统或数字电路的多个信号。我们将使用USB逻辑分析仪来分析I2C数据。 USB逻辑分析仪的连接非常简单。您可以参考以下框图将USB逻辑分析仪与I2C设备连接,以查看该设备的I2C数据。

Connecting-Logic-Analyzer-with-STM8S.png


如上图所示,您需要将I2C设备的SDA和SCL引脚与逻辑分析仪的任意两个通道连接起来。并且接地引脚需要连接到I2C设备的接地引脚。您可以参考上面示意图中的红色圆圈区域。


互联网上有很多有趣的逻辑软件来可视化来自逻辑分析仪的数据。本文中使用了“Saleae Logic”软件。你需要安装这个软件。当您打开Logic软件时,您会看到一个带有一些说明的灰色框,说明您需要将USB逻辑分析仪连接到您的笔记本电脑。因此,将逻辑分析仪与USB端口连接。当您将逻辑分析仪连接到笔记本电脑时,您将能够看到窗口左侧打开了一些通道。当您将逻辑分析仪连接到笔记本电脑时,您可以参考第二张图片。

Saleae-Logic-Software.png

Saleae-Logic-Software-Tutorial.png


下图中红色标记区域代表逻辑分析仪的菜单部分。您可以使用绿色播放按钮启动分析仪。我们在播放按钮下有一个设备设置、分析器、定时标记和测量以及一个扩展按钮。

Logic-Analyzer-Software-from-Saleae.png


您需要单击“Extension”按钮,然后搜索名为“I2C 8-bit Address Display”的扩展插件并安装此扩展。安装此扩展后,它将显示在扩展部分中。

Analyze-I2C-Data.png


然后您需要转到设备设置,您将看到如下图所示的窗口。您需要设置计时器,本文将计时器设置为15秒。这表示着当我们单击“播放”按钮时,分析​​仪将读取15秒的读数。

I2C-Communication.png


完成设备设置后,您需要通过单击设备设置按钮下的分析器按钮进入分析器部分。下面给出的图像指的是分析器部分。当您第一次打开它时,此部分对您来说是空的。您需要单击分析器部分右上角的“加号”。

I2C-Data-Analyzer.png


此后,您将看到一个搜索窗口,如下图所示。选择“I2C”,然后再次单击“加号”并选择““I2C 8-bit Address Display”,这是您之前已经安装的扩展。现在,我们已准备好使用逻辑软件和USB逻辑分析仪。因此,连接逻辑分析仪并将STM8S开发板连接到另一个USB端口。当您连接逻辑分析仪和STM8S开发板时,您会看到LCD显示环境温度和物体温度。但是您需要按下Logic软件上的 Play 按钮,然后按下STM8S开发板上的复位按钮。现在,您可以看到逻辑分析仪读取I2C数据。现在,等待15秒。

I2C-Communication-on-STM8S.png


15 秒后,您可以看到一些输出,如上图所示。红圈表示I2C通信。双击放大该部分。当您放大此部分时,您将获得一些脉冲数据,如下图所示。

I2C-on-STM8S.png


在上图中,用彩色圆圈突出显示了一些部分,以便您可以轻松了解如何使用逻辑分析仪读取数据。粉红色圆圈指的是 I2C 设备地址(即 0x5A),其中“W”代表写模式,“R”代表读模式。然后蓝色圆圈表示目标寄存器地址。目标寄存器是环境温度的“0x06”和物体温度的“0x07”。绿色和红色圆圈表示我们从目标寄存器接收到的数据。抓拍的图像中,环境温度数据为“0x48”,物体温度数据为“0x55”。您需要将此十六进制数据转换为十进制值。您可以将此十六进制数据与 LCD 上显示的十进制值进行交叉检查。


STM8S的I2C输出并在LCD上显示

在下图中,LCD按我们的预期显示输出。 您可以看到,当我们启动系统时,LCD 显示字符串“Initializing wait ...”。 然后它会在1秒后显示环境和物体的测量温度。

I2C-on-STM8S-Board.jpg


如果您有任何问题,请随时在本帖下面进行回复。

如果你能看到我的世界里那些渐渐消逝的美好,你就能体会到现在所拥有的幸福。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 12 | 回复: 16



手机版|

GMT+8, 2024-4-25 17:31 , Processed in 0.082758 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表