基于can总线的温度测控系统的设计本科本科毕业论文 联系客服

发布时间 : 星期一 文章基于can总线的温度测控系统的设计本科本科毕业论文更新完毕开始阅读60fbdd44773231126edb6f1aff00bed5b9f373d0

烟台南山学院毕业设计(论文) 第 36 页

CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN硬件工作在正常模式 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位 CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //时间段1为8个时间单位 CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; //时间段2为7个时间单位 CAN_InitStructure.CAN_Prescaler=9; //(pclk1/((1+8+7)*9))=36MHZ/16/9=250Kbits 设定了一个时间单位的长度9

CAN_Init(&CAN_InitStructure); (4)CAN滤波器初始化:

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位位宽时为其高段位,16位位宽时为第一个)

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //用来设定滤波器标识符(32位位宽时为其低段位,16位位宽时为第二个)

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; //设定滤波器屏蔽标识符(32位位宽时为其高段位,16位位宽时为第一个)

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; //设定滤波器屏蔽标识符(32位位宽时为其低段位,16位位宽时为第二个)

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //设定指向滤波器的FIFO0

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能滤波器 CAN_FilterInit(&CAN_FilterInitStructure);

CAN_ITConfig(CAN_IT_FMP0,ENABLE); //使能指定的CAN中断 2、CAN发送函数

(1)选择一个空的发送邮箱:

if((CAN->TSR&TSR_TME0)==TSR_TME0)

烟台南山学院毕业设计(论文) 第 37 页

TransmitMailbos=0;

else if((CAN->TSR&TSR_TME1)==TSR_TME1) TransmitMailbox=1;

else if((CAN->TSR&TSR_TME2)==TSR_TME2) TransmitMailbox=2;

else TransmitMailbox=CAN_NO_MB;

在TransmitMailbox=CAN_NO_MB的条件下设置ID; CAN->sTxMailBox[TransmitMailbox].TIR&=TMIDxR_TXRQ; If(TxMessage->IDE==CAN_ID_STD) TxMessage->StdId&=(u32)0x000007FF; TxMessage->StdId=TxMessage->StdId<<21;

CAN->sTxMailBox[TransmitMailbox].TIR|=(TxMssage->StdId|TxMessage->IDE|TxMessage->RTR);

else TxMessage->ExtId<<=3;

CAN->sTxMailBox[TransmitMailbox].TIR|=(TxMessage->ExtId|TxMessage->IDE|TxMessage->RTR);

(2)设置DLC:

TxMessage->DLC&=(u8)0x0000000F;

CAN->sTxMailBox[TransmitMailbox].TDTR&=(u32)0xFFFFFFF0; CAN->sTxMailBox[TransmitMailbox].TDTR|=TxMessage->DLC; (3)设置数据帧的长度:

CAN->sTxMailBox[TransmitMailbox].TDTR=((u32)TxMessage->Data[3]<<24)| ((u32)TxMessage->Data[2]<<16)|

((u32)TxMessage->Data[1]<<8)| ((u32)TxMessage->Data[0]));

CAN->sTxMailBox[TransmitMailbox].TDHR=((u32)TxMessage->Data[7]<<24)|

((u32)TxMessage->Data[6]<<16)| ((u32)TxMessage->Data[5]<<8)| ((u32)TxMessage->Data[4]));

烟台南山学院毕业设计(论文) 第 38 页

(4)请求发送语句:

CAN->sTxMailBox[TransmitMailbox].TIR|=TMIDxR_TXRQ; (5)最后返回TransmitMailbox; 3、CAN接收函数 (1)获取ID:

RxMessage->IDE=(u8)0x04&CAN->sFIFOMailBox[FIFONumber].RIR; If(RxMessage->IDE==CAN_ID_STD)

RxMessage->StdId=(u32)0x000007FF&(CAN->sFIFOMailBox[FIFONumber].RIR>>21)

else

RxMessage->ExtId=(u32)0x1FFFFFFF&(CAN->sFIFOMailBox[FIFONumber].RIR>>3)

RxMessage->RTR=(u8)0x02&(CAN->sFIFOMailBox[FIFONumber].RIR; (2)得到DLC和FMI:

RxMessage->DLC=(u8)0x0F&CAN->sFIFOMailBox[FIFONumber].RDTR; RxMessage->FMI=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDTR>>8); (3)解析数据帧:

RxMessage->Data[0]=(u8)0xFF&CAN->sFIFOMailBox[FIFONumber].RDLR; RxMessage->Data[1]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDLR>>8); RxMessage->Data[2]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDLR>>16);

RxMessage->Data[3]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDLR>>24);

RxMessage->Data[4]=(u8)0xFF&CAN->sFIFOMailBox[FIFONumber].RDHR; RxMessage->Data[5]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDHR>>8); RxMessage->Data[6]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDHR>>16);

RxMessage->Data[7]=(u8)0xFF&(CAN->sFIFOMailBox[FIFONumber].RDHR>>24);

烟台南山学院毕业设计(论文) 第 39 页

(4)最后返回FIFO:

CAN_FIFORelease(FIFONumber); 附录C:转换器的软件设计

1、CAN发送的部分函数: void CAN_SEND() //发送数据部分 byte i,p;

p=CAN[CAN_SR]; //状态位 if(p&0x04) {

p=CAN_TXB; //p指向发送缓存首址 for(i=0;i<10;i++)CAN[p++]=TXB[i]; CAN[CAN_CMR]=0X01; //请求发送 }

2、CAN接收的部分函数

Void CAN_INT()interrupt 0 using 1 //接收中断 p=CAN[CAN_IR]; if(p&0x01) {

p=CAN_RXB; for(i=0;i<10;i++) {

RXB[i]=CAN[p++]; }}

CAN[CAN_CMR]=0x04; //释放接收缓存 CANBUS=1;

3、CAN初始化部分函数:

CAN[CAN_CR]=0x01; //控制寄存器写入控制字0x01 CAN[CAN_ACR]=0x03; //接收代码寄存器地址 CAN[CAN_AMR]=0x00; //接收屏蔽寄存器设置为0x00