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

STM8AF开发板的CAN通信

[复制链接]
Austin.Gong 提问时间:2015-7-14 17:02 /
各位大神
       我是STM8的新手,最近买了两套STM8A-DISCOVERY开发板,基于STM8AF52芯片开发,原本想着将两块开发板的CAN口对接,进行一些通信测试,但发现无法实现CAN通信,一下是我的代码,请各位大神指点指点:

主循环中的实现:

main()
{
....
        CLK_Config();
        CAN_Config();

....
        while(1)
        {
                ...
                 /* Transmit Parameters*/
                Tx_Id = 0;
                Tx_IDE = CAN_Id_Standard;
                Tx_RTR = CAN_RTR_Data;
                Tx_DLC = 1;
                Tx_Data[0] = i;
                GPIO_WriteLow(GPIOA, (GPIO_Pin_TypeDef)GPIO_PIN_3);
                 /* Sender send Frame */
                status = CAN_Transmit(Tx_Id,Tx_IDE,Tx_RTR,Tx_DLC,Tx_Data);

                ...
         }
}

void CLK_Config(void)
{
  /* Initialization of the clock */
  /* Clock divider to HSI/1 */
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
}


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 CAN_FilterID1;
  UINT8 CAN_FilterID2;
  UINT8 CAN_FilterID3;
  UINT8 CAN_FilterID4;
  UINT8 CAN_FilterIDMask1;
  UINT8 CAN_FilterIDMask2;
  UINT8 CAN_FilterIDMask3;
  UINT8 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 CAN_Prescaler;  

  /* CAN register init */
  CAN_DeInit();

  /* CAN  init */
  CAN_MasterCtrl=CAN_MasterCtrl_AllDisabled;
  CAN_Mode = CAN_Mode_Normal;
  CAN_SynJumpWidth = CAN_SynJumpWidth_1TimeQuantum;
  CAN_BitSeg1 = CAN_BitSeg1_8TimeQuantum;
  CAN_BitSeg2 = CAN_BitSeg2_7TimeQuantum;
  CAN_Prescaler = 1;
  status = CAN_Init(CAN_MasterCtrl, CAN_Mode, CAN_SynJumpWidth, CAN_BitSeg1, \
                    CAN_BitSeg2, CAN_Prescaler);

  /* 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);

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


中断配置如下:

/**
  * @brief CAN RX Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(CAN_RX_IRQHandler, 8)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        /* Receiver Receives Frame */
        CAN_Receive();
}


同时在stm8_interrupt_vector.c文件中的中断向量表里修改如下:
        {0x82, (interrupt_handler_t)CAN_RX_IRQHandler}, /* irq8  */

将两块开发板CAN口对接,然后我通过调试器将断点设置在中断响应函数的CAN_Receive()一行,无任何中断响应。请问,这个CAN通信的问题有可能出在哪里?
收藏 评论3 发布时间:2015-7-14 17:02

举报

3个回答
jjj0701 回答时间:2015-7-14 17:18:34
我只知道有些引脚的第二功能需要配置选项字,不确定自己的代码能否使用的话还是直接使用别人的例程调通然后再对比自己的吧
Austin.Gong 回答时间:2015-7-14 17:34:17
jjj0701 发表于 2015-7-14 17:18
我只知道有些引脚的第二功能需要配置选项字,不确定自己的代码能否使用的话还是直接使用别人的例程调通然后 ...

我的代码就是引用网上下的demo code,只是不知道是不是自己操作哪里不当,或者引用别人代码时有遗漏的。请问你有CAN通信的可用代码吗?
Austin.Gong 回答时间:2015-7-15 22:53:45
顶起来~~谁能帮我解答一下。。或者能不能提供一个可以用的demo code让我参考一下?万分感谢。。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版