DE | EN | CN

ESE模块13 I2C 总线

本章节的学习需要一个温度传感器插件Temperatursensor Add-On也是mySTM32 Board Light板的扩展。

现场总线系统在许多微控制器应用中起着重要作用。一方面,这些数字通信通道使智能传感器和执行器成为可能,另一方面,它允许开发人员使用引脚数量相对较少的控制器,并因此保持占用空间较小。I²CI²C Bus 总线支持高数据传输速率,即使在标准模式下,也可以在一个总线上寻址超过100个设备。I²C总线仅需要两根导线,即控制器上的两个引脚。有数千种I²C设备tausende I²C Devices ,涵盖了广泛的应用领域。事实上,几乎每个现代微控制器系列都支持此标准。I²C最初是由飞利浦公司用于设备内部通信,例如电视内部通信而开发的。因此,可以推断出该总线系统并非用于长距离传输,而是设计用于几厘米到几米的距离。在接下来的章节中,您将了解另一种现场总线系统,即CAN总线,该总线可以可靠地传输最少40米,根据特定条件甚至可以达到500米的数据。即使在小型的mySTM32 Board light上,您也会找到这种总线。

开发微控制器应用程序,读取I²C温度传感器,并通过UART将当前温度发送到PC。

解决方案要求:

  • 温度传感器LM75,地址配置0x90
  • 数据传输8位,19200波特
  • 摄氏温度值

srs_i2c.pdf

如果有一个类图已打开,请在该图的上下文菜单(鼠标右键)中选择菜单项“上”。 如果该项目已关闭,请重新打开SiSy UML项目。 进行以下准备工作:

  • 创建一个新的类图
  • 目标语言 ARM C++
  • 目标平台STM32F042 mySTM32板灯HAL
  • 为PEC的应用模板(XMC,STM32,AVR)加载应用程序的基本结构
  • STM32F0分配驱动程序包
  • (可选)分配模板stm32F042_48Mhz

任务是通过I²C总线读取数字温度传感器,然后通过UART将数据发送到PC终端。可以得出用于系统架构设计的专业系统模块。


除其他I²C设备外,还有用于LM75温度传感器Temperatursensor LM75相应的库模块。以下摘自PEC库的类模型,显示了PecLm75块与相应的I²C总线组件PecI2cBus之间的关系。

对于应用在这些构建块中的两项操作对我们很重要。可以使用getTemp()操作读取整数温度(来自传感器的温度数据转换为整数)。传感器本身以0.125°C(第8度)的步长传递温度。此外现代微控制器可以具有多个I²C总线接口。因此必须将设备及其地址分配给特定总线。这是通过操作connect(…)完成的,有两种选择,操作connect(…)可以在设备中或总线中。

可以从学到的知识中得出以下所需的微控制器解决方案的设计图:

用简单的语言,解释设计图:

  • 控制器Controllerstm32F042_48MHz
  • 控制器ControllerSensorBus
  • SensorBus 是一个PecI2CBus
  • Controller控制器有一个终端 Terminal
  • Terminal 终端是PecUart

具体资源的分配必须在实施中进行。

注意:为BUS = DEVICE分配地址

实现应包括上述设计图中描述的元素。 此外还必须分配控制器的专用资源。 完成类模型与下图匹配,清晰地排列元素。

首先必须建立与总线的连接并分配设备地址。 一条总线最多可寻址8个LM75。 附加组件上有一个跳线,用于配置设备地址。确保地址跳线位于附加组件上,
如下所示(全部设置为0 = 0x90):

Controller类的onStart()操作中输入以下代码:

Controller::onStart():void
sensorBus.connect(sensorBus.temperaturSensor,0x90);

数字传感器的当前温度以API级别读出,类似于模拟传感器API-Ebene 的过程。请注意,温度传感器相对较慢。 使用小的等待例程,以便于跟踪终端上的数据。

在Controller类的onWork()操作中写下以下代码:

Controller::onWork():void
temperatur=sensorBus.temperaturSensor.getTemp();
terminal.writeByte(temperatur);
waitMs(10);

这段代码是一个名为 `Controller` 的类中的 `onWork()` 方法。

1. temperatur=sensorBus.temperaturSensor.getTemp();: 这一行代码调用了 `sensorBus` 对象的 `temperaturSensor` 成员的 `getTemp()` 方法,用于获取温度传感器的温度值,并将其存储在名为 `temperatur` 的变量中。

2. terminal.writeByte(temperatur);: 这一行代码调用了名为 `terminal` 的对象的 `writeByte()` 方法,将温度值以字节的形式写入终端或其他输出设备。

3. waitMs(10);: 这一行代码使程序等待10毫秒,可能是为了等待下一个周期的工作开始。

总的来说,这段代码的作用是在 `Controller` 类的 `onWork()` 方法中获取温度传感器的温度值,并将其写入终端或其他输出设备中,然后等待10毫秒,是为了控制程序的执行速度或与其他操作同步。现在可以创建和测试该应用程序。

翻译程序。将可执行程序传送到控制器的程序存储器中。

  • 1. 创建(编译和链接)
  • 2. 烧录
  • 3. 将温度传感器附件连接到mySTM32 Board灯
  • 4. 注意地址跳线的正确位置
  • 5. 使用适当的跳线激活上拉电阻
  • 6. 注意SiSy ControlCenter中的设置

更改应用程序,以便将原始传感器数据(原始值)发送到PC。 为了提高可读性,请将10位原始数据转换为文本。 更改类Controller中onWork()的操作代码:

Controller::onWork():void
uint16_t temp;
temp=sensorBus.temperaturSensor.getRawValue();
String txt;
txt.format("\nRawValue=%d",temp);
terminal.writeString(txt);
waitMs(100);

这段代码是一个名为 `Controller` 的类中的 `onWork()` 方法。

1. uint16_t temp;: 声明一个名为 `temp` 的16位无符号整数变量,用于存储从传感器获取的原始值。

2. temp=sensorBus.temperaturSensor.getRawValue();: 调用了 `sensorBus` 对象的 `temperaturSensor` 成员的 `getRawValue()` 方法,用于获取温度传感器的原始值,并将其存储在名为 `temp` 的变量中。

3. String txt;: 声明一个名为 `txt` 的字符串对象,用于存储格式化后的文本输出。

4. txt.format(“\nRawValue=%d”,temp);: 使用格式化字符串将原始值格式化为字符串,并存储在 `txt` 中,格式为 “\nRawValue=原始值”。`\n` 表示换行符。

5. terminal.writeString(txt);: 调用了名为 `terminal` 的对象的 `writeString()` 方法,将格式化后的文本 `txt` 写入终端或其他输出设备中。

6. waitMs(100);: 这一行代码使程序等待100毫秒,是为了控制程序的执行速度或与其他操作同步。

总的来说,这段代码的作用是在 `Controller` 类的 `onWork()` 方法中获取温度传感器的原始值,并将其写入终端或其他输出设备中,然后等待100毫秒。
创建,传输和测试应用程序, 比较俩种方式。

视频总结

  • 1.创建并打开类图
  • 2.选择PEC应用程序的图模板
  • 3.加载正确的驱动程序包
  • 4.在资源管理器中找到所需的块并将其拖到图中
  • 5.聚合类,构成组件
  • 6.在操作中创建必要的源代码
  • 7.在类图中创建并烧录ARM应用程序

oder die schnelle Version mit Musik

练习 11

使用液晶显示屏显示传感器数据!

继续: