CAN驱动代码

#include "can.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
// 
//CAN驱动代码       
// 
//CAN初始化
//tsjw:重新同步跳跃时间单元.范围:1~3;
//tbs2:时间段2的时间单元.范围:1~8;
//tbs1:时间段1的时间单元.范围:1~16;
//brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
//注意以上参数任何一个都不能设为0,否则会乱.
//波特率=Fpclk1/((tbs1+tbs2+1)*brp);
//mode:0,普通模式;1,回环模式;
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
//则波特率为:36M/((8+7+1)*5)=450Kbps
//返回值:0,初始化OK;
//    其他,初始化失败;
u8 CAN_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->APB2ENR|=1<<2;    //使能PORTA时钟 
 GPIOA->CRH&=0XFFF00FFF;
 GPIOA->CRH|=0X000B8000;//PA11 RX,PA12 TX推挽输出    
    GPIOA->ODR|=3<<11;
        
 RCC->APB1ENR|=1<<25;//使能CAN时钟 CAN使用的是APB1的时钟(max:36M)
 CAN->MCR=0x0000; //退出睡眠模式(同时设置所有位为0)
 CAN->MCR|=1<<0;  //请求CAN进入初始化模式
 while((CAN->MSR&1<<0)==0)
 {
  i++;
  if(i>100)return 2;//进入初始化模式失败
 }
 CAN->MCR|=0<<7;  //非时间触发通信模式
 CAN->MCR|=0<<6;  //软件自动离线管理
 CAN->MCR|=0<<5;  //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
 CAN->MCR|=1<<4;  //禁止报文自动传送
 CAN->MCR|=0<<3;  //报文不锁定,新的覆盖旧的
 CAN->MCR|=0<<2;  //优先级由报文标识符决定
 CAN->BTR=0x00000000;//清除原来的设置.
 CAN->BTR|=mode<<30; //模式设置 0,普通模式;1,回环模式;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值