当前位置:   article > 正文

【HMGD】STM32/GD32 I2C DMA 主从通信

【HMGD】STM32/GD32 I2C DMA 主从通信

STM32 I2C配置

主机配置

主机只要配置速度就行
在这里插入图片描述

从机配置

从机配置相同速度,可以设置第二地址

在这里插入图片描述

因为我的板子上面已经有了上拉电阻,所以可以直接通信

在这里插入图片描述

STM32 I2C DMA 定长主从通信代码示例

int state  = 0;
static uint8_t I2C_recvBuf[10] = {0};
static uint8_t I2C_sendBuf[10] = {2,1,2,3,4,5,6,7,8,9};

void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
	HAL_I2C_Slave_Receive_DMA(&hi2c1, I2C_recvBuf, 5);
	state = 1;
}

// I2C 干扰检测
void I2C2_ER_IRQHandler(void)
{
	printf("ERROR I2C\r\n");
	HAL_I2C_Slave_Receive_DMA(&hi2c1, I2C_recvBuf, 5);
  	HAL_I2C_ER_IRQHandler(&hi2c2);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  MX_I2C2_Init();
	
  printf("hello i2c stm32 \r\n");
  HAL_I2C_Slave_Receive_DMA(&hi2c1, I2C_recvBuf, 5);
	
  while (1)
  {
    // 可以多地址接收数据
    HAL_I2C_Master_Transmit_DMA(&hi2c2, (20<<1)|0x01 ,I2C_sendBuf, 5);
	//HAL_I2C_Master_Transmit_DMA(&hi2c2, (10<<1)|0x01 ,I2C_sendBuf, 5);
		
	if(state == 1)
	{
		state  = 0;
		for (int i=0; i<4; i++)
		{	
				printf("[%d]:%d", i, I2C_recvBuf[i]);
		}
			
		I2C_sendBuf[0] = I2C_sendBuf[0] + 1;
			
		if(I2C_sendBuf[0] > 100)
		{
				I2C_sendBuf[0] = 0;
		}
			
		printf("\r\n");
	}
		
	HAL_Delay(1000);
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

在这里插入图片描述

示例代码下载

https://download.csdn.net/download/hmxm6/89324145

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/633778
推荐阅读
相关标签
  

闽ICP备14008679号