在本教程中,我将向您展示如何在基于STM32F103C8T6 MCU的STM32蓝色药丸板中使用I2C。展示I2C通信,我们至少需要一个大师和一个奴隶。因此,在此STM32 I2C教程中,我将使用STM32 MCU作为Master和Arduino Uno作为奴隶。
介绍
我们已经看到了与Arduino实施的几个I2C通信相关项目。让我们快速回忆起有关I2C协议的一些关键信息。I2C是I2C相互交流的简短,由Phillips开发为简单的两线串行通信协议,用于微控制器和某些低速外围设备之间的数据传输,例如内存,计时器,传感器,IO,IO,ADC,DAC等。。
几乎所有现代的微控制器都具有内置的I2C通信协议系统。I2C是一种多主luld-Slave协议,仅需要两条线,即用于通信的SDA(串行数据)和SCL(串行时钟)(应该有一个常见的GND)。
要记住的一个重要的事情是,这两条电线处于开放的排水配置状态,必须用适当的上拉电阻将高高拉动,以便能够在公共汽车上驾驶逻辑。
当主启动起始条件时,I2C通信开始,SDA线从高到低点,而SCL线则以高。接下来是一个7位的从地址,单位表示读取(1')操作或写入(0')操作。
I2C在STM32F103C8T6中
STM32F103C8T6 MCU具有两个I2C接口,即I2C1和I2C2。I2C接口都支持标准通信速度,即100kHz以及快速通信速度,即400kHz。
STM32蓝色药丸中两个I2C接口的引脚映射如下:
- I2C1
- SDA - PB7或PB9
- SCL - PB6或PB8
- I2C2
- SDA - PB11
- SCL - PB10
在这个项目中,我将使用PB7作为SDA和PB6作为SCL。
I2C在Arduino
由于我们需要一个用于I2C通信的从设备,因此我们可以使用任何著名的I2C设备,例如DS1307 RTC IC,PCF8574 GPIO Expander IC,AT24XX EEPROM IC等。但是,在此项目中,我将使用Arduino Uno作为I2C奴隶设备,因此我们可以在STM32和Arduino之间进行通讯和通过交流。
说到Arduino的I2C,Pins A4和A5是Arduino Uno的I2C通信引脚,其中A4是SDA PIN,而A5是SCL引脚。
需要组件
- STM32F103C8T6基于MCU的STM32蓝色药丸板
- Arduino Uno
- 2 x 5mm LED
- 2 x220Ω电阻
- 2 x4.7kΩ电阻
- 2 x10kΩ电阻
- 2 x按钮
- 连接电线
- USB到uart转换器(如果通过UART编程)
电路原理图
下图显示了在STM32F103C8T6中使用I2C在I2C总线上与Arduino通信的电路图。
连接解释了
在STM32F103C8T6中演示使用I2C的连接非常简单。将STM32的SDA引脚(即PB7)与Arduino的相应SDA引脚,即A4连接。同样,将STM32的SCL引脚(即PB6)连接到Arduino的相应SCL销,即A5。使用两个4.7kΩ电阻将SDA和SCL引脚高高拉高。
现在,将按钮连接到STM32的PA0引脚,并使用10kΩ电阻将此引脚拉到GND。将按钮的另一端连接到3.3V。
重复Arduino的相同内容,即将按钮连接到数字IO引脚6,然后使用10kΩ电阻将此引脚拉到GND。将按钮的另一端连接到5V。
我们可以使用两个板的板载LED,这些LED连接到STM32中的PC13和Arduino的Digital IO Pin 13。确保Arduino和STM32的GND都是普遍的。
用于I2C通信的STM32编程
首先,让我们从I2C主设备(即STM32)开始。将LED引脚和按钮引脚定义为PC13和PA0。另外,将Arduino的从地址定义为0x8。初始化引脚,即LED引脚作为输出和按钮引脚作为输入,然后开始I2C通信。
在循环函数中,将操作分为两个部分,一个用于读取按钮引脚并发送相应的数据以及另一部分用于读取传入数据并打开LED开机或关闭(基于接收到的数据)。
代码
#include
#Define LEDPIN PC13
#define buttonpin pa0
#Define Slaveaddress 0x8
int senddata = 0;
void setup()
{
pinmode(buttonpin,输入);
pinmode(LED,输出);
Wire.Begin();
}
void loop()
{
int buttonvalue = digitalread(buttonpin);
Wire.Requestfrom(Slaveaddress,1);
字节readdata = wire.Read();
if(readdata == 1)
{
DigitalWrite(LED,高);
}
别的
{
DigitalWrite(LED,低);
}
if(buttonvalue ==高)
{
senddata = 1;
}
别的
{
senddata = 0;
}
Wire.BeginTransermiss(SlaveadDress);
Wire.Write(Senddata);
Wire.EndTransmission();
延迟(500);
}
编程Arduino用于I2C通信
现在来到Arduino,必须将其配置为从设备。首先,将LED引脚定义为数字IO引脚13和按钮引脚为数字IO引脚6,并将它们分别作为输出和输入初始化。
由于Arduino是从属,因此我们必须使用从地址开始I2C通信。此地址必须与主代码(或反之亦然)中定义的地址相同,即从从代码和主代码中提到的从地址匹配。
要记住的另一个重要的事情是I2C通信中的一个从属无法启动转移,它只能遵守主人的读取或写作请求。
因此,如果主执行读取操作,则调用Wire.Onrequest函数,然后依次调用指定的请求图。
同样,如果主人启动了写操作,则调用汇用函数。
代码
#include
#Define Ledpin 13
#定义纽扣6
#Define Slaveaddress 0x8
字节senddata = 0;
void setup()
{
pinmode(LED,输出);
Wire.Begin(SlaveadDress);
电线。
wire.onrequest(requestFun);
}
void loop()
{
延迟(100);
}
void receentfun(int字节)
{
字节recvData = wire.Read();
if(recvdata == 1)
{
DigitalWrite(LED,高);
}
别的
{
DigitalWrite(LED,低);
}
延迟(500);
}
void requestFun()
{
int buttonvalue = digitalread(buttonpin);
if(buttonvalue ==高)
{
senddata = 1;
}
别的
{
senddata = 0;
}
Wire.Write(Senddata);
}
结论
一个简单的项目,用于在STM32F103C8T6 MCU中演示I2C的STM32蓝色药丸板。STM32在I2C通信中充当主人,而Arduino Uno被用作从设备。
在主机(即STM32)中按下按钮时,一个LED将在Arduino中点亮。同样,当按下Arduino中的按钮时,STM32中的LED会点亮。
一个回应
您是否必须采取任何措施来告诉Arduino哪个引脚是所需的I2C引脚,因为可以使用多组销钉?