|
@@ -728,10 +728,10 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
CAN_WriteReg(TXB0SIDH,0xFF&(param.TxStdIDH));//����?��?o3??��0������?������?��?????
|
|
|
CAN_WriteReg(TXB0SIDL,0xE0&(param.TxStdIDL));//����?��?o3??��0������?������?��?�̨�??
|
|
|
|
|
|
- CAN_WriteReg(RXM0SIDH,0xFF);
|
|
|
- CAN_WriteReg(RXM0SIDL,0xE0);
|
|
|
- CAN_WriteReg(RXM1SIDH,0xFF);
|
|
|
- CAN_WriteReg(RXM1SIDL,0xE0);
|
|
|
+ CAN_WriteReg(RXM0SIDH,0x00);
|
|
|
+ CAN_WriteReg(RXM0SIDL,0x00);
|
|
|
+ CAN_WriteReg(RXM1SIDH,0x00);
|
|
|
+ CAN_WriteReg(RXM1SIDL,0x00);
|
|
|
|
|
|
/*?����???2��??��??��*/
|
|
|
CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
|
|
@@ -759,10 +759,10 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
CAN_WriteReg(RXF5SIDL,0xE0&(param.RxStdIDL[5]));
|
|
|
#endif
|
|
|
|
|
|
- CAN_WriteReg(RXB0CTRL,RXM_VALID_STD);
|
|
|
+ CAN_WriteReg(RXB0CTRL,RXM_RCV_ALL);
|
|
|
CAN_WriteReg(RXB0DLC,DLC_8);
|
|
|
|
|
|
- CAN_WriteReg(RXB1CTRL,RXM_VALID_STD|FILHIT1_FLTR_2);
|
|
|
+ CAN_WriteReg(RXB1CTRL,RXM_RCV_ALL);
|
|
|
CAN_WriteReg(RXB1DLC,DLC_8);
|
|
|
|
|
|
}
|
|
@@ -775,10 +775,10 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
CAN_WriteReg(TXB0EID0,0xFF&(param.TxExtIDL));
|
|
|
|
|
|
/*?����???2��??��??��*/
|
|
|
- CAN_WriteReg(RXM0SIDH,0xFF);
|
|
|
- CAN_WriteReg(RXM0SIDL,0xE3);
|
|
|
- CAN_WriteReg(RXM0EID8,0xFF);
|
|
|
- CAN_WriteReg(RXM0EID0,0xFF);
|
|
|
+ CAN_WriteReg(RXM0SIDH,0x00); //FF->00 zhengchao
|
|
|
+ CAN_WriteReg(RXM0SIDL,0x00); //E3->00 zhengchao
|
|
|
+ CAN_WriteReg(RXM0EID8,0x00); //FF->00 zhengchao
|
|
|
+ CAN_WriteReg(RXM0EID0,0x00); //FF->00 zhengchao
|
|
|
|
|
|
/*?����???2��??��??��*/
|
|
|
CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
|
|
@@ -812,7 +812,7 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
CAN_WriteReg(RXF5EID8,0xFF&(param.RxExtIDL[5]));
|
|
|
|
|
|
|
|
|
- CAN_WriteReg(RXB0CTRL,RXM_VALID_EXT);
|
|
|
+ CAN_WriteReg(RXB0CTRL,RXM_VALID_EXT|BUKT_ROLLOVER);
|
|
|
CAN_WriteReg(RXB0DLC,DLC_8);
|
|
|
|
|
|
CAN_WriteReg(RXB1CTRL,RXM_VALID_EXT|FILHIT1_FLTR_2);
|
|
@@ -820,14 +820,15 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
|
|
|
}
|
|
|
|
|
|
- CAN_WriteReg(CANINTE,0x43);
|
|
|
+ CAN_WriteReg(BFPCTRL,0x0F);//zhengchao20210304 add
|
|
|
+ CAN_WriteReg(CANINTE,0x43); //zhengchao20210304 0x43 -> 0x03
|
|
|
CAN_WriteReg(CANINTF,0x00);
|
|
|
|
|
|
CAN_WriteReg(CANCTRL,param.mode |CLKOUT_ENABLED);//??MCP2515¨¦¨¨???a?y3¡ê?¡ê¨º?,¨ª?3??????¡ê¨º? REQOP_NORMAL|CLKOUT_ENABLED
|
|
|
CAN_ReadReg(CANSTAT,1,&temp);//?¨¢¨¨?CAN¡Á¡ä¨¬???¡ä??¡Â¦Ì??¦Ì
|
|
|
if(param.mode !=(temp&0xE0))//?D??MCP2515¨º?¡¤?¨°??-??¨¨??y3¡ê?¡ê¨º?
|
|
|
{
|
|
|
- CAN_WriteReg(CANCTRL,param.mode|CLKOUT_ENABLED);//?����???MCP2515����???a?y3��?�?,��?3??????�?REQOP_NORMAL
|
|
|
+ CAN_WriteReg(CANCTRL,param.mode|CLKOUT_ENABLED);//?¨´¡ä???MCP2515¨¦¨¨???a?y3¡ê?¡ê¨º?,¨ª?3??????¡ê¨º?REQOP_NORMAL
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -841,10 +842,13 @@ void HAL_Can_Init(Can_InitType param)
|
|
|
*******************************************************************************/
|
|
|
void HAL_Can_Sleep(void)
|
|
|
{
|
|
|
- UINT8 temp=0,t=0;
|
|
|
+ UINT8 temp=0,temp2=0,t=0;
|
|
|
do{
|
|
|
- CAN_WriteReg(CANCTRL,OPMODE_SLEEP |CLKOUT_DISABLED);
|
|
|
+ CAN_WriteReg(CANCTRL,OPMODE_CONFIG);
|
|
|
+ CAN_WriteReg(CANINTE,WAKIE|RX0IE|RX1IE);
|
|
|
+ //CAN_WriteReg(CNF3, WAKFIL);
|
|
|
CAN_ReadReg(CANSTAT,1,&temp);
|
|
|
+ CAN_WriteReg(CANCTRL,OPMODE_SLEEP |CLKOUT_DISABLED);
|
|
|
#ifdef USING_PRINTF
|
|
|
//printf("%s[%d] [%#x]\r\n",__FUNCTION__, __LINE__,temp);
|
|
|
#endif
|
|
@@ -869,35 +873,145 @@ void HAL_Can_Sleep(void)
|
|
|
* ¡¤¦Ì???¦Ì : ?T
|
|
|
* ?¦Ì?¡Â : ?T
|
|
|
*******************************************************************************/
|
|
|
-INT32 HAL_Can_Transmit(Can_TxMsgType Can_TxMsg)
|
|
|
+INT8 HAL_Can_Transmit(CAN_Msg_Type Can_TxMsg)
|
|
|
{
|
|
|
- UINT8 tryTim,count,value,i;
|
|
|
-
|
|
|
- count=0;
|
|
|
- while(count<Can_TxMsg.DLC)
|
|
|
+ UINT8 tryTim,count,value,i,temp,TXBufferCase = 0;
|
|
|
+ INT8 ret = 0;
|
|
|
+ UINT8 TXB0CTRLvalue,TXB1CTRLvalue,TXB2CTRLvalue,CANINTFValue=0;
|
|
|
+ CAN_ReadReg(TXB0CTRL, 1, &TXB0CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB1CTRL, 1, &TXB1CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB2CTRL, 1, &TXB2CTRLvalue);
|
|
|
+
|
|
|
+ if((TXB0CTRLvalue&TXREQ)==0)
|
|
|
+ TXBufferCase = 0;
|
|
|
+ else if((TXB1CTRLvalue&TXREQ)==0)
|
|
|
+ TXBufferCase =1;
|
|
|
+ else if((TXB2CTRLvalue&TXREQ)==0)
|
|
|
+ TXBufferCase =2;
|
|
|
+
|
|
|
+ switch(TXBufferCase)
|
|
|
{
|
|
|
- tryTim=0;
|
|
|
- CAN_ReadReg(TXB0CTRL,1,&value);
|
|
|
- while((value&0x08) && (tryTim<50))//?��?��?��?3D?���䨬???��?,�̨���yTXREQ����????��?
|
|
|
+
|
|
|
+ case 0:
|
|
|
{
|
|
|
- CAN_ReadReg(TXB0CTRL,1,&value);
|
|
|
- osDelay(1/portTICK_PERIOD_MS);
|
|
|
- tryTim++;
|
|
|
+ //tryTim=0;
|
|
|
+ //CAN_RseadReg(TXB0CTRL,1,&value);
|
|
|
+
|
|
|
+ //while((value&0x08) && (tryTim<50))//?��?��?��?3D?���䨬???��?,�̨���yTXREQ����????��?
|
|
|
+ //{
|
|
|
+ // CAN_ReadReg(TXB0CTRL,1,&value);
|
|
|
+ // osDelay(1/portTICK_PERIOD_MS);
|
|
|
+ // tryTim++;
|
|
|
+ //}
|
|
|
+
|
|
|
+ /*TXB0*/
|
|
|
+ CAN_WriteReg(TXB0SIDH,0xFF&((Can_TxMsg.Id)>>3));//����?��?o3??��0������?������?��?????
|
|
|
+ CAN_WriteReg(TXB0SIDL,0xE0&((Can_TxMsg.Id)<<5));//����?��?o3??��0������?������?��?�̨�??
|
|
|
+ for(i=0;i<Can_TxMsg.DLC;i++)
|
|
|
+ {
|
|
|
+ CAN_WriteReg(TXB0D0+i,Can_TxMsg.Data[i]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
|
|
|
+
|
|
|
+ }
|
|
|
+ CAN_WriteReg(TXB0DLC,Can_TxMsg.DLC);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
|
|
|
+ SPI_CS_Low();
|
|
|
+ CAN_WriteReg(TXB0CTRL,TXREQ);//???������?������??
|
|
|
+ //SPI_CS_High();
|
|
|
+
|
|
|
+ printf("IDsend0 = 0x%x\n",Can_TxMsg.Id);
|
|
|
+ printf("DataSend0=\n");
|
|
|
+ for(i=0;i<8;i++)
|
|
|
+ {
|
|
|
+ printf("0x%x\t",Can_TxMsg.Data[i]);
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+
|
|
|
+ ret = 0;
|
|
|
+ break;
|
|
|
}
|
|
|
- /*TXB0*/
|
|
|
- CAN_WriteReg(TXB0SIDH,0xFF&(Can_TxMsg.stdIDH));//����?��?o3??��0������?������?��?????
|
|
|
- CAN_WriteReg(TXB0SIDL,0xE0&(Can_TxMsg.stdIDL));//����?��?o3??��0������?������?��?�̨�??
|
|
|
- for(i=0;i<8;)
|
|
|
+ case 1:
|
|
|
{
|
|
|
- CAN_WriteReg(TXB0D0+i,Can_TxMsg.Data[count++]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
|
|
|
- i++;
|
|
|
- if(count>=Can_TxMsg.DLC) break;
|
|
|
+ /*TXB0*/
|
|
|
+ CAN_WriteReg(TXB1SIDH,0xFF&((Can_TxMsg.Id)>>3));//����?��?o3??��0������?������?��?????
|
|
|
+ CAN_WriteReg(TXB1SIDL,0xE0&((Can_TxMsg.Id)<<5));//����?��?o3??��0������?������?��?�̨�??
|
|
|
+ for(i=0;i<Can_TxMsg.DLC;i++)
|
|
|
+ {
|
|
|
+ CAN_WriteReg(TXB1D0+i,Can_TxMsg.Data[i]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
|
|
|
+
|
|
|
+ }
|
|
|
+ CAN_WriteReg(TXB1DLC,Can_TxMsg.DLC);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
|
|
|
+ SPI_CS_Low();
|
|
|
+ CAN_WriteReg(TXB1CTRL,TXREQ);//???������?������??
|
|
|
+ //SPI_CS_High();
|
|
|
+
|
|
|
+ printf("IDsend1 = 0x%x\n",Can_TxMsg.Id);
|
|
|
+ printf("DataSend1=\n");
|
|
|
+ for(i=0;i<8;i++)
|
|
|
+ {
|
|
|
+ printf("0x%x\t",Can_TxMsg.Data[i]);
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ ret = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 2:
|
|
|
+ {
|
|
|
+ /*TXB0*/
|
|
|
+ CAN_WriteReg(TXB2SIDH,0xFF&((Can_TxMsg.Id)>>3));//����?��?o3??��0������?������?��?????
|
|
|
+ CAN_WriteReg(TXB2SIDL,0xE0&((Can_TxMsg.Id)<<5));//����?��?o3??��0������?������?��?�̨�??
|
|
|
+ for(i=0;i<Can_TxMsg.DLC;i++)
|
|
|
+ {
|
|
|
+ CAN_WriteReg(TXB2D0+i,Can_TxMsg.Data[i]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
|
|
|
+
|
|
|
+ }
|
|
|
+ CAN_WriteReg(TXB2DLC,Can_TxMsg.DLC);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
|
|
|
+ SPI_CS_Low();
|
|
|
+ CAN_WriteReg(TXB2CTRL,TXREQ);//???������?������??
|
|
|
+ //SPI_CS_High();
|
|
|
+
|
|
|
+ printf("IDsend2 = 0x%x\n",Can_TxMsg.Id);
|
|
|
+ printf("DataSend2=\n");
|
|
|
+ for(i=0;i<8;i++)
|
|
|
+ {
|
|
|
+ printf("0x%x\t",Can_TxMsg.Data[i]);
|
|
|
+ }
|
|
|
+ printf("\n");
|
|
|
+ ret = 2;
|
|
|
+ break;
|
|
|
}
|
|
|
- CAN_WriteReg(TXB0DLC,i);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
|
|
|
- SPI_CS_Low();
|
|
|
- CAN_WriteReg(TXB0CTRL,0x08);//???������?������??
|
|
|
- SPI_CS_High();
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ ret = -1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ CAN_ReadReg(TXB0CTRL, 1, &TXB0CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB1CTRL, 1, &TXB1CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB2CTRL, 1, &TXB2CTRLvalue);
|
|
|
+
|
|
|
+ tryTim = 0;
|
|
|
+ while((TXB0CTRLvalue&TXREQ) && (TXB1CTRLvalue&TXREQ) && (TXB1CTRLvalue&TXREQ) && (tryTim<50))
|
|
|
+ {
|
|
|
+ //SPI_CS_High();
|
|
|
+ CAN_ReadReg(TXB0CTRL, 1, &TXB0CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB1CTRL, 1, &TXB1CTRLvalue);
|
|
|
+ CAN_ReadReg(TXB2CTRL, 1, &TXB2CTRLvalue);
|
|
|
+ osDelay(1);
|
|
|
+ tryTim++;
|
|
|
}
|
|
|
+ CAN_ReadReg(CANINTF, 1, &CANINTFValue);
|
|
|
+ SPI_CS_High();
|
|
|
+ if((TXB0CTRLvalue&0x20)||(TXB1CTRLvalue&0x20)||(TXB2CTRLvalue&0x20)||(CANINTFValue&0x80))
|
|
|
+ {
|
|
|
+ ret = -1;
|
|
|
+ printf("TXB0CTRLvalue = 0x%x\n",TXB0CTRLvalue);
|
|
|
+ printf("TXB1CTRLvalue = 0x%x\n",TXB1CTRLvalue);
|
|
|
+ printf("TXB2CTRLvalue = 0x%x\n",TXB2CTRLvalue);
|
|
|
+ printf("CANINTFValue = 0x%x\n",CANINTFValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("ret = %d\n",ret);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
@@ -908,35 +1022,91 @@ INT32 HAL_Can_Transmit(Can_TxMsgType Can_TxMsg)
|
|
|
* ����???�� : len(?����?��?��y?Y��?3��?��,0~8��??��)
|
|
|
* ?��?�� : ?T
|
|
|
*******************************************************************************/
|
|
|
-UINT8 HAL_Can_Receive(UINT32 *CAN_ID,UINT8 *CAN_RX_Buf)
|
|
|
+void HAL_Can_Receive(CAN_Msg_Type* CanRxMsgBuffer)
|
|
|
{
|
|
|
- UINT8 i=0,len=0,temp=0,idh,idl;
|
|
|
-
|
|
|
+
|
|
|
+ UINT8 i=0,len=0,temp=0;
|
|
|
+ UINT8 SIdH,SIdL,EId8,EId0;
|
|
|
+ //static UINT16 counterBuff0,counterBuff1 = 0;
|
|
|
+
|
|
|
CAN_ReadReg(CANINTF,1,&temp);
|
|
|
- if(temp & 0x01)
|
|
|
- {
|
|
|
- CAN_ReadReg(RXB0SIDH,1,&idh);
|
|
|
- CAN_ReadReg(RXB0SIDL,1,&idl);
|
|
|
- CAN_ReadReg(RXB0DLC,1,&len);
|
|
|
+// printf("CANINTF = 0x%x\n",temp);
|
|
|
+// USARTdrv->Send(&temp,1);
|
|
|
+ if(temp & 0x01) //Rx Buffer 0
|
|
|
+ {
|
|
|
+ /*get the id information*/
|
|
|
+ CAN_ReadReg(RXB0SIDH,1,&SIdH);
|
|
|
+ CAN_ReadReg(RXB0SIDL,1,&SIdL);
|
|
|
+ CAN_ReadReg(RXB0EID8,1,&EId8);
|
|
|
+ CAN_ReadReg(RXB0EID0,1,&EId0);
|
|
|
+
|
|
|
+ CAN_ReadReg(RXB0DLC,1,&len);
|
|
|
+ len = len&0x0F;
|
|
|
+ CanRxMsgBuffer[0].DLC = len;
|
|
|
+
|
|
|
+ if(SIdL & 0x8) // if SIdL.3 = 1, the id belongs to ExtID
|
|
|
+ {
|
|
|
+ (CanRxMsgBuffer[0]).Id = ((SIdH<<5 | (SIdL>>5)<<2 | SIdL&0x3 )<<16 | (EId8<<8) | EId0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ (CanRxMsgBuffer[0]).Id = SIdH<<3 | SIdL>>5;
|
|
|
+ }
|
|
|
+
|
|
|
+ i = 0;
|
|
|
while(i<len)
|
|
|
{
|
|
|
- CAN_ReadReg(RXB0D0+i,1,&CAN_RX_Buf[i]);
|
|
|
+ CAN_ReadReg(RXB0D0+i,1,&((CanRxMsgBuffer[0]).Data[i]));
|
|
|
i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("ID0 = 0x%x\n",(CanRxMsgBuffer[0]).Id);
|
|
|
+ printf("Data0=\n");
|
|
|
+ for(i=0;i<8;i++)
|
|
|
+ {
|
|
|
+ printf("0x%x\t",(CanRxMsgBuffer[0]).Data[i]);
|
|
|
}
|
|
|
+ printf("\n");
|
|
|
+ }
|
|
|
+ if(temp & 0x02) //RX Buffer 1
|
|
|
+ {
|
|
|
+ /*get the id information*/
|
|
|
+ CAN_ReadReg(RXB1SIDH,1,&SIdH);
|
|
|
+ CAN_ReadReg(RXB1SIDL,1,&SIdL);
|
|
|
+ CAN_ReadReg(RXB1EID8,1,&EId8);
|
|
|
+ CAN_ReadReg(RXB1EID0,1,&EId0);
|
|
|
|
|
|
- }else if(temp & 0x02){
|
|
|
- CAN_ReadReg(RXB1SIDH,1,&idh);
|
|
|
- CAN_ReadReg(RXB1SIDL,1,&idl);
|
|
|
- CAN_ReadReg(RXB1DLC,1,&len);
|
|
|
+ CAN_ReadReg(RXB1DLC,1,&len);
|
|
|
+ len = len & 0x0F;
|
|
|
+ CanRxMsgBuffer[1].DLC = len;
|
|
|
+
|
|
|
+ if(SIdL & 0x8) // SIdL.3 = 1, ExtID
|
|
|
+ {
|
|
|
+ (CanRxMsgBuffer[1]).Id = ((SIdH<<5 | (SIdL>>5)<<2 | SIdL&0x3 )<<16 | (EId8<<8) | EId0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ (CanRxMsgBuffer[1]).Id = SIdH<<3 | SIdL>>5;
|
|
|
+ }
|
|
|
+
|
|
|
+ i = 0 ;
|
|
|
while(i<len)
|
|
|
{
|
|
|
- CAN_ReadReg(RXB1D0+i,1,&CAN_RX_Buf[i]);
|
|
|
- i++;
|
|
|
+ CAN_ReadReg(RXB1D0+i,1,&((CanRxMsgBuffer[1]).Data[i]));
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("ID1 = 0x%x\n",(CanRxMsgBuffer[1]).Id);
|
|
|
+ printf("Data1=\n");
|
|
|
+ for(i=0;i<8;i++)
|
|
|
+ {
|
|
|
+ printf("0x%x\t",(CanRxMsgBuffer[1]).Data[i]);
|
|
|
}
|
|
|
+ printf("\n");
|
|
|
}
|
|
|
CAN_WriteReg(CANINTF,0);
|
|
|
- *CAN_ID=(idh<<3)+(idl>>5);
|
|
|
- return len;
|
|
|
+ CAN_ReadReg(CANINTF, 1, &temp);
|
|
|
+ printf("CANINTF = %x\n",temp);
|
|
|
}
|
|
|
|
|
|
/**
|