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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版