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);
  }
}

在这里插入图片描述

示例代码下载

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值