打印
[STM32F1]

双CAN通信

[复制链接]
888|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
北辰极界|  楼主 | 2021-1-26 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大神,有没有使用过STM32的双路CAN,看手册及实际调试使用,得出结论应该是不能双路CAN使用不同的通信速率,想咨询各位大神给予指点 ,是否有什么解决办法?还是我没理解好,是可以使用不同的通信速率

使用特权

评论回复
评论
xiaofei558008 2021-1-29 17:01 回复TA
两个CAN都可以单独配置的,只是CAN2的过滤器在CAN1的寄存器那边,从14开始;其他都分开的; 
沙发
diweo| | 2021-1-26 12:33 | 只看该作者
把BTR寄存器设不同的值,不就不同速率了?

使用特权

评论回复
评论
北辰极界 2021-1-27 16:58 回复TA
有没有具体的代码展示一下呢说明一下 
板凳
lvyunzeng| | 2021-1-26 16:12 | 只看该作者
你使用的是什么芯片F105吗?双路CAN可以设置不同的波特率,当时使用的都不高,一路100K另外一路500K的。
你是啥需求呢?自己测试玩,还是有实际项目需求,建议统一CAN的波特率,在优先级上做**。汽车的CAN波特率都是一致的。

使用特权

评论回复
地板
北辰极界|  楼主 | 2021-1-27 16:57 | 只看该作者
lvyunzeng 发表于 2021-1-26 16:12
你使用的是什么芯片F105吗?双路CAN可以设置不同的波特率,当时使用的都不高,一路100K另外一路500K的。
你 ...

项目使用的  由于需要兼容不同的波特率平台  所以两路对内的可以不改变但是对外的会改变  这个具体怎么设置能否指点一下

使用特权

评论回复
5
北辰极界|  楼主 | 2021-1-27 17:01 | 只看该作者
diweo 发表于 2021-1-26 12:33
把BTR寄存器设不同的值,不就不同速率了?

void CAN1_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    /* 打开GPIO时钟、AFIO时钟,CAN时钟 */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);


          /* CAN1 RX PB8 */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                /* CAN1 TX PB9 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                                                       
                                                                 
    /* CAN  BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
          CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);   

    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;
    CAN_InitStructure.CAN_TXFP=DISABLE;
    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;   
    CAN_InitStructure.CAN_SJW=sjw;
    CAN_InitStructure.CAN_BS1=bs1;  
    CAN_InitStructure.CAN_BS2=bs2;       
    CAN_InitStructure.CAN_Prescaler=pres;
   

    CAN_Init(CAN1,&CAN_InitStructure);        // CAN1                                                                                       

    CAN_FilterInitStructure.CAN_FilterNumber=0;         
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                        // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                               
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                // 过滤器屏蔽标识符
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;         // FIFO0指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  // CAN1
               
                /* CAN1 Enabling interrupt */                                                                          
    NVIC_InitStructure.NVIC_IRQChannel=CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);               

}

/*****************************************
  CAN2 Config
  FIFO_1          
  返回:
*****************************************/
void CAN2_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    /* 打开GPIO时钟、AFIO时钟,CAN时钟 */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

       
                /* CAN2 RX PB12 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
                /* CAN2 TX PB13 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);               
       
                                                                 

    /* CAN  BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
          CAN_DeInit(CAN2);
    CAN_StructInit(&CAN_InitStructure);   

    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;
    CAN_InitStructure.CAN_TXFP=DISABLE;
    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;   
    CAN_InitStructure.CAN_SJW=sjw;
    CAN_InitStructure.CAN_BS1=bs1;  
    CAN_InitStructure.CAN_BS2=bs2;       
    CAN_InitStructure.CAN_Prescaler=pres;

    CAN_Init(CAN2,&CAN_InitStructure);   // CAN2                                                                                                       

    CAN_FilterInitStructure.CAN_FilterNumber=14;        //
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                        // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                               
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                // 过滤器屏蔽标识符
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO1;         // FIFO1指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

          CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE);  // CAN2
       
                /* CAN2 Enabling interrupt */                                                                           
    NVIC_InitStructure.NVIC_IRQChannel=CAN2_RX1_IRQn;        // FIFO_1
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);       
}
这是我的初始化代码 当时参考一个例程写的

使用特权

评论回复
6
北辰极界|  楼主 | 2021-1-27 17:02 | 只看该作者
lvyunzeng 发表于 2021-1-26 16:12
你使用的是什么芯片F105吗?双路CAN可以设置不同的波特率,当时使用的都不高,一路100K另外一路500K的。
你 ...

void CAN1_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    /* 打开GPIO时钟、AFIO时钟,CAN时钟 */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);


          /* CAN1 RX PB8 */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                /* CAN1 TX PB9 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);
                                                       
                                                                 
    /* CAN  BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
          CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);   

    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;
    CAN_InitStructure.CAN_TXFP=DISABLE;
    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;   
    CAN_InitStructure.CAN_SJW=sjw;
    CAN_InitStructure.CAN_BS1=bs1;  
    CAN_InitStructure.CAN_BS2=bs2;       
    CAN_InitStructure.CAN_Prescaler=pres;
   

    CAN_Init(CAN1,&CAN_InitStructure);        // CAN1                                                                                       

    CAN_FilterInitStructure.CAN_FilterNumber=0;         
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                        // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                               
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                // 过滤器屏蔽标识符
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;         // FIFO0指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  // CAN1
               
                /* CAN1 Enabling interrupt */                                                                          
    NVIC_InitStructure.NVIC_IRQChannel=CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);               

}

/*****************************************
  CAN2 Config
  FIFO_1          
  返回:
*****************************************/
void CAN2_Config(uint8_t sjw,uint8_t bs1,uint8_t bs2,uint16_t pres)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    /* 打开GPIO时钟、AFIO时钟,CAN时钟 */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

       
                /* CAN2 RX PB12 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
                /* CAN2 TX PB13 */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);               
       
                                                                 

    /* CAN  BaudRate = RCC_APB1PeriphClock/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler */
          CAN_DeInit(CAN2);
    CAN_StructInit(&CAN_InitStructure);   

    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;
    CAN_InitStructure.CAN_TXFP=DISABLE;
    CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;   
    CAN_InitStructure.CAN_SJW=sjw;
    CAN_InitStructure.CAN_BS1=bs1;  
    CAN_InitStructure.CAN_BS2=bs2;       
    CAN_InitStructure.CAN_Prescaler=pres;

    CAN_Init(CAN2,&CAN_InitStructure);   // CAN2                                                                                                       

    CAN_FilterInitStructure.CAN_FilterNumber=14;        //
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         // 标识符屏蔽位模式
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   // 32位过滤器
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                        // 过滤器标识符
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                               
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                // 过滤器屏蔽标识符
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO1;         // FIFO1指向过滤器
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);

          CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE);  // CAN2
       
                /* CAN2 Enabling interrupt */                                                                           
    NVIC_InitStructure.NVIC_IRQChannel=CAN2_RX1_IRQn;        // FIFO_1
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);       
}
您看一下我的代码  应该怎么改 如果两个用的不同速率是否会有什么问题  我使用的是105的芯片

使用特权

评论回复
7
北辰极界|  楼主 | 2021-1-27 17:23 | 只看该作者
diweo 发表于 2021-1-26 12:33
把BTR寄存器设不同的值,不就不同速率了?

之前尝试将两路CAN的波特率改为不一致  结果不能实现  今天又尝试了一下竟然可以了非常奇怪

使用特权

评论回复
8
北辰极界|  楼主 | 2021-1-27 17:24 | 只看该作者
lvyunzeng 发表于 2021-1-26 16:12
你使用的是什么芯片F105吗?双路CAN可以设置不同的波特率,当时使用的都不高,一路100K另外一路500K的。
你 ...

之前尝试将两路CAN的波特率改为不一致  结果不能实现  今天又尝试了一下竟然可以了非常奇怪   还是要请教一下前辈  您使用不同的速率是否出现过什么问题

使用特权

评论回复
9
diweo| | 2021-1-28 17:02 | 只看该作者
请仔细检查代码,说不定是哪里犯了低级错误。

使用特权

评论回复
评论
北辰极界 2021-1-29 11:23 回复TA
应该是的 
10
kxsi| | 2021-2-5 23:04 | 只看该作者
单路我都还没有调通啊

使用特权

评论回复
11
nawu| | 2021-2-5 23:05 | 只看该作者
个人感觉can真的挺难调试的

使用特权

评论回复
12
qcliu| | 2021-2-5 23:08 | 只看该作者
卡壳了  并且真的解决不了

使用特权

评论回复
13
tfqi| | 2021-2-5 23:11 | 只看该作者
这样要是容易混淆问题  一端单片机一端一个can收发器 这样比较容易排除问题

使用特权

评论回复
14
wiba| | 2021-2-5 23:14 | 只看该作者
弱点调试就是这么不讲道理 微观世界咱们不懂啊

使用特权

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

本版积分规则

31

主题

141

帖子

0

粉丝