ÑĮ̀ÄÏɽѧԺ±ÏÒµÉè¼Æ(ÂÛÎÄ) µÚ 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·¢Ë͵IJ¿·Öº¯Êý£º 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½ÓÊյIJ¿·Öº¯Êý
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

