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);
}
需要注意的是,过滤器最少要打开一个,如果一个都不打开,那么会一个数据都接收不到。