打印
[STM32F4]

stm32F407的CAN2调试有问题

[复制链接]
13133|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位同仁,本人刚刚接触stm32F407,在调试双CAN的时候,CAN1收发正常,CAN2不正常。
具体症状:
1.main函数运行到CAN_Transmit(CAN2, &TxMessage_CAN2)时,总线上显示CAN2一直在发送数据,可我写的程序明明是只执行一次,难道是触发了CAN的重发机制??在哪里触发的??
2.通过PC机给CAN2发数据时,上位机总是显示“发送错误”;同时,下位机的stm32F407 也一直进不去接收中断。
折腾了3天了,还是是搞不定,烦请高手指点一下。


static void CAN_Config_CAN2(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;

         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_CAN2);
         GPIO_PinAFConfig(GPIOB,GPIO_PinSource6, GPIO_AF_CAN2);

        /* Configure CAN2 RX and TX pins */
         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5 ;  //CAN2_RX
         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
         GPIO_Init(GPIOB,&GPIO_InitStructure);

         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;   //CAN2_TX
         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
         GPIO_Init(GPIOB,&GPIO_InitStructure);

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
        CAN_DeInit(CAN2);

         /*CAN cell init */
         CAN_InitStructure.CAN_TTCM= DISABLE;      //禁止时间触发通信方式
         CAN_InitStructure.CAN_ABOM= DISABLE;     //禁止总线自动关闭
         CAN_InitStructure.CAN_AWUM= DISABLE;    //禁止自动唤醒
         CAN_InitStructure.CAN_NART= DISABLE;        //禁止自动重发(设置成使能 发不出数)
         CAN_InitStructure.CAN_RFLM= DISABLE;        //禁止接收FIFO锁定
         CAN_InitStructure.CAN_TXFP= DISABLE;
         CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;
         CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq;

        /* CAN Baudrate = 1MBps (CAN clocked at 42MHz)*/
         CAN_InitStructure.CAN_BS1= CAN_BS1_6tq;
         CAN_InitStructure.CAN_BS2= CAN_BS2_7tq;
         CAN_InitStructure.CAN_Prescaler= 3;

         InitStatus_CAN2=CAN_Init(CAN2,&CAN_InitStructure);
         /*CAN2 filter init */
         CAN_FilterInitStructure_CAN2.CAN_FilterNumber   = 14;
         CAN_FilterInitStructure_CAN2.CAN_FilterMode = CAN_FilterMode_IdMask;
         CAN_FilterInitStructure_CAN2.CAN_FilterScale    = CAN_FilterScale_32bit;
         CAN_FilterInitStructure_CAN2.CAN_FilterIdHigh   = 0x0000;
         CAN_FilterInitStructure_CAN2.CAN_FilterIdLow    = 0x0000;
         CAN_FilterInitStructure_CAN2.CAN_FilterMaskIdHigh= 0x0000;
         CAN_FilterInitStructure_CAN2.CAN_FilterMaskIdLow  = 0x0000;
         CAN_FilterInitStructure_CAN2.CAN_FilterFIFOAssignment= 0;
         CAN_FilterInitStructure_CAN2.CAN_FilterActivation     = ENABLE;
         CAN_FilterInit(&CAN_FilterInitStructure_CAN2);

         /*CAN2 Transmit Structure preparation */
         TxMessage_CAN2.StdId= ID_Transmit_CAN2;//ID
         TxMessage_CAN1.ExtId= 0x00;
         TxMessage_CAN2.RTR= CAN_RTR_DATA;           //数据帧
         TxMessage_CAN2.IDE= CAN_ID_STD;         //标准ID
         TxMessage_CAN2.DLC= 8;

         CAN_ITConfig(CAN2,CAN_IT_FMP0, ENABLE);
}

static void NVIC_Config_CAN2(void)
{

         NVIC_InitTypeDef  NVIC_InitStructure_CAN2;
         //CAN2中断初始化
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
         NVIC_InitStructure_CAN2.NVIC_IRQChannel                                    = CAN2_RX0_IRQn;
         NVIC_InitStructure_CAN2.NVIC_IRQChannelPreemptionPriority= 0x0;
         NVIC_InitStructure_CAN2.NVIC_IRQChannelSubPriority                = 0x00;
         NVIC_InitStructure_CAN2.NVIC_IRQChannelCmd                                     = ENABLE;
         NVIC_Init(&NVIC_InitStructure_CAN2);
}


int main(void)
{
         inti=2;

         Init_RxMes(&RxMessage_1);

         Init_RxMes(&RxMessage_2);


         NVIC_Config_CAN2();

         CAN_Config_CAN2();      

         TxMessage_CAN2.Data[0]= 0x11;
         TxMessage_CAN2.Data[1]= 0x22;  
         TxMessage_CAN2.Data[2]= 0x33;  
         TxMessage_CAN2.Data[3]= 0x44;
         TxMessage_CAN2.Data[4]= 0x55;
         TxMessage_CAN2.Data[5]= 0x66;
         TxMessage_CAN2.Data[6]= 0x77;
         TxMessage_CAN2.Data[7]= 0x88;

         CAN2_transmit_mailbox= CAN_Transmit(CAN2, &TxMessage_CAN2);

         Status_CAN2_transmit  =CAN_TransmitStatus(CAN2,CAN2_transmit_mailbox);

   while (1)
  {
         TxMessage_CAN2.Data[0]= 0x11;
         TxMessage_CAN2.Data[1]= 0x22;  
         TxMessage_CAN2.Data[2]= 0x33;  
         TxMessage_CAN2.Data[3]= 0x44;
         TxMessage_CAN2.Data[4]= 0x55;
         TxMessage_CAN2.Data[5]= 0x66;
         TxMessage_CAN2.Data[6]= 0x77;
         TxMessage_CAN2.Data[7]= 0x88;

status_CAN2_FLAG=CAN_GetFlagStatus(CAN2,CAN_FLAG_FMP0);
status_can2_IT  =CAN_GetITStatus(CAN2,CAN_IT_FMP0);
  }
}

沙发
yong_ning100| | 2014-3-11 14:05 | 只看该作者
重新理解下CAN_NART这个

使用特权

评论回复
板凳
一片冰心在玉壶|  楼主 | 2014-3-11 15:01 | 只看该作者
yong_ning100 发表于 2014-3-11 14:05
重新理解下CAN_NART这个

多谢你的提点,我的注释有问题,那条程序还是对的。
现在已经调试成功,原因如下:
1.我怀疑是跟MCU的CAN_RX引脚虚焊有关,重新把CAN引脚焊了一下
2.NVIC_Config_CAN2(void)函数中,屏蔽函数NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
通过以上尝试,双CAN已经好用。

使用特权

评论回复
地板
yong_ning100| | 2014-3-11 15:54 | 只看该作者
一片冰心在玉壶 发表于 2014-3-11 15:01
多谢你的提点,我的注释有问题,那条程序还是对的。
现在已经调试成功,原因如下:
1.我怀疑是跟MCU的CAN ...

那应该是虚焊了,设置中断向量表那条函数不屏蔽试试有没有问题?

使用特权

评论回复
5
一片冰心在玉壶|  楼主 | 2014-3-11 21:12 | 只看该作者
yong_ning100 发表于 2014-3-11 15:54
那应该是虚焊了,设置中断向量表那条函数不屏蔽试试有没有问题?

试过,如果不屏蔽NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0)就进不去中断

使用特权

评论回复
6
zxm19820916| | 2014-6-9 16:53 | 只看该作者
这个函数是设置向量表所在的位置。如果定义了VECT_TAB_RAM,则需要这个函数,否则需要NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

使用特权

评论回复
7
15113484470| | 2015-1-7 16:43 | 只看该作者
我也是遇到同样的问题了,407CAN2可以发送,不能接收,不知道啥原因,楼主试了can2的接收了吗

使用特权

评论回复
8
1712032162| | 2015-5-24 10:19 | 只看该作者
15113484470 发表于 2015-1-7 16:43
我也是遇到同样的问题了,407CAN2可以发送,不能接收,不知道啥原因,楼主试了can2的接收了吗 ...

请问您是怎么解决的,这个问题困扰了我好多天了,急

使用特权

评论回复
9
15113484470| | 2015-5-25 18:24 | 只看该作者
1712032162 发表于 2015-5-24 10:19
请问您是怎么解决的,这个问题困扰了我好多天了,急

我调好了,上个源码,can2的话设置过滤器号为14就好了
红龙407_can1 to can2 NORMAL模式(2015.03.02).rar (729.71 KB)

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
757succ + 1 很给力!
10
asicfpga| | 2015-8-13 11:55 | 只看该作者
  正要用

使用特权

评论回复
11
soyshell| | 2016-3-3 13:51 | 只看该作者
谢谢9楼的指教!

使用特权

评论回复
12
leonliu_1128| | 2016-3-4 23:58 | 只看该作者
mark

使用特权

评论回复
13
TECHWELL| | 2016-3-23 14:03 | 只看该作者
  1 . 若只用CAN2,你也必须开启CAN1的时钟!否则,CAN2的过滤寄存器、发送邮箱无法操作!对此,stm32f4xx_hal_can.c文件中,是有明确的说明的(In case you are using CAN2 only, you have to enable the CAN1 clock)。
       但是,在参考资料手册中,好象没有指出这一点,ST手册坑爹!
  2 . HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig),居然没有引用参数hcan,而是直接用CAN1.我以为是MCD Application Team犯晕,私下把
       hcan改成CAN->instance,实际上行不通!这大概是个怪胎

使用特权

评论回复
14
qfggg| | 2017-3-14 19:19 | 只看该作者
顶---------------

使用特权

评论回复
15
moonlight12| | 2017-5-26 09:26 | 只看该作者
本帖最后由 moonlight12 于 2017-5-26 09:28 编辑
15113484470 发表于 2015-5-25 18:24
我调好了,上个源码,can2的话设置过滤器号为14就好了

请教一下,为什么设置成14就可以了呢?
实测确实没问题。
是不是st把主筛选器设成了0~13,从筛选器是14~27

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝