stm32 hal can接收大量数据的轰炸后,不能继续接收(不能再进入中断);

3 篇文章 0 订阅
2 篇文章 0 订阅
本文探讨了在CAN总线中同时进行数据接收与发送时的状态处理问题。具体分析了hal_can_transmit与hal_can_receive_it函数的工作流程,并提出了解决hal_can_receive_it在特定条件下返回HAL_BUSY状态的方法。
摘要由CSDN通过智能技术生成

原因:若在接收的时候发送数据,

发送中的处理:

hal_can_transmit()中会进行hal_lock(hcan);然后更改can状态为HAL_CAN_STATE_BUSY_TX相关的。

再谈一下接收中的处理,不用多说肯定是在接收中断国会开启下一次接收,即hal_can_receive_it();那么这里边又干了什么:

  /* Check if CAN state is not busy for RX FIFO0 */
  if((FIFONumber == CAN_FIFO0) && ((hcan->State == HAL_CAN_STATE_BUSY_RX0) ||         \
                                   (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0) ||      \
                                   (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) ||     \
                                   (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
  {
    return HAL_BUSY;
  }

  /* Check if CAN state is not busy for RX FIFO1 */
  if((FIFONumber == CAN_FIFO1) && ((hcan->State == HAL_CAN_STATE_BUSY_RX1) ||         \
                                   (hcan->State == HAL_CAN_STATE_BUSY_TX_RX1) ||      \
                                   (hcan->State == HAL_CAN_STATE_BUSY_RX0_RX1) ||     \
                                   (hcan->State == HAL_CAN_STATE_BUSY_TX_RX0_RX1)))
  {
    return HAL_BUSY;
  }

这儿会直接返回,也就是说如果此时处于这些状态说明一定有执行过hal_lock(), 既然我们返回了那相应的中断标签并没有得到相应的处理。


对比后发现hal_can_transmit和hal_can_receive_it中在lock之后都会执行以下语句

  __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG |
                            CAN_IT_EPV |
                            CAN_IT_BOF |
                            CAN_IT_LEC |
                            CAN_IT_ERR |
                            CAN_IT_TME);
不过hal_can_receive_it中在unlock之后还多执行了
  /* Process unlocked */
   __HAL_UNLOCK(hcan);

  if(FIFONumber == CAN_FIFO0)
  {
    /* Enable FIFO 0 overrun and message pending Interrupt */
    __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV0 | CAN_IT_FMP0);
  }
  else
  {
    /* Enable FIFO 1 overrun and message pending Interrupt */
    __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV1 | CAN_IT_FMP1);
  }

好,那我们是不是如果hal_can_receive_it(&hcan1)== hal_busy时添加执行以上语句就可以了 ,实现证明是可以的。

那在接收中断中对果hal_can_receive_it作如下处理:

if( HAL_BUSY == HAL_CAN_Receive_IT(hcanx, CAN_FIFO0))//开启中断接收
{
	/* Enable FIFO 0 overrun and message pending Interrupt */
	__HAL_CAN_ENABLE_IT(&hcan1, CAN_IT_FOV0 | CAN_IT_FMP0);
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值