使用ZLG公司的Demo程序CAN驱动程序,调用CANSendData发送返回为0,说明发送成功,用示波器测了CANTXD一直是高电平,只有一个40us脉宽的低脉冲,<br />初始化设置<br />void caninit(eCANNUM CanNum,uint8 Baud)<br />{ <br /> HwEnCAN(CanNum); <br /> SoftRstCAN(CanNum);<br /> CANEWL(CanNum).Bits.EWL_BIT = USE_EWL_CAN[CanNum]; <br /> //初始化波特率<br /> //CANBTR(CanNum).Word = USE_BTR_CAN[CanNum]; <br /> switch (Baud)<br /> {<br /> case 0:<br /> CANBTR(CanNum).Word = (uint32)BPS_12K;<br /> break;<br /> case 1:<br /> CANBTR(CanNum).Word = (uint32)BPS_20K;<br /> break;<br /> case 2:<br /> CANBTR(CanNum).Word = (uint32)BPS_20K;<br /> break;<br /> case 3:<br /> CANBTR(CanNum).Word = (uint32)BPS_50K;<br /> break;<br /> default:<br /> CANBTR(CanNum).Word = (uint32)BPS_12K;<br /> break;<br /> }<br /> <br /> //初始化中断为非向量中断<br /> VICDefVectAddr =(uint32)can_isr;<br /> VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+CanNum));<br /><br /> //中断使能<br /> CANIER(CanNum).Word= USE_INT_CAN[CanNum]; <br /> //配置验收滤波器(旁路状态)<br /> CANAFMR.Bits.AccBP_BIT =1;<br /> CANAFMR.Bits.eFCAN_BIT = 0;<br /><br /> //初始化模式<br /> //CANMOD(CanNum).Bits.TPM_BIT = USE_TPM_CAN[CanNum];<br /> //CANMOD(CanNum).Bits. LOM_BIT = USE_MOD_CAN[CanNum];<br /> //CANCMR(CanNum).Bits.SRR_BIT = 1;<br /> CANMOD(CanNum).Bits.TPM_BIT = USE_TPM_CAN1; <br /> CANMOD(CanNum).Bits. LOM_BIT = USE_MODE_CAN1;<br /> CANMOD(CanNum).Bits.STM_BIT = 1;<br /> CANMOD(CanNum).Bits.RPM_BIT = 0;<br /> //CANCMR(CanNum).Bits.SRR_BIT = 1;<br /><br /> //自测试模式<br /> //CANMOD(CanNum).Bits.STM_BIT = 1;<br /> //CANMOD(CanNum).Bits.TM_BIT = 0;<br /> <br /> //初始化接收环形缓冲区<br /> CANRcvBufApp.FullFlag1 = CANRcvBufApp.FullFlag2 = 0;<br /> CANRcvBufApp.ReadPoint1 = CANRcvBufApp.ReadPoint2 = 0;<br /> CANRcvBufApp.WritePoint1 = CANRcvBufApp.WritePoint2 = 0;<br /> //启动CAN<br /> SoftEnCAN(CanNum);<br />}<br /><br />我的测试函数<br />void test(void)<br />{<br /> uint8 tmp[8] = {0};<br /> uint8 datanum = 0;<br /> uint32 id = 0;<br /> uint8 i = 0;<br /> uint8 tempid[4] = {0};<br /> stcRxBUF cbuf;<br /> if (ReadCANRcvCyBuf(CAN1,&cbuf) == 0)<br /> {<br /> datanum = cbuf.CANRcvFS.Bits.DLC_BIT;<br /> for(i=0;i<4;i++)<br /> {<br /> tempid = *((uint8 *)&cbuf.RxCANID + 3 - i);<br /> }<br /> send_buf(UART0,tempid,4);<br /> switch (datanum & 0x0F)<br /> {<br /> case 0:<br /> break;<br /> case 1:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> break;<br /> case 2:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> break;<br /> case 3:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> break;<br /> case 4:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> tmp[3] = cbuf.CANRDA.Bits.Data4_BIT;<br /> break;<br /> case 5:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> tmp[3] = cbuf.CANRDA.Bits.Data4_BIT;<br /> tmp[4] = cbuf.CANRDB.Bits.Data1_BIT;<br /> break;<br /> case 6:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> tmp[3] = cbuf.CANRDA.Bits.Data4_BIT;<br /> tmp[4] = cbuf.CANRDB.Bits.Data1_BIT;<br /> tmp[5] = cbuf.CANRDB.Bits.Data2_BIT;<br /> break;<br /> case 7:<br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> tmp[3] = cbuf.CANRDA.Bits.Data4_BIT;<br /> tmp[4] = cbuf.CANRDB.Bits.Data1_BIT;<br /> tmp[5] = cbuf.CANRDB.Bits.Data2_BIT;<br /> tmp[6] = cbuf.CANRDB.Bits.Data3_BIT;<br /> break;<br /> case 8:<br /> default: <br /> tmp[0] = cbuf.CANRDA.Bits.Data1_BIT;<br /> tmp[1] = cbuf.CANRDA.Bits.Data2_BIT;<br /> tmp[2] = cbuf.CANRDA.Bits.Data3_BIT;<br /> tmp[3] = cbuf.CANRDA.Bits.Data4_BIT;<br /> tmp[4] = cbuf.CANRDB.Bits.Data1_BIT;<br /> tmp[5] = cbuf.CANRDB.Bits.Data2_BIT;<br /> tmp[6] = cbuf.CANRDB.Bits.Data3_BIT;<br /> tmp[7] = cbuf.CANRDB.Bits.Data4_BIT;<br /> break;<br /> }<br /> send_buf(UART0,tmp,datanum);<br /> }<br /><br />#if 1<br />/*两块目标板,接收都调通,在测试发送时,其中一个在此处<br /> 用#if 0屏蔽,只处理接收数据,另一个节点负责发送CAN数据*/<br /> /*0成功,1失败*/<br /> if (SendToCAN() == 0)<br /> char_SendBufByIrq(UART0,"成功!
");<br /> else<br /> char_SendBufByIrq(UART0,"失败!
");<br />#endif <br /> delay(10000);<br />}<br /><br />/*向CAN发送数据*/<br />uint32 SendToCAN(void)<br />{<br /> static uint8 SRCANBuf[16];<br /> static uint8 CAN_NODE_ID = 001;<br /> uint32 i;<br /> static stcTxBUF CTbuf;<br /> <br /> //准备CAN帧数据<br /> SRCANBuf[0] = CAN1;<br /> SRCANBuf[1] = 0x88;//帧信息:扩展帧 数据帧 DLC =8B<br /> SRCANBuf[14] = 0x02;<br /> //计算标示符<br /> SRCANBuf[2] = 0x01<<4; //PRI 28位置高<br /> SRCANBuf[2] |= (uint8)((uint8)(CAN_NODE_ID>>6) &0x1);//24b<br /> SRCANBuf[3] = (uint8)(CAN_NODE_ID<<2);//18~23b<br /> SRCANBuf[4] = 0;<br /> SRCANBuf[5] = 0;<br /> SRCANBuf[6] = 1;<br /> SRCANBuf[7] = 2;<br /> SRCANBuf[8] = 3;<br /> SRCANBuf[9] = 4;<br /> SRCANBuf[10] = 5;<br /> SRCANBuf[11] = 6;<br /> SRCANBuf[12] = 7;<br /> SRCANBuf[13] = 8;<br /> SRCANBuf[15] = 10;<br /><br /> CTbuf.TxFrameInfo.Bits.PRIO_BIT =SRCANBuf[0];//CAN通道号<br /> CTbuf.TxFrameInfo.Bits.FF_BIT = 1; //帧格式<br /> CTbuf.TxFrameInfo.Bits.RTR_BIT = 0; //帧类型<br /> CTbuf.TxFrameInfo.Bits.DLC_BIT = SRCANBuf[1]; //数据长度<br /><br /> for (i=0; i<4; i++)<br /> {<br /> *((uint8 *)&CTbuf.TxCANID.Word +i)=SRCANBuf[5-i];<br /> }<br /><br /> //memcpy((uint8 *)&CTbuf.CANTDA ,&SRCANBuf[6],4);<br /> //memcpy((uint8 *)&CTbuf.CANTDB ,&SRCANBuf[10],4);<br /> CTbuf.CANTDA.Bits.Data1_BIT = SRCANBuf[6];<br /> CTbuf.CANTDA.Bits.Data2_BIT = SRCANBuf[7];<br /> CTbuf.CANTDA.Bits.Data3_BIT = SRCANBuf[8];<br /> CTbuf.CANTDA.Bits.Data4_BIT = SRCANBuf[9];<br /> <br /> CTbuf.CANTDB.Bits.Data1_BIT = SRCANBuf[10];<br /> CTbuf.CANTDB.Bits.Data2_BIT = SRCANBuf[11];<br /> CTbuf.CANTDB.Bits.Data3_BIT = SRCANBuf[12];<br /> CTbuf.CANTDB.Bits.Data4_BIT = SRCANBuf[13];<br /> <br /> /*0成功,1失败*/<br /> if (CANSendData(SRCANBuf[0],SRCANBuf[14],&CTbuf)==0)<br /> return 0;<br /> else<br /> return 1;<br /><br />}<br /><br />/*ZLG提供的驱动函数*/<br />uint32 CANSendData(eCANNUM CanNum,uint32 Cmd,P_stcTxBUF Buf)<br />{<br /> uint32 i,status=0;<br /><br /> if (0 != CANSR(CanNum).Bits.TBS1_BIT)<br /> {<br /> i = SEND_TX_BUF1;<br /> }<br /> else if (0 != CANSR(CanNum).Bits.TBS2_BIT)<br /> {<br /> i = SEND_TX_BUF2;<br /> }<br /> else if (0 != CANSR(CanNum).Bits.TBS3_BIT)<br /> {<br /> i = SEND_TX_BUF3;<br /> }<br /> else<br /> {<br /> i = 0xFF;<br /> }<br /><br /> /*0成功,1失败*/<br /> status = WriteCanTxBuf(CanNum,i, USE_TPM_CAN[CanNum],Buf);<br /><br /> if (status == 0)<br /> {<br /> #if 1<br /> if(CANMOD(CanNum).Bits.SM_BIT != 0) {<br /> CanQuitSM(CanNum);<br /> }<br /> #endif<br /> CanSendCmd(CanNum,Cmd,i);<br /> }<br /> <br /> return (status);<br />}<br /><br />uint32 WriteCanTxBuf(eCANNUM CanNum,uint32 TxBufNum,uint32 TPM,P_stcTxBUF Buf)<br />{<br /> uint32 status=0;<br /> <br /> switch (TxBufNum)<br /> {<br /> case SEND_TX_BUF1:<br /> if ((0 == CANSR(CanNum).Bits.TS1_BIT) && (0 != CANSR(CanNum).Bits.TBS1_BIT))<br /> {<br /> CANTFI1(CanNum)=Buf->TxFrameInfo;<br /> CANTID1(CanNum)=Buf->TxCANID;<br /> CANTDA1(CanNum)=Buf->CANTDA;<br /> CANTDB1(CanNum)=Buf->CANTDB;<br /> }<br /> else<br /> {<br /> status = 0x01;<br /> }<br /> break;<br /> <br /> case SEND_TX_BUF2:<br /> if ((0== CANSR(CanNum).Bits.TS2_BIT)&&(0 !=CANSR(CanNum).Bits.TBS2_BIT))<br /> {<br /> CANTFI2(CanNum)=Buf->TxFrameInfo;<br /> CANTID2(CanNum)=Buf->TxCANID;<br /> CANTDA3(CanNum)=Buf->CANTDA;<br /> CANTDB2(CanNum)=Buf->CANTDB;<br /> }<br /> else<br /> {<br /> status = 0x01;<br /> }<br /> break;<br /> <br /> case SEND_TX_BUF3:<br /> if ((0== CANSR(CanNum).Bits.TS3_BIT)&&(0 != CANSR(CanNum).Bits.TBS3_BIT))<br /> {<br /> CANTFI3(CanNum)=Buf->TxFrameInfo;<br /> CANTID3(CanNum)=Buf->TxCANID;<br /> CANTDA3(CanNum)=Buf->CANTDA;<br /> CANTDB3(CanNum)=Buf->CANTDB;<br /> }<br /> else<br /> {<br /> status = 0x01;<br /> }<br /> break;<br /> <br /> default:<br /> status = 0x01;<br /> break;<br /> }<br /> <br /> if (TPM == 1)<br /> {<br /> CANMOD(CanNum).Bits.TPM_BIT =1;<br /> }<br /> <br /> return(status);<br />}<br />void __irq can_isr(void)<br />{<br /> uint32 j = 0;<br /> uCANICR k;<br /> uint8 tmp=0;<br /><br /> //ON_TCAN_LED();<br /> if (CANLUTerr.Word != 0 ) //LUT Error Program<br /> {<br /> //add or modify code<br /> j = CANLUTerrAd.Word; <br /> <br /> }<br /><br /> for (j=0; j<CAN_MAX_NUM; j++)<br /> {<br /> k = CANICR(j);<br /> <br /> if (k.Bits.RI_BIT != 0)<br /> {<br /> //add code<br /> RCAN_LEDGlint();<br /> WriteCANRcvCyBuf(j); //CAN接收中断<br /> }<br /> <br /> if (k.Bits.TI1_BIT != 0)<br /> {<br /> //add code<br /> //COMM_LEDGlint();<br /> //CANCMR(j).Bits.TR_BIT = 1;<br /> }<br /> <br /> if (k.Bits.TI2_BIT != 0)<br /> {<br /> //add code<br /> }<br /> <br /> if (k.Bits.TI3_BIT != 0)<br /> {<br /> //add code<br /> <br /> }<br /> <br /> if (k.Bits.BEI_BIT != 0)<br /> {<br /> //uint32 i = 0;<br /> //add code<br /> //erro = k.Bits.ERRBIT_BIT;<br /> tmp = k.Bits.ERRC_BIT;<br /> COMM_LEDGlint();/*led闪烁,取反,该灯一直闪烁不停*/<br /> /*<br /> switch (tmp)<br /> {<br /> case 2:<br /> TCAN_LEDGlint();<br /> break;<br /> default:<br /> COMM_LEDGlint();<br /> break;<br /> }<br /> */<br /> CanBufOffLinePrg(j);<br /> <br /> }<br /> <br /> if (k.Bits.ALI_BIT != 0)<br /> {<br /> //add code<br /> //ON_TCAN_LED();<br /> <br /> }<br /> <br /> if (k.Bits.EPI_BIT != 0)<br /> {<br /> //add code<br /> //ON_TCAN_LED();<br /> }<br /> <br /> if (k.Bits.WUI_BIT != 0)<br /> {<br /> //add code<br /> <br /> }<br /><br /> if (k.Bits.DOI_BIT != 0)<br /> {<br /> //add code<br /> ClrCanDataOver(j);<br /> }<br /><br /> }<br /> //ON_TCAN_LED();<br /> <br /> VICVectAddr = 0x00;<br /> <br />}<br /><br />不知道问题出在哪,收,发节点一直进总线错误中断, |
|