查看: 3414|回复: 6

[求助] 把CAN通信线拔掉,MPU的CAN口一直有波形输出

[复制链接]
  • TA的每日心情
    开心
    2020-4-9 16:46
  • 签到天数: 260 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    308

    帖子

    0

    高级会员

    Rank: 4

    积分
    980
    最后登录
    2020-4-9
    发表于 2018-9-10 09:20:45 | 显示全部楼层 |阅读模式
    本帖最后由 everkimage 于 2018-9-10 09:26 编辑

    芯片是KEA128,程序里CAN发送放在中断里,在程序某个地方关闭中断,然后跑入一段死循环,拔掉CAN通信线,CAN口一直会有波形输出,但不是每次都这样。
    尝试过将MSCAN.CANCTL.CANE置零,将MSCAN.CANCTL.LOOPB置一,CAN口依然有波形输出。
    这是硬件BUG还是CAN通信协议本身的功能所致,比如等待回复或发送回复?如何关闭这种输出?
    我知道答案 目前已有6人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24884
    最后登录
    2025-7-20
    发表于 2018-9-10 11:50:49 | 显示全部楼层
    你用的是什么代码?是官方代码吗?
    还有,在什么情况触发了上述的现象呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-4-9 16:46
  • 签到天数: 260 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    308

    帖子

    0

    高级会员

    Rank: 4

    积分
    980
    最后登录
    2020-4-9
     楼主| 发表于 2018-9-10 13:37:08 | 显示全部楼层
    初始化调用的库函数,不过是否官方可能与这个现象没关系。
    因为板子有CAN信号唤醒,所以如果在关机的时候有CAN信号,则立刻会被唤醒。出现这种现象大概流程是这样的:
    1.按键关机;
    2.发现系统复位,拔掉CAN通信线,再按键关机;
    3.偶尔会再复位;
    于是把关机函数写成这样:
    1.关闭中断(CAN数据在时钟中断里发出);
    2.清除CANE位;
    3.关闭电源;
    4.死循环;
    结果偶尔还是出现关不了机(电源灯亮),因为是死循环,所以就去量了CAN_RX,CAN_TX引脚,TX有波形。这个时候软件在死循环,中断关闭了,所以CAN信号不可能是软件发出的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-4-9 16:46
  • 签到天数: 260 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    308

    帖子

    0

    高级会员

    Rank: 4

    积分
    980
    最后登录
    2020-4-9
     楼主| 发表于 2018-9-10 13:38:01 | 显示全部楼层
    初始化调用的库函数,不过是否官方可能与这个现象没关系。
    因为板子有CAN信号唤醒,所以如果在关机的时候有CAN信号,则立刻会被唤醒。出现这种现象大概流程是这样的:
    1.按键关机;
    2.发现系统复位,拔掉CAN通信线,再按键关机;
    3.偶尔会再复位;
    于是把关机函数写成这样:
    1.关闭中断(CAN数据在时钟中断里发出);
    2.清除CANE位;
    3.关闭电源;
    4.死循环;
    结果偶尔还是出现关不了机(电源灯亮),因为是死循环,所以就去量了CAN_RX,CAN_TX引脚,TX有波形。这个时候软件在死循环,中断关闭了,所以CAN信号不可能是软件发出的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-4-9 16:46
  • 签到天数: 260 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    308

    帖子

    0

    高级会员

    Rank: 4

    积分
    980
    最后登录
    2020-4-9
     楼主| 发表于 2018-9-10 13:38:32 | 显示全部楼层
    小恩GG 发表于 2018-9-10 11:50
    你用的是什么代码?是官方代码吗?
    还有,在什么情况触发了上述的现象呢? ...

    初始化调用的库函数,不过是否官方可能与这个现象没关系。
    因为板子有CAN信号唤醒,所以如果在关机的时候有CAN信号,则立刻会被唤醒。出现这种现象大概流程是这样的:
    1.按键关机;
    2.发现系统复位,拔掉CAN通信线,再按键关机;
    3.偶尔会再复位;
    于是把关机函数写成这样:
    1.关闭中断(CAN数据在时钟中断里发出);
    2.清除CANE位;
    3.关闭电源;
    4.死循环;
    结果偶尔还是出现关不了机(电源灯亮),因为是死循环,所以就去量了CAN_RX,CAN_TX引脚,TX有波形。这个时候软件在死循环,中断关闭了,所以CAN信号不可能是软件发出的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24884
    最后登录
    2025-7-20
    发表于 2018-9-11 09:50:24 | 显示全部楼层
    everkimage 发表于 2018-9-10 13:38
    初始化调用的库函数,不过是否官方可能与这个现象没关系。
    因为板子有CAN信号唤醒,所以如果在关机的时候 ...

    你能分享一个简单的可还原问题的代码吗,最好基于官方例程的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-4-9 16:46
  • 签到天数: 260 天

    连续签到: 1 天

    [LV.8]以坛为家I

    14

    主题

    308

    帖子

    0

    高级会员

    Rank: 4

    积分
    980
    最后登录
    2020-4-9
     楼主| 发表于 2018-9-11 10:27:33 | 显示全部楼层
    初始化:
    1.         MSCAN_ParametersConfig CAN_Module_Config;
    2.         MSCAN_FilterConfigure  CAN_Filter_Config;

    3.         CAN_Module_Config.baudrate                   = MSCAN_Baudrate_250K;                /* Baud rate 250Kbps */
    4.         CAN_Module_Config.MSCAN_SignalPinsRemap      = 0;                            /* MSCAN signal pins remap on PTC7(TX) and PTC6(RX) */
    5.         CAN_Module_Config.MSCAN_StopInWaitMode       = 1;                                                /* MSCAN module is normal in wait mode */
    6.         CAN_Module_Config.MSCAN_TimeStampEnable      = 0;                                                /* Disable internal MSCAN timer stamp */
    7.         CAN_Module_Config.MSCAN_WakeUpEnable         = 0;                                                /* Wake-up disabled */
    8.         CAN_Module_Config.MSCAN_LoopbackMode         = 0;                                                /* Loop back self test disabled */
    9.         CAN_Module_Config.MSCAN_ListenOnlyMode       = 0;                                                /* Normal operation */
    10.         CAN_Module_Config.MSCAN_BusoffRecoveryMode   = 0;                                                /* Automatic bus-off recovery */
    11.         CAN_Module_Config.MSCAN_WakeUpMode           = 0;                                                /* Wakes up on any dominant level on CAN bus */
    12.         CAN_Module_Config.MSCAN_WakeUpINTEnable      = 0;                                                /* Wake-up interrupt disable */
    13.         CAN_Module_Config.MSCAN_OverrunINTEnable     = 0;                                                /* Overrun interrupt disable */
    14.         CAN_Module_Config.MSCAN_ReceiveFullINTEnable = 1;                                                /* Receive full interrupt enable */
    15.         CAN_Module_Config.MSCAN_TransEmptyINTEnable  = 0;                                                /* Transmitter empty interrupt disable */
    16.        
    17.         CAN_Filter_Config.Filter_Enable                           = 1;                                                /* Enable CAN module filters. If this value is cleared,the following parameters does not work */
    18.         CAN_Filter_Config.Filter_Channel                          = 0;                                                /* Select CAN module filter channel 0 */
    19.         CAN_Filter_Config.frame_type                              = OnlyAcceptDataFrame;                /* Enable CAN filter just receive data frame */
    20.         CAN_Filter_Config.id_format                               = OnlyAcceptExtendedID;        /* Enable CAN filter just receive extended ID */
    21.         CAN_Filter_Config.id_mask                                 = 0xFFFFFFFFu;                         /* When this value is set to 0xFFFFFFFFu,the id_accept value does not work */
    22.         CAN_Filter_Config.id_accept                               = 0x18901212u;                                /* Because the id_mask value has been set to 0xFFFFFFFFu,id_accept does not work and can be set to any value */
    23.        
    24.         (void)MSCAN_Init(&CAN_Module_Config, &CAN_Filter_Config);                                /* Call MSCAN_Init function to initialize MSCAN module by specified properties */
    25.        
    26.         Set_Vector_Handler(MSCAN_RX_VECTORn, MSCAN_RX_Handler);                                        /* Specify MSCAN receive data irq handler function name */
    27.        
    28.         NVIC_EnableIRQ(MSCAN_RX_IRQn);                                                                                        /* Enable MSCAN receive data NVIC interrupt */
    29.        
    30.         NVIC_SetPriority(MSCAN_RX_IRQn, 0);                                                                                /* Set MSCAN_RX interrupt priority to 0(The highest). */
    复制代码


    发送:
    1.         uint8_t reg_val, i;

    2.         uint8_t temp1, temp2, temp3;
    3.        
    4.         if (W_Framebuff != NULL)
    5.         {
    6.                 /* Ensure the length of the data not to be greater than 8 bytes. */
    7.                 if (W_Framebuff->data_length > 8)
    8.                 {
    9.                         return -1;
    10.                 }

    11.                 /* Ensure there is at least one Empty Transmission Buffer. */
    12.                 if ((reg_val = (MSCAN->CANTFLG & MSCAN_CANTFLG_TXE_MASK)) == 0)
    13.                 {
    14.                         return -1;
    15.                 }

    16.                 /*
    17.                  * According to the KEAZ128RM, select the Empty Transmission Buffer
    18.                  * by passing the value of CANx->CANTFLG to CANx->CANTBSEL. NOTICE,
    19.                  * after doing this, the value of CANx->CANTBSEL will be the index
    20.                  * of the Empty Transmission Buffer been selected.
    21.                  */
    22.                 MSCAN->CANTBSEL = reg_val;

    23.                 if ((W_Framebuff->frame_type == RemoteFrameWithStandardId)
    24.                  || (W_Framebuff->frame_type == DataFrameWithStandardId))
    25.                 {
    26.                         /* indicate the frame is standard format */
    27.                         MSCAN->TSIDR1 &= ~MSCAN_TSIDR1_TSIDE_MASK;

    28.                         /* If caller wants to send a packet with standard id, firstly
    29.                          * ensure the id not to be exceed 11 bits.
    30.                          */
    31.                         if (W_Framebuff->frame_id > 0x7FFu)
    32.                         {
    33.                                 return -1;
    34.                         }

    35.                         /* Load the id into the respective registers. */
    36.                         MSCAN->TSIDR0 = (uint8_t)(W_Framebuff->frame_id >> 3);
    37.                         MSCAN->TSIDR1 = (uint8_t)(W_Framebuff->frame_id << 5);

    38.                         if (W_Framebuff->frame_type == RemoteFrameWithStandardId)
    39.                         {
    40.                                 /*
    41.                                  * If caller wants to send a remote packet, set the
    42.                                  * respective bit in CANx->SIDR1, and set the TDLR
    43.                                  * to be 0 (the remote packet has no data).
    44.                                  */
    45.                                 MSCAN->TSIDR1 |= MSCAN_TSIDR1_TSRTR_MASK;

    46.                                 /* The data length should be 0 */
    47.                                 MSCAN->TDLR = 0;
    48.                         }
    49.                         else
    50.                         {
    51.                                 MSCAN->TSIDR1 &= ~MSCAN_TSIDR1_TSRTR_MASK;
    52.                                 /*
    53.                                  * If caller wants to send a data packet, set the
    54.                                  * TDLR to be equal to the actual data length
    55.                                  */
    56.                                 MSCAN->TDLR = W_Framebuff->data_length;

    57.                                 /* Load the actual data to the Transmit Extended Data Segment Register */
    58.                                 for (i = 0; i < W_Framebuff->data_length; i++)
    59.                                 {
    60.                                         MSCAN->TEDSR[i] = W_Framebuff->data[i];
    61.                                 }
    62.                         }
    63.                 }
    64.                 else if ((W_Framebuff->frame_type == RemoteFrameWithExtendedId)
    65.                           || (W_Framebuff->frame_type == DataFrameWithExtendedId))
    66.                 {
    67.                         /* When caller wants to send a frame with ExtendedID,
    68.                          * the TEIDE bit of MSCAN_TEIDR1 register should be set to 1 */
    69.                         MSCAN->TEIDR1 = MSCAN_TEIDR1_TEIDE_MASK;

    70.                         /* If caller wants to send a packet with standard id, firstly
    71.                          * ensure the id not to be exceed 29 bits.
    72.                          */
    73.                         if (W_Framebuff->frame_id > 0x1FFFFFFF)
    74.                         {
    75.                                 return -1;
    76.                         }

    77.                         MSCAN->TEIDR0 = (uint8_t)((W_Framebuff->frame_id) >> 21);

    78.                         temp1 = (uint8_t)((W_Framebuff->frame_id) >> 18) & 0x07;
    79.                         temp2 = (uint8_t)((W_Framebuff->frame_id) >> 15) & 0x07;
    80.                         /* Attention:The TSRR bit is used only in extended format.
    81.                          * It must be set to 1 by the user for transmission buffers
    82.                          */
    83.                         MSCAN->TEIDR1 |= (temp1 << 5) | temp2 | MSCAN_TEIDR1_TSRR_MASK;

    84.                         MSCAN->TEIDR2 = (uint8_t)((W_Framebuff->frame_id) >> 7);

    85.                         temp3 = (uint8_t)W_Framebuff->frame_id & 0x7Fu;
    86.                         MSCAN->TEIDR3 = MSCAN_TEIDR3_TEID6_TEID0(temp3);

    87.                         if (W_Framebuff->frame_type == RemoteFrameWithExtendedId)
    88.                         {
    89.                                 MSCAN->TEIDR3 |= MSCAN_TEIDR3_TERTR_MASK;

    90.                                 MSCAN->TDLR = 0;
    91.                         }
    92.                         else
    93.                         {
    94.                                 MSCAN->TEIDR3 &= ~MSCAN_TEIDR3_TERTR_MASK;

    95.                                 MSCAN->TDLR = W_Framebuff->data_length;

    96.                                 for (i = 0; i < W_Framebuff->data_length; i++)
    97.                                 {
    98.                                         MSCAN->TEDSR[i] = W_Framebuff->data[i];
    99.                                 }
    100.                         }
    101.                 }
    102.                 else
    103.                 {
    104.                         return -1;
    105.                 }

    106.                 /*
    107.                  * The purpose is to clear the respective bit,
    108.                  * according to the KEAZ128RM, it should be done
    109.                  * by writing 1 but not 0.
    110.                  */
    111.                 MSCAN->CANTFLG = MSCAN->CANTBSEL;

    112.                 return 0;
    113.         }
    114.        
    115.         return -1;
    复制代码
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 04:23 , Processed in 0.099919 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表