- STM32F103C8 I2C概述
- STM32F103C8中的I2C引脚
- Arduino中的I2C引脚
- 所需组件
- 电路图和连接
- STM32中的I2C编程
- STM32主编程说明
- 从Arduino编程说明
在之前的教程中,我们了解了两个Arduino板之间的SPI和I2C通信。在本教程中,我们将用STM32F103C8的Blue Pill板替换一块Arduino板,并将使用I2C总线与Arduino板通信。
STM32具有比Arduino开发板更多的功能。因此,通过使用SPI和I2C总线来了解STM32与Arduino之间的通信将非常有用。在本教程中,我们将使用I2C总线在Arduino和STM32F103C8之间进行通信,并在下一教程中学习SPI总线。要了解有关STM32板的更多信息,请检查其他STM32项目。
STM32F103C8 I2C概述
将STM32F103C8蓝色药丸板中的I2C(内部集成电路)与Arduino Uno进行比较,然后我们将看到Arduino中具有ATMEGA328微控制器,而STM32F103C8中具有ARM Cortex-M3。STM32有两个I2C总线,而Arduino Uno只有一个I2C总线,而STM32比Arduino更快。
要了解有关I2C通信的更多信息,请参阅我们以前的文章
- 如何在Arduino中使用I2C:两个Arduino板之间的通信
- 与PIC单片机PIC16F877的I2C通信
- 使用I2C将16X2 LCD与ESP32接口
- 与MSP430启动板的I2C通信
- 在不使用I2C的情况下将LCD与NodeMCU接口
- 如何在arduino的单个程序中处理多重通信(I2C SPI UART)
STM32F103C8中的I2C引脚
SDA: PB7或PB9,PB11。
SCL:PB6或PB8,PB10。
Arduino中的I2C引脚
SDA: A4针
SCL: A5针
所需组件
- STM32F103C8
- Arduino Uno
- LED(2-Nos)
- 按钮(2-否)
- 电阻器(4-Nos)
- 面包板
- 连接线
电路图和连接
下表显示了使用I2C总线的STM32 Blue Pill和Arduino Uno之间的连接。它只需要两条线。
STM32F103C8 |
Arduino的 |
引脚说明 |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
地线 |
地线 |
地面 |
重要
- 不要忘记将Arduino GND和STM32F103C8 GND连接在一起。
- 然后将一个10k的下拉电阻分别连接到两个板的按钮引脚。
在此STM32 I2C教程中,我们将STM32F103C8配置为Master,将Arduino配置为Slave。这两块板都分别装有一个LED和一个按钮。
为了演示STM32中的I2C通信,我们使用Arduino从属按钮值控制STM32主LED,并使用STM32F103C8主人按钮值控制Arduino LED。这些值通过I2C通信总线发送。
STM32中的I2C编程
编程类似于Arduino代码。相同
本教程有两个程序,一个用于主STM32,另一个用于从Arduino。 双方的完整计划均在该项目的最后给出了 演示视频。
STM32主编程说明
在Master STM32中,让我们看看发生了什么:
1.首先,我们需要包括Wire库和softwire库,以便在STM32F103C8中使用I2C通信功能。
#包括
2.在无效的setup()中
- 我们以9600波特率开始串行通信。
Serial.begin(9600);
- 接下来,我们从引脚(B6,B7)开始I2C通信
Wire.begin();
3.在Void loop()中
- 首先我们从Slave Arduino获取数据,因此我们使用带有从地址8的 requestFrom() 并请求一个字节。
Wire.requestFrom(8,1);
使用 Wire.read() 读取接收到的值
字节a = Wire.read();
- 根据从子机主LED被接通或断开,通过使用所接收的值 digitalwrite 在销PA1和也串行打印被应用于串行监控打印值
如果(a == 1) { digitalWrite(LED,HIGH); Serial.println(“ Master LED ON”); } else { digitalWrite(LED,LOW); Serial.println(“ Master LED OFF”); }
- 接下来,我们需要读取主STM32按钮PA0引脚的状态。
int pinvalue = digitalRead(buttonpin);
- 接下来根据逻辑发送引脚值,因此我们使用 if 条件,然后以8作为地址的从arduino开始传输,然后根据按钮输入值写入该值。
if(pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission(8); Wire.write(x); Wire.endTransmission();
从Arduino编程说明
1.首先,我们需要包括用于使用I2C通信功能的Wire库。
#包括
2.在无效的setup()中
- 我们以9600波特率开始串行通信。
Serial.begin(9600);
- 接下来,在从机地址为8的引脚(A4,A5)上启动I2C通信。在这里,重要的是指定从机地址。
Wire.begin(8);
接下来,我们需要调用 Wire.onReceive 功能时,从主,从接收值 Wire.onRequest 函数调用时,主请求值从站。
Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent);
3.接下来,我们有两个功能,一个用于请求事件,一个用于接收事件。
要求事件
当从站的主STM32请求值时,该功能将执行。此函数的确从Slave Arduino按钮获取输入值,并使用 Wire.write() 根据按钮值将字节(1或0)发送到Master STM32 。
void requestEvent() { int value = digitalRead(buttonpin); 如果(值==高) { x = 1; } else { x = 0; } Wire.write(x); }
对于接收事件
当主站使用从站地址(8)将数据发送到从站时,此功能将执行。该功能从主设备读取接收到的值,并将其存储在字节类型的变量中,然后使用 if 逻辑根据接收到的值打开或关闭从属LED。如果接收到的值为1,则LED点亮,而对于0,LED熄灭。
void receiveEvent(int howMany) { 字节a = Wire.read(); 如果(a == 1) { digitalWrite(LED,HIGH); Serial.println(“从站LED亮”); } else { digitalWrite(LED,LOW); Serial.println(“从站LED关闭”); } delay(500); }
输出量
1.当我们按下Master STM32上的按钮时,连接到Slave Ardiono的LED点亮(白色)。
2.现在,当我们按下从设备侧的按钮时,连接到主机的LED会亮起(红色),而当释放按钮时LED会熄灭。
3.当两个按钮同时按下时,两个LED同时发光,并保持点亮状态,直到按下按钮
因此,这就是 STM32中进行I2C通信的方式。现在,您可以将任何I2C传感器与STM32板连接。
主STM32和从Arduino的完整编码在下面给出了演示视频