/************************************************************************ 函數(shù)名 :unsigned char CAN_Send_dat(CAN_DAT *can_tmp,unsigned char pir) 功能 :can發(fā)送 參數(shù) :*can_tmp 數(shù)據(jù)包 pir: 優(yōu)先級(jí) 0~3 返回 :1->緩沖池滿需要等待下次裝入發(fā)送緩沖池 0->成功放入緩沖池 ************************************************************************/ unsigned char CAN_Send_dat(CAN_DAT *can_tmp,unsigned char pir) { unsigned char n,flag; unsigned char temp; unsigned char *P_addr,*P_addr_temp; flag = 0; if((TXB0CON&0x08)==0) { P_addr = (unsigned char*)(&TXB0CON); flag = 1; } if((TXB1CON&0x08)==0) { P_addr = (unsigned char*)(&TXB1CON); flag = 1; } if((TXB2CON&0x08)==0) { P_addr = (unsigned char*)(&TXB2CON); flag = 1; } if(flag==1) { P_addr_temp = P_addr; *P_addr = pir; P_addr++; if(can_tmp->IDR_RTR&0x02)//擴(kuò)展標(biāo)識(shí)符 { *P_addr = ((can_tmp->ID[2]>>5)|(can_tmp->ID[3]<<3)); temp = can_tmp->ID[2]&0x03; temp|=((can_tmp->ID[2]&0x1C)<<3); temp|= 0x08; P_addr++; *P_addr = temp; P_addr++; *P_addr = can_tmp->ID[1]; P_addr++; *P_addr = can_tmp->ID[0]; P_addr++; } else { *P_addr = ((can_tmp->ID[1]<<5)|(can_tmp->ID[0]>>3));; P_addr++; *P_addr = (can_tmp->ID[0]<<5); P_addr+=3; } *P_addr = can_tmp->length; P_addr++; for(n=0;n<can_tmp->length;n++) { *P_addr =can_tmp->DATA[n]; P_addr++; } *P_addr_temp |= 0x08; return 0; } return 1; } /************************************************************************ 函數(shù)名 :unsigned char CAN_Send_dat(CAN_DAT *can_tmp,unsigned char pir) 功能 :can發(fā)送 參數(shù) :*can_tmp 數(shù)據(jù)包 pir: 優(yōu)先級(jí) 0~3 返回 :1->緩沖池滿需要等待下次裝入發(fā)送緩沖池 0->成功放入緩沖池 ************************************************************************/ unsigned char CAN_Send_dat(CAN_DAT *can_tmp,unsigned char pir) { unsigned char n; unsigned char temp; unsigned char *P_addr; if((TXB0CON&0x08)==0) { // TXB0CON&=0xfc; //bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit3=1擴(kuò)展標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位,bit7-5 擴(kuò)展ID[16-17] TXB0CON = pir;//|= pir; //設(shè)置TXB0為最高優(yōu)先級(jí)3 if(can_tmp->IDR_RTR&0x02)//擴(kuò)展標(biāo)識(shí)符 { TXB0EIDL = can_tmp->ID[0];//擴(kuò)展ID[0-7] TXB0EIDH = can_tmp->ID[1];//擴(kuò)展ID[8-15] TXB0SIDL = can_tmp->ID[2]&0x03;//擴(kuò)展ID[16-17] temp= ((can_tmp->ID[2]&0x1C)<<3); TXB0SIDL |= temp;//標(biāo)準(zhǔn)[0-3] TXB0SIDL |= 0x08; TXB0SIDH=((can_tmp->ID[2]>>5)|(can_tmp->ID[3]<<3));//標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 } else { TXB0SIDL = (can_tmp->ID[0]<<5);//標(biāo)準(zhǔn)[0-3] TXB0SIDH = ((can_tmp->ID[1]<<5)|(can_tmp->ID[0]>>3)); } //if(can_tmp->IDR_RTR&0x01)can_tmp->length|=0x40; TXB0DLC=can_tmp->length; P_addr = &TXB0D0; for(n=0;n<can_tmp->length;n++) { *P_addr =can_tmp->DATA[n]; P_addr++; } TXB0CON=TXB0CON|0x08; /* bit3(TXREQ)=1請(qǐng)求發(fā)送 */ return 0; } if((TXB1CON&0x08)==0) { // TXB1CON&=0xfc; TXB1CON = pir;//|= pir; if(can_tmp->IDR_RTR&0x02)//擴(kuò)展標(biāo)識(shí)符 { TXB1EIDL = can_tmp->ID[0];//擴(kuò)展ID[0-7] TXB1EIDH = can_tmp->ID[1];//擴(kuò)展ID[8-15] TXB1SIDL = can_tmp->ID[2]&0x03;//擴(kuò)展ID[16-17] temp= ((can_tmp->ID[2]&0x1C)<<3); TXB1SIDL |= temp;//標(biāo)準(zhǔn)[0-3] TXB1SIDL |= 0x08; TXB1SIDH=((can_tmp->ID[2]>>5)|(can_tmp->ID[3]<<3));//標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 } else { TXB1SIDL = (can_tmp->ID[0]<<5);//標(biāo)準(zhǔn)[0-3] TXB1SIDH = ((can_tmp->ID[1]<<5)|(can_tmp->ID[0]>>3)); } //if(can_tmp->IDR_RTR&0x01)can_tmp->length|=0x40; TXB1DLC=can_tmp->length; P_addr = &TXB1D0; for(n=0;n<can_tmp->length;n++) { *P_addr =can_tmp->DATA[n]; P_addr++; } TXB1CON=TXB1CON|0x08; return 0; } if((TXB2CON&0x08)==0) { //TXB2CON&=0xfc; TXB2CON = pir; if(can_tmp->IDR_RTR&0x02)//擴(kuò)展標(biāo)識(shí)符 { TXB2EIDL = can_tmp->ID[0];//擴(kuò)展ID[0-7] TXB2EIDH = can_tmp->ID[1];//擴(kuò)展ID[8-15] TXB2SIDL = can_tmp->ID[2]&0x03;//擴(kuò)展ID[16-17] temp= ((can_tmp->ID[2]&0x1C)<<3); TXB2SIDL |= temp;//標(biāo)準(zhǔn)[0-3] TXB2SIDL |= 0x08; TXB2SIDH=((can_tmp->ID[2]>>5)|(can_tmp->ID[3]<<3));//標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 } else { TXB2SIDL = (can_tmp->ID[0]<<5);//標(biāo)準(zhǔn)[0-3] TXB2SIDH = (can_tmp->ID[1]<<5|(can_tmp->ID[0]>>3)); } // if(can_tmp->IDR_RTR&0x01)can_tmp->length|=0x40; TXB2DLC=can_tmp->length; P_addr = &TXB2D0; for(n=0;n<can_tmp->length;n++) { *P_addr =can_tmp->DATA[n]; P_addr++; } TXB2CON=TXB2CON|0x08; return 0; } return 1; }