阳阳NO1 发表于 2020-5-24 15:16:21

STM32f103rct6 CAN 收发不到数据

用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;
        uint8_t TxData = {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分析仪就是收不到数据,请教各位初始化和发送函数有问题吗?

阳阳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 庫 , 來做對比:o

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透传模块测试了,没问题,真是搞不懂是什么问题了。
页: [1] 2
查看完整版本: STM32f103rct6 CAN 收发不到数据