专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

stm32的CAN通信(环回模式)

作者:明入   来源:明入的博客   点击数:  更新时间:2014年05月18日   【字体:

用了周六日两天的时间把IIC学了一遍,因为不是使用的stm32的片上IIC外设,需要模拟时序,之前一直嫌麻烦,但麻烦也得学啊,想起一周前学的CAN通信,IIC简直是弱爆了。CAN通信可以多主机同时发送信息,加入IIC也这样那就出错误了,而且CAN的通信最大距离是10Km,首先CAN有两种国际标准ISO11898和IOS11519。stm32的CAN模块支持ISO11898。还有一个概念,就是显性和隐性。CAN共有两条线。CAN_high和CAN_low,在空闲状态时是程隐性的即高电平,当有设备发送数据时,需要发送一个起始帧,即一个显性位-逻辑0

第二个是仲裁段,11位的ID,注意这里的ID并不是地址,而是发送优先级,这和IIC是不一样的,正因为如此,所以理论上CAN总线上能挂无数个器件。
数据帧最多能装8个字节的数据
 
stm32的IIC
void can_init_state()
{
 RCC->APB1RSTR|=1<<25;//
 RCC->APB1RSTR&=~(1<<25);
 RCC->APB1ENR|=1<<25;//打开can时钟
 CAN1->MCR=0;
 CAN1->MCR|=1<<0;//进入初始化模式
 CAN1->BTR=0;
 CAN1->BTR|=1<<2;
 CAN1->BTR|=6<<16;  
 CAN1->BTR|=7<<20;
 CAN1->BTR|=1<<30;//允许环回模式
 CAN1->MCR&=~(1<<0);//退出初始化
}
 
void can_send_data(u32 data1,u32 data2,int n)
{
 CAN1->sTxMailBox[0].TIR&=~(1<<1);
 CAN1->sTxMailBox[0].TDTR=n;
 CAN1->sTxMailBox[0].TDLR=data1;
 if(n>4)
 {
  CAN1->sTxMailBox[0].TDHR=data2;
 }
  CAN1->sTxMailBox[0].TIR|=1<<0;
}
 
void can_filter_configuration()
{
 CAN1->FMR|=1<<0;//过滤组进入初始化
 CAN1->FA1R&=~(1<<0);
 CAN1->FM1R=0;
 CAN1->FS1R|=1<<0;
 CAN1->FFA1R&=~(1<<0);
 CAN1->sFilterRegister[0].FR1=0x00000000;
 CAN1->sFilterRegister[0].FR2=0x00000000;
 CAN1->FA1R|=1<<0;
 CAN1->FMR&=~(1<<0);
}
 
需要注意的是,过滤器最少要打开一个,如果一个都不打开,那么会一个数据都接收不到
关闭窗口

相关文章