你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32f103rct6 CAN 收发不到数据

[复制链接]
阳阳NO1 提问时间:2020-5-24 15:16 /
用STM32CUBEX生成的Can例程,can收发都不行,Can重定位到PB8和PB9了,初始化代码如下:
APB1的clk为72M,所以波特率为250k。
static void MX_CAN_Init(void)
{
  CAN_FilterTypeDef hcanfilter;

  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 96;                     /*BTR-BRP,分频系数,波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler*/
  hcan.Init.Mode = CAN_MODE_NORMAL;             /*正常工作模式*/
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;        /*BTR-SJW 重新同步跳跃宽度 1个时间单元*/
  hcan.Init.TimeSeg1 = CAN_BS1_1TQ;             /*BTR-TS1,时间段1,1个时间单元*/
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;             /*BTR-TS2,时间段2,1个时间单元*/
  hcan.Init.TimeTriggeredMode = DISABLE;        /*MCR-TTCM 禁止时间触发模式,就是消息里面不带时间戳*/
  hcan.Init.AutoBusOff = ENABLE;                /*MCR-ABOM 使能自动管理模式,一旦硬件检测到128次11位连续的隐性位就退出离线状态*/
  hcan.Init.AutoWakeUp = ENABLE ;               /*MCR-AWUM 使能自动唤醒*/
  hcan.Init.AutoRetransmission = ENABLE;        /*MCR-NART 允许自动重传模式,当发送失败或者仲裁失败的时候硬件自动重传*/     
  hcan.Init.ReceiveFifoLocked = DISABLE;        /*MCR-RFLM 禁止接收fifo锁定,当接收fifo的报文未被读出,下一个收到的报文覆盖原来有的报文*/
  hcan.Init.TransmitFifoPriority = DISABLE;     /*MCR-TXFP 优先级由发送报文的标识符来决定*/
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
      printf("can init fail\r\n");
      Error_Handler();
  }

  /**
   *  过滤组设置
   */
  hcanfilter.FilterIdHigh         = 0x0000;  /*以下四个值为0,表示不对任何ID过滤*/   
  hcanfilter.FilterIdLow          = 0x0000;
  hcanfilter.FilterMaskIdHigh     = 0x0000;
  hcanfilter.FilterMaskIdLow      = 0x0000;
  hcanfilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  hcanfilter.FilterMode           = CAN_FILTERMODE_IDMASK;
  hcanfilter.FilterScale          = CAN_FILTERSCALE_32BIT;
  hcanfilter.FilterActivation     = ENABLE;
  hcanfilter.FilterBank           = 1;
  if(HAL_CAN_ConfigFilter(&hcan, &hcanfilter) != HAL_OK)
  {      
      printf("can init filter fail\r\n");
      Error_Handler();
  }
}


gpio初始化为:
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hcan->Instance==CAN1)
  {
    __HAL_RCC_CAN1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**CAN GPIO Configuration   
    PB8     ------> CAN_RX
    PB9     ------> CAN_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    __HAL_AFIO_REMAP_CAN1_2();

    /* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
  }


发送函数为:
void CanTest(void)
{
        CAN_TxHeaderTypeDef TxHeader;
        CAN_RxHeaderTypeDef RxHeader;
        HAL_StatusTypeDef ret = HAL_OK;
        uint8_t RxData[8];
        uint8_t TxData[8] = {0x23, 0x81, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00};
        uint32_t TxMailbox;
        uint32_t std_id = 0x601;  
       
        TxHeader.RTR = CAN_RTR_DATA;
        TxHeader.IDE = CAN_ID_STD;                          
        TxHeader.StdId=std_id;
        TxHeader.TransmitGlobalTime = DISABLE;
        TxHeader.DLC = 8;
                       
        if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK)
        {
           /* Transmission request Error */
           Error_Handler();
        }
}

但我用can分析仪就是收不到数据,请教各位初始化和发送函数有问题吗?
收藏 评论14 发布时间:2020-5-24 15:16

举报

14个回答
阳阳NO1 最优答案 回答时间:2020-6-1 10:16:07
jeffhe1 发表于 2020-5-28 09:15
你有不要用回環模式 , 去送 data , 用示波器去量 mcu 出來的 RX , TX 訊號 , 假如有出來 , 再去量外面驅 ...

非常感谢你的支持,我后来是买了一块核心板我几块CAN模块,用杜邦线连接测试的,例程也是店家给的一直测试没问题的,刚开始测起来CAN分析仪还是收不到数据,后来就怀疑是连接有问题,将CPU到can模块的TX和RX两根线交换了下,CAN分析仪就有数据了,后来到我自己的板上测试了下,也没问题了。
所有还是我电路的问题,CAN模块的D接CPU的TX,CAN模块的R接CPU的RX,跟RS485和MAX232还是不一样的
阳阳NO1 回答时间:2020-5-24 17:41:50
查了下寄存器,CAN_ESR的LEC=0x05,显性位错,CAN_TEC一直在计数,计到0xf8后BOFF,EPVF,EWGF都为1了,REC一直是0
jeffhe1 回答时间:2020-5-25 09:09:32
你可以先用  野火範例 (canbus 是能動), 標準庫的先熟悉  canbus 的設定&運行 , 再改為 HAL 庫 , 來做對比  

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

mylovemcu 回答时间:2020-5-25 11:49:25
环回测试自检一下  看有没有问题  在就是检查一下电阻匹配
阳阳NO1 回答时间:2020-5-25 16:00:35
mylovemcu 发表于 2020-5-25 11:49
环回测试自检一下  看有没有问题  在就是检查一下电阻匹配

昨天环回测试过了,没问题,电阻焊的是120欧的,也应该没问题。不清楚是不是can驱动器SN65HVD230芯片有问题。
阳阳NO1 回答时间:2020-5-25 16:04:30
jeffhe1 发表于 2020-5-25 09:09
你可以先用  野火範例 (canbus 是能動), 標準庫的先熟悉  canbus 的設定&運行 , 再改為 HAL 庫 , 來做對比  ...

野火是3.5的库,也没有STM32F103RCT6这颗料的can例程。我昨天环回实验做了,没问题。
jeffhe1 回答时间:2020-5-26 09:53:12
阳阳NO1 发表于 2020-5-25 16:04
野火是3.5的库,也没有STM32F103RCT6这颗料的can例程。我昨天环回实验做了,没问题。
...

那只要選 device 改一下就好 , 主要是 flash 大小選定 , 其餘都一 樣 , 假如回環沒問題 , 那就代表設定基本上沒問題 , 要往硬體方向去 debug 了
阳阳NO1 回答时间:2020-5-26 23:45:59
jeffhe1 发表于 2020-5-26 09:53
那只要選 device 改一下就好 , 主要是 flash 大小選定 , 其餘都一 樣 , 假如回環沒問題 , 那就代表設定基 ...

是在往硬件方向考虑了,重新来了核心板和can模块回来单独测试。
看手册,回环模式,CAN_TX上也有波形的,那如果外面的驱动器没问题,是不是可以理解成用示波器看can_tx上应该有波形存在的?
jeffhe1 回答时间:2020-5-27 11:10:38
阳阳NO1 发表于 2020-5-26 23:45
是在往硬件方向考虑了,重新来了核心板和can模块回来单独测试。
看手册,回环模式,CAN_TX上也有波形的, ...

可以試看看 , 外面驅動器是差動訊號 , 應該也可以用示波器量 ,  最好用有 can 的 LA 去解析 , 淘寶應該有便宜可以買 , 只要能看是否有 data 出來就可以
阳阳NO1 回答时间:2020-5-27 21:41:20
jeffhe1 发表于 2020-5-27 11:10
可以試看看 , 外面驅動器是差動訊號 , 應該也可以用示波器量 ,  最好用有 can 的 LA 去解析 , 淘寶應該有 ...

我有can分析仪的,看了下没数据,顺丰在网上买了103RCT6的核心板和can模块,搭起来还是发送不出去,这可是淘宝店家说一直在用的测试程序啊, 看来跟这个can是杠上了。现在程序也是别人说OK的,板子也全部是买的,can分析仪用买的can透传模块测试了,没问题,真是搞不懂是什么问题了。
g921002 回答时间:2020-5-28 00:10:02
CAN外部測試一定要有另外一個裝置回應才行。看一下CAN分析儀式是開在一般模式還是監聽模式,監聽模式不會回應裝置就會CAN_TEC錯誤計數一直跑。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

阳阳NO1 回答时间:2020-5-28 01:44:07
g921002 发表于 2020-5-28 00:10
CAN外部測試一定要有另外一個裝置回應才行。看一下CAN分析儀式是開在一般模式還是監聽模式,監聽模式不會回 ...

感谢你的一直支持,今天终于调通了,确实是接线的问题,原来CAN驱动器跟RS485不一样,CAN的D接CPU的TX,CAN的R接CPU的RX,第一次自己画板调试Can,没仔细研究芯片就想当然的,搞了好几天了。
jeffhe1 回答时间:2020-5-28 09:15:54
阳阳NO1 发表于 2020-5-27 21:41
我有can分析仪的,看了下没数据,顺丰在网上买了103RCT6的核心板和can模块,搭起来还是发送不出去,这可是 ...

你有不要用回環模式 , 去送 data , 用示波器去量 mcu 出來的 RX , TX 訊號 , 假如有出來 , 再去量外面驅動器的訊號 , 去做比對 , 看2者是否波型一樣 , 不一樣硬體上就有問體 , 一樣的話 , 就要看 can 分析儀設定是否正確 , 有很多參數要設 ? baud rate 最重要 , 假如還是沒解 , 最後幾個方法

1 : 再去跟同廠家買一塊一模一樣模塊 , 用同樣程序對傳 , 排除硬體上的問題 , 跟 LA 的設定問題
2 : 把野火 3.5的 sample code 改成你現在的 , 試看看
3 : 直接買一塊野火的 開發版 , 直接用 野火的 sample code 去玩 , 玩熟了 , 再一個個改成你現在的測試環境
七哥 回答时间:2020-6-1 10:47:20
阳阳NO1 发表于 2020-6-1 10:16
非常感谢你的支持,我后来是买了一块核心板我几块CAN模块,用杜邦线连接测试的,例程也是店家给的一直测 ...

解决了问题来总结回帖,这个习惯很好,可以将总结置顶

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版