»ùÓÚcan×ÜÏßµÄÎÂ¶È²â¿ØÏµÍ³µÄÉè¼Æ±¾¿Æ±¾¿Æ±ÏÒµÂÛÎÄ

2026/4/28 23:15:47

ÑĮ̀ÄÏɽѧԺ±ÏÒµÉè¼Æ(ÂÛÎÄ) µÚ 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


»ùÓÚcan×ÜÏßµÄÎÂ¶È²â¿ØÏµÍ³µÄÉè¼Æ±¾¿Æ±¾¿Æ±ÏÒµÂÛÎÄ.doc ½«±¾ÎĵÄWordÎĵµÏÂÔØµ½µçÄÔ
ËÑË÷¸ü¶à¹ØÓÚ£º »ùÓÚcan×ÜÏßµÄÎÂ¶È²â¿ØÏµÍ³µÄÉè¼Æ±¾¿Æ±¾¿Æ±ÏÒµÂÛÎÄ µÄÎĵµ
Ïà¹ØÍÆ¼ö
Ïà¹ØÔĶÁ
¡Á ÓοͿì½ÝÏÂÔØÍ¨µÀ£¨ÏÂÔØºó¿ÉÒÔ×ÔÓɸ´ÖƺÍÅŰ棩

ÏÂÔØ±¾ÎĵµÐèÒªÖ§¸¶ 10 Ôª

Ö§¸¶·½Ê½£º

¿ªÍ¨VIP°üÔ»áÔ± ÌØ¼Û£º29Ôª/ÔÂ

×¢£ºÏÂÔØÎĵµÓпÉÄÜ¡°Ö»ÓÐĿ¼»òÕßÄÚÈݲ»È«¡±µÈÇé¿ö£¬ÇëÏÂÔØÖ®Ç°×¢Òâ±æ±ð£¬Èç¹ûÄúÒѸ¶·ÑÇÒÎÞ·¨ÏÂÔØ»òÄÚÈÝÓÐÎÊÌ⣬ÇëÁªÏµÎÒÃÇЭÖúÄã´¦Àí¡£
΢ÐÅ£ºxuecool-com QQ£º370150219