STM32 CAN 控制器
时间:11-11
来源:互联网
点击:
Msg和结构体CanTxMsg比较接近,分别用来定义发送消息和描述接受消息,
5)CAN状态获取
对于CAN发送消息的状态,挂起消息数目等等之类的传输状态信息,库函数提供了一些列的函数,包括CAN_TransmitStatus()函数,CAN_MessagePending()函数,CAN_GetFlagStatus()函数等等,大家可以根据需要来调用。
- //CAN初始化
- //tsjw:重新同步跳跃时间单元.范围:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
- //tbs2:时间段2的时间单元.范围:1~8;
- //tbs1:时间段1的时间单元.范围:1~16; CAN_BS1_1tq ~CAN_BS1_16tq
- //brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
- //注意以上参数任何一个都不能设为0,否则会乱.
- //波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);
- //mode:0,普通模式;1,回环模式;
- //Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
- //则波特率为:36M/((1+8+7)*5)=450Kbps
- //返回值:0,初始化OK;
- // 其他,初始化失败;
- u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- #ifCAN_RX0_INT_ENABLE
- NVIC_InitTypeDef NVIC_InitStructure;
- #endif
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//使能CAN1时钟
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
- GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO
- //CAN单元设置
- CAN_InitStructure.CAN_TTCM=DISABLE;//非时间触发通信模式 //
- CAN_InitStructure.CAN_ABOM=DISABLE;//软件自动离线管理 //
- CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
- CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 //
- CAN_InitStructure.CAN_RFLM=DISABLE;//报文不锁定,新的覆盖旧的 //
- CAN_InitStructure.CAN_TXFP=DISABLE;//优先级由报文标识符决定 //
- CAN_InitStructure.CAN_Mode=mode;//模式设置: mode:0,普通模式;1,回环模式; //
- //设置波特率
- CAN_InitStructure.CAN_SJW=tsjw;//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
- CAN_InitStructure.CAN_BS1=tbs1;//Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
- CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~CAN_BS2_8tq
- CAN_InitStructure.CAN_Prescaler=brp;//分频系数(Fdiv)为brp+1//
- CAN_Init(CAN1,&CAN_InitStructure);// 初始化CAN1
- CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器0
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0
- CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
- #ifCAN_RX0_INT_ENABLE
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.
- NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;// 主优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;// 次优先级为0
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- return0;
- }
- #ifCAN_RX0_INT_ENABLE//使能RX0中断
- //中断服务函数
- voidUSB_LP_CAN1_RX0_IRQHandler(void)
- {
- CanRxMsg RxMessage;
- inti=0;
- CAN_Receive(CAN1,0,&RxMessage);
- for(i=0;i<8;i++)
- printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
- }
- #endif
- //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
- //len:数据长度(最大为8)
- //msg:数据指针,最大为8个字节.
- //返回值:0,成功;
- // 其他,失败;
- u8 Can_Send_Msg(u8*msg,u8 len)
- {
- u8 mbox;
- u16 i=0;
- CanTxMsg TxMessage;
- TxMessage.StdI
STM32CAN控制 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)