I2C+DMA之初体验

发布时间 2024-01-08 16:13:00作者: kkk123456**

最近的一个项目中,要求我使用CAN以2kHz的速率上传传感器的数据。测试发现,速率才160Hz左右...远远达不到...2k

我一开始的操作是这样的:定时器定时500us,到点了就通过iic读传感器数据,读到之后就通过can发送出去。

while (1)
  {
      if(tim_flag)
      {
          Get_AccData(); //这个函数里读传感器数据+使用can发送数据
          tim_flag=0;
      }

  }

 

解决思路:

1. 先单独测试can的发送速率是否能够达到2kHz。定时任务里什么都不做,只进行CAN发送。

while (1)
  {
      if(tim_flag)
      {
          CAN_Send_Msg(test,7);
          tim_flag=0;
      }

  }

我用另一个板子作为CAN对端,定时1s,输出接收的数据量,通过串口打印出来。如下图,速率差不多有2k,那应该是I2C的操作拖慢了速率。

 2. 后面我把CAN和I2C的操作分开了。速录得到了明显的提升,但是还达不到2k。

 3. 这时候我想到了DMA (●'◡'●)。

配置DMA

 

 代码实现:

定义一个标志位:

uint8_t dmaiic_read_sta=0;

I2C回调函数:

void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
  memcpy(acc_data_buf, dma_rx_buf, 6);
  dmaiic_read_sta=0;
}

主函数:

 测试:

 搞掂~ (๑•̀ㅂ•́)و✧