使用MicroPython的语法编写ESP32通过IIC的通讯方式与STM32103ZET6进行数据传输的代码和寄存器版本的STM32与ESP32进行IIC通信的代码
时间: 2023-05-27 10:05:33 浏览: 55
ESP32与STM32通过I2C进行通信的MicroPython代码:
ESP32端代码:
```python
from machine import I2C, Pin
i2c = I2C(scl=Pin(22), sda=Pin(21))
address = 0x3A # STM32的I2C地址
data_out = bytearray([0x01, 0x02, 0x03, 0x04, 0x05]) # 发送的数据
i2c.writeto(address, data_out) # 发送数据
```
STM32端代码:
```c
#include "stm32f10x.h"
#include "stdio.h"
#define I2C_SLAVE_ADDRESS 0x3A
#define I2C_SPEED 100000
#define I2C GPIOB
#define I2C_SCL GPIO_Pin_6
#define I2C_SDA GPIO_Pin_7
uint8_t data_in[5];
void I2C_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = I2C_SCL | I2C_SDA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(I2C, &GPIO_InitStructure);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
void I2C_Read(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, ReadAddr);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(NumByteToRead)
{
if(NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
}
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
*pBuffer = I2C_ReceiveData(I2C1);
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
I2C_Config();
I2C_Read(data_in, 0x00, 5);
for(int i=0; i<5; i++)
{
printf("data_in[%d]: %d\n", i, data_in[i]);
}
while(1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
}
```
其中,STM32的I2C地址为0x3A,ESP32的I2C地址为0x3A。在ESP32端,首先定义了一个I2C对象,然后指定了STM32的I2C地址。接着定义了要发送的数据,使用writeto()函数将数据发送给STM32。在STM32端,首先配置了I2C引脚和速率,然后定义了一个I2C_Read()函数用于读取从ESP32发送过来的数据。在主函数中,先将PA0引脚配置为输出模式,并将其翻转以作为调试信号。然后调用I2C_Read()函数读取ESP32发送过来的数据,并在串口上输出。最后进入死循环。