打印
[STM32F1]

STM32F103发送数据异常

[复制链接]
3258|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
求学问路|  楼主 | 2015-4-23 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 求学问路 于 2015-4-23 15:48 编辑

只有50分,谢谢!

设备功能: 每隔0.5S以250K波特率往CAN 总线上发送数据,(无须接收数据以及其他问题处理)
异常干扰: 人为加入干扰,(例如以高优先级ID,以500K波特率往总线发数据)消除干扰后设备不再发送数据,单步调试后发现transmit_mailbox = CAN_NO_MB;导致无法发送数据,请教各位是什么原因?
使用ST库函数
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
{
  uint8_t transmit_mailbox = 0;
  /* Check the parameters */
  assert_param(IS_CAN_ALL_PERIPH(CANx));
  assert_param(IS_CAN_IDTYPE(TxMessage->IDE));
  assert_param(IS_CAN_RTR(TxMessage->RTR));
  assert_param(IS_CAN_DLC(TxMessage->DLC));
  /* Select one empty transmit mailbox */
  test4 = CANx->TSR;          //测试观察用的变量,正常时test=0x1c000003,异常时test=0x82000008
  if ((CANx->TSR&TSR_TME0) == TSR_TME0)
  {
    transmit_mailbox = 0;
  }
  else if ((CANx->TSR&TSR_TME1) == TSR_TME1)
  {
    transmit_mailbox = 1;
  }
  else if ((CANx->TSR&TSR_TME2) == TSR_TME2)
  {
    transmit_mailbox = 2;
  }
  else
  {
    transmit_mailbox = CAN_NO_MB;  //进入这一步导致以下程序不执行无法发送数据
  }
  if (transmit_mailbox != CAN_NO_MB)
  {
    /* Set up the Id */
    CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ;
    if (TxMessage->IDE == CAN_ID_STD)
    {
      assert_param(IS_CAN_STDID(TxMessage->StdId));  
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | TxMessage->RTR);
    }
    else
    {
      assert_param(IS_CAN_EXTID(TxMessage->ExtId));
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId<<3) | TxMessage->IDE |
                                               TxMessage->RTR);
    }
   
    /* Set up the DLC */
    TxMessage->DLC &= (uint8_t)0x0000000F;
    CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0;
    CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC;
    /* Set up the data field */
    CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) |
                                             ((uint32_t)TxMessage->Data[2] << 16) |
                                             ((uint32_t)TxMessage->Data[1] << 8) |
                                             ((uint32_t)TxMessage->Data[0]));
    CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) |
                                             ((uint32_t)TxMessage->Data[6] << 16) |
                                             ((uint32_t)TxMessage->Data[5] << 8) |
                                             ((uint32_t)TxMessage->Data[4]));
    /* Request transmission */
    CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ;
  }
  return transmit_mailbox;
}

沙发
求学问路|  楼主 | 2015-4-23 16:28 | 只看该作者
各位只看不发表见义啊。

使用特权

评论回复
板凳
airwill| | 2015-4-23 20:45 | 只看该作者
本帖最后由 airwill 于 2015-4-24 10:49 编辑

你应该再关注一下错误寄存器。这往往是主动错误的情况
你可以考虑使用错误自动恢复机制,这个功能 CAN 控制器就有,当然如果还不放心的话,再加软件强制回复功能。

使用特权

评论回复
地板
mintspring| | 2015-4-23 23:26 | 只看该作者
提示: 该帖被管理员或版主屏蔽
5
周董| | 2015-4-24 07:12 | 只看该作者
程序不执行无法发送数据应该是和寄存器有关系的,

使用特权

评论回复
6
求学问路|  楼主 | 2015-4-24 10:41 | 只看该作者
本帖最后由 求学问路 于 2015-4-26 08:24 编辑
airwill 发表于 2015-4-23 20:45
你应该再关注一下错误寄存器。
你可以考虑使用错误自动恢复机制,这个功能 CAN 控制器就有,当然如果还不放 ...


谢谢,从CANx->TSR看,不清楚为什么加入干扰后3个邮箱都成非空的,判断发送邮箱为非空的就不再发送数据了。

使用特权

评论回复
7
求学问路|  楼主 | 2015-4-24 10:42 | 只看该作者
mintspring 发表于 2015-4-23 23:26
应该再关注一下错误寄存器

谢谢提醒

使用特权

评论回复
8
求学问路|  楼主 | 2015-4-24 10:45 | 只看该作者
本帖最后由 求学问路 于 2015-4-26 08:24 编辑
周董 发表于 2015-4-24 07:12
程序不执行无法发送数据应该是和寄存器有关系的,


正常测试,收发数据24小时无任何问题,人为加入干扰信号,从CANx->TSR看,3个发送邮箱都成非空的,判断发送邮箱为非空后就不再发送数据了。

使用特权

评论回复
9
mintspring| | 2015-4-25 23:49 | 只看该作者
其实20分就够了,大家都是菜鸟。

使用特权

评论回复
10
求学问路|  楼主 | 2015-4-26 08:35 | 只看该作者
mintspring 发表于 2015-4-25 23:49
其实20分就够了,大家都是菜鸟。

后面发现是一个离线的问题, 只是不清楚为何有时可以恢复有时又不能恢复

使用特权

评论回复
11
周董| | 2015-4-26 12:12 | 只看该作者
提示: 该帖被管理员或版主屏蔽
12
求学问路|  楼主 | 2015-4-26 13:53 | 只看该作者
花了一个上午的时间通过仿真查看各个寄存器的状态值,总算明白是怎么回事,感谢各位参与提醒,结贴给分。

使用特权

评论回复
13
mintspring| | 2015-4-26 17:23 | 只看该作者
求学问路 发表于 2015-4-26 08:35
后面发现是一个离线的问题, 只是不清楚为何有时可以恢复有时又不能恢复 ...

应该初始化的不够彻底吧。看看是不是某些标志位忘了清零。

使用特权

评论回复
14
YJCSXDL| | 2015-7-29 14:10 | 只看该作者
楼主 我也遇到了相同的问题,麻烦问下您是怎么解决的?

使用特权

评论回复
15
求学问路|  楼主 | 2016-4-13 17:09 | 只看该作者
剡溪渡口 发表于 2016-4-12 19:56
楼主能详细说说是怎么解决的吗?我遇到的问题是在单步调试时transmit_mailbox从0,1,2直到变成4后貌似就不 ...

你是做哪方面的? 可以发私聊信息

使用特权

评论回复
16
qinhuas| | 2018-1-24 16:42 | 只看该作者
楼主能详细说说是怎么解决的吗?我也碰到相同的问题了

使用特权

评论回复
17
qinhuas| | 2018-1-24 16:45 | 只看该作者
求救,哪位大佬也碰到了这种问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

138

帖子

5

粉丝