OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4019|回复: 2

STM32F4CAN通信遇到问题,请求大家指教。

[复制链接]

8

主题

22

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3033
金钱
3033
注册时间
2021-12-3
在线时间
181 小时
发表于 2022-1-9 12:59:40 | 显示全部楼层 |阅读模式
1金钱
探索者STM32F407开发板资料 资料盘(A盘)里的CAN通信实例中发送和接收都用的是标准ID(寄存器版),如果用扩展ID应怎么设置?
原设置只能接收标准数据帧,我现在想接收扩展帧数据。不知道怎么设置,希望能得到各位高手指教。谢谢!原初始化设置如下:应如何修改?
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
        u16 i=0;
        if(tsjw==0||tbs2==0||tbs1==0||brp==0)return 1;
        tsjw-=1;//先减去1.再用于设置
        tbs2-=1;
        tbs1-=1;
        brp-=1;

        RCC->AHB1ENR|=1<<0;          //使能PORTA口时钟
        GPIO_Set(GPIOA,PIN11|PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA11,PA12,复用功能,上拉输出
        GPIO_AF_Set(GPIOA,11,9);//PA11,AF9
        GPIO_AF_Set(GPIOA,12,9);//PA12,AF9           

        RCC->APB1ENR|=1<<25;//使能CAN1时钟 CAN1使用的是APB1的时钟(max:42M)
        CAN1->MCR=0x0000;        //退出睡眠模式(同时设置所有位为0)
        CAN1->MCR|=1<<0;                //请求CAN进入初始化模式
        while((CAN1->MSR&1<<0)==0)
        {
                i++;
                if(i>100)return 2;//进入初始化模式失败
        }
        CAN1->MCR|=0<<7;                //非时间触发通信模式
        CAN1->MCR|=0<<6;                //软件自动离线管理
        CAN1->MCR|=0<<5;                //睡眠模式通过软件唤醒(清除CAN1->MCR的SLEEP位)
        CAN1->MCR|=1<<4;                //禁止报文自动传送
        CAN1->MCR|=0<<3;                //报文不锁定,新的覆盖旧的
        CAN1->MCR|=0<<2;                //优先级由报文标识符决定
        CAN1->BTR=0x00000000;        //清除原来的设置.
        CAN1->BTR|=mode<<30;        //模式设置 0,普通模式;1,回环模式;
        CAN1->BTR|=tsjw<<24;         //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
        CAN1->BTR|=tbs2<<20;         //Tbs2=tbs2+1个时间单位
        CAN1->BTR|=tbs1<<16;        //Tbs1=tbs1+1个时间单位
        CAN1->BTR|=brp<<0;          //分频系数(Fdiv)为brp+1
                                                        //波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv) 42m/((9+2+1)*28)=125k
        CAN1->MCR&=~(1<<0);                //请求CAN退出初始化模式
        while((CAN1->MSR&1<<0)==1)
        {
                i++;
                if(i>0XFFF0)return 3;//退出初始化模式失败
        }
        //过滤器初始化
        CAN1->FMR|=1<<0;                //过滤器组工作在初始化模式
        CAN1->FA1R&=~(1<<0);        //过滤器0不激活
        CAN1->FS1R|=1<<0;                 //过滤器位宽为32位.
        CAN1->FM1R|=0<<0;                //过滤器0工作在标识符屏蔽位模式
        CAN1->FFA1R|=0<<0;                //过滤器0关联到FIFO0
        CAN1->sFilterRegister[0].FR1=0X00000000;//32位ID
        CAN1->sFilterRegister[0].FR2=0X00000000;//32位MASK
        CAN1->FA1R|=1<<0;                //激活过滤器0
        CAN1->FMR&=0<<0;                //过滤器组进入正常模式

#if CAN1_RX0_INT_ENABLE
        //使用中断接收
        CAN1->IER|=1<<1;                //FIFO0消息挂号中断允许.            
        MY_NVIC_Init(1,0,CAN1_RX0_IRQn,2);//组2
#endif
        return 0;
}   

最佳答案

查看完整内容[请看2#楼]

https://blog.csdn.net/hanchaoman/article/details/72846895
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2020-8-19
在线时间
335 小时
发表于 2022-1-9 12:59:41 | 显示全部楼层
回复

使用道具 举报

8

主题

22

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3033
金钱
3033
注册时间
2021-12-3
在线时间
181 小时
 楼主| 发表于 2022-1-14 08:14:44 | 显示全部楼层
bin133 发表于 2022-1-9 12:59
https://blog.csdn.net/hanchaoman/article/details/72846895

非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 06:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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