I2C接口怎么通过中断实现master/slave通讯

本文实现两个MCU间实现I2C通信的一个项目。华大半导体MCU HC32F406作为slave,而英飞凌MCU PSoC6作为master,实现基于I2C 2线通讯,不是polling模式而是Interrupt中断模式。两个单片机进行i2c通信,且通信模式是主问从答模式,I2C有地址DeviceAddress需要交互,不像SPI要通过一跟SS(Slave)线来实现。

需求:

1、slave为I2C外设从机模式进行中断方式的数据收发

2、接线方式:主机SDA->从机SDA;主机SCL->从机SCL;主机GND->从机GND。

3、通过按键和闪灯进行调试和确认,可以用示波器和万用表做辅助。软件IDE为Keil/IAR和ModusToolBox。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,在stm32上需要配置I2C模块,包括设置I2C时钟、地址、数据传输模式等参数。在树莓派上,需要先启用I2C模块,并安装相应的Python库(如smbus)来实现I2C通信。 然后,在stm32上,可以通过I2C中断或DMA方式来进行I2C数据的读写操作,比如向树莓派发送数据或者接收树莓派发来的数据。在树莓派上,可以使用Python代码来实现I2C通信,比如使用smbus库中的write_byte、read_byte等函数来进行读写操作。 下面是一个简单的例子,假设stm32的I2C地址为0x50,树莓派的I2C地址为0x60,stm32向树莓派发送一个字节的数据,树莓派接收后回传一个字节的数据: 在stm32上的代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_i2c.h" #define SLAVE_ADDRESS 0x60 uint8_t i2c_data = 0x55; void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct; I2C_InitTypeDef I2C_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); I2C_InitStruct.I2C_ClockSpeed = 100000; I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStruct.I2C_OwnAddress1 = 0x50; I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &I2C_InitStruct); I2C_Cmd(I2C1, ENABLE); } void I2C_SendData(uint8_t slave_addr, uint8_t* data, uint8_t len) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) { } I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) { } I2C_Send7bitAddress(I2C1, slave_addr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { } for(uint8_t i = 0; i < len; i++) { I2C_SendData(I2C1, data[i]); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { } } I2C_GenerateSTOP(I2C1, ENABLE); } int main(void) { I2C_Configuration(); while(1) { I2C_SendData(SLAVE_ADDRESS, &i2c_data, 1); // 等待树莓派回传数据 } } ``` 在树莓派上的Python代码: ```python import smbus SLAVE_ADDRESS = 0x50 bus = smbus.SMBus(1) while True: data = bus.read_byte(SLAVE_ADDRESS) # 处理接收到的数据 bus.write_byte(SLAVE_ADDRESS, 0xAA) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯片-嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值