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

STM8S208C8T6 CAN 不能发送报文,接收没有应答

[复制链接]
Terabithia 提问时间:2017-12-16 11:55 /
求助!!!!!!我用STM8S208C8做的程序,烧录以后接收不到报文,MCU的TX脚也一直为高。
如果在CAN总线上接入另外一个USBCAN, 调试的时候就可以进入接收中断了,但是发送还是不成功,而且用示波器看MCU的TX脚还是一直为高电平,有大佬知道是因为什么吗~~~


以下为初始化代码:
void CAN_Config(void)
{
  CAN_InitStatus_TypeDef status = CAN_InitStatus_Failed;

  /* Filter Parameters */
  CAN_FilterNumber_TypeDef CAN_FilterNumber;
  FunctionalState CAN_FilterActivation;
  CAN_FilterMode_TypeDef CAN_FilterMode;
  CAN_FilterScale_TypeDef CAN_FilterScale;
  uint8_t CAN_FilterID1;
  uint8_t CAN_FilterID2;
  uint8_t CAN_FilterID3;
  uint8_t CAN_FilterID4;
  uint8_t CAN_FilterIDMask1;
  uint8_t CAN_FilterIDMask2;
  uint8_t CAN_FilterIDMask3;
  uint8_t CAN_FilterIDMask4;

  /* Init Parameters*/
  CAN_MasterCtrl_TypeDef CAN_MasterCtrl;
  CAN_Mode_TypeDef CAN_Mode;
  CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth;
  CAN_BitSeg1_TypeDef CAN_BitSeg1;
  CAN_BitSeg2_TypeDef CAN_BitSeg2;
  uint8_t CAN_Prescaler;  

  /* CAN register init */
  CAN_DeInit();
       
        /* CAN filter init */
  CAN_FilterNumber = CAN_FilterNumber_0;
  CAN_FilterActivation = ENABLE;
  CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterScale = CAN_FilterScale_32Bit;
  CAN_FilterID1=0;  
  CAN_FilterID2=0;
  CAN_FilterID3=0;
  CAN_FilterID4=0;
  CAN_FilterIDMask1=0;
  CAN_FilterIDMask2=0;
  CAN_FilterIDMask3=0;
  CAN_FilterIDMask4=0;  
  CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,\
                 CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,\
                 CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,\
                 CAN_FilterIDMask3, CAN_FilterIDMask4);

  /* CAN  init */
  CAN_MasterCtrl=CAN_MasterCtrl_AllDisabled;
  CAN_Mode = CAN_Mode_Normal;
  CAN_SynJumpWidth = CAN_SynJumpWidth_1TimeQuantum;
  CAN_BitSeg1 = CAN_BitSeg1_12TimeQuantum;
  CAN_BitSeg2 = CAN_BitSeg2_3TimeQuantum;
  CAN_Prescaler = 2;
  status = CAN_Init(CAN_MasterCtrl, CAN_Mode, CAN_SynJumpWidth, CAN_BitSeg1, \
                    CAN_BitSeg2, CAN_Prescaler);



  /* Enable Fifo message pending interrupt*/
  /* Message reception is done by CAN_RX ISR*/
  CAN_ITConfig(CAN_IT_FMP, ENABLE);
}


/***************************************************************************//**
* @brief     外设初始化函数.
* @return    无.
* @param     无.
* @warning   该函数将在进入主循环之前调用.
* *************************************************************************** */
static void AppL_PeriphInit(void)
{
        /*GPIO Init*/       
        GPIO_DeInit(GPIOE);
        GPIO_DeInit(GPIOD);
       
        GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_SLOW);/*Voice_Mute*/
        GPIO_Init(GPIOE,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);/*Voice_PWM2*/
        GPIO_Init(GPIOE,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);/*STB*/
        GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);/*LED*/
       
        /*Clock module init*/
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
       
        /*Can Controller Init*/
        CAN_Config();
}

/***************************************************************************//**
* @brief     CAN接收中断函数.
* @return    无.
* @param     无.
* @warning   中断函数.
* *************************************************************************** */
@far @interrupt void CAN_RX_IRQ(void)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        /* Receiver Receives Frame */
        uint32_t liId = 0;
       
        CAN_Id_TypeDef ide;
        CAN_RTR_TypeDef rtr;
        uint8_t data[8];
        uint8_t dlc,i,j;

        CAN_Receive();//读取缓存中的数据
       
        giTest = CAN_GetReceivedData(0);
       
        liId = CAN_GetReceivedId(); //读取帧ID
        ide  = CAN_GetReceivedIDE();//读取帧类型(标准或扩展)
        rtr  = CAN_GetReceivedRTR();//读取帧类型(数据或远程)
        dlc  = CAN_GetReceivedDLC();//读取接收到的数据字节数
       
  for(j=0;j<NUMBER_CAN_MSG;j++)
        {
                if((liId == guCanMsgBuffer[j].Id) && (dlc == guCanMsgBuffer[j].Length))
                {
                        for(i=0;i<dlc;i++)
                        {
                                guCanMsgBuffer[j].Data[i] = CAN_GetReceivedData(i);
                        }
                        guCanMsgBuffer[j].UpdatedFlag = 1;
                }
        }

}



收藏 评论2 发布时间:2017-12-16 11:55

举报

2个回答
单人戏 回答时间:2017-12-26 08:37:18
楼主,你的问题解决了么?能不能把你这部分的代码发给我看一下,谢谢了。
小小二毛 回答时间:2017-12-30 21:40:57
在CAN总线两线并联一个120欧的匹配电阻

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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