最近的一个项目中,要求我使用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,DMA选择Normal模式,数据宽度选择byte
代码实现:
定义一个标志位:
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; }
主函数:
测试:
搞掂~ (๑•̀ㅂ•́)و✧