搜索
查看: 1719|回复: 2

[已解决] STM8S208C8T6 CAN 不能发送报文,接收没有应答

[复制链接]

该用户从未签到

1

主题

3

帖子

0

蝴蝶豆

新手上路

最后登录
2019-1-19
发表于 2017-12-16 11:55:09 | 显示全部楼层 |阅读模式
求助!!!!!!我用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;
                }
        }

}



回复

使用道具 举报

该用户从未签到

0

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2018-1-2
发表于 2017-12-26 08:37:18 | 显示全部楼层
楼主,你的问题解决了么?能不能把你这部分的代码发给我看一下,谢谢了。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2018-6-11
发表于 2017-12-30 21:40:57 | 显示全部楼层
在CAN总线两线并联一个120欧的匹配电阻

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 10:24 , Processed in 1.175020 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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