LPC_CAN->IF2_MCTRL = UMSK|0x0000; |
uint32_t MsgID; void My_MessageConfig(void) { LPC_CAN->IF1_CMDMSK = WR|MASK|ARB|CTRL|DATAA|DATAB; LPC_CAN->IF1_MCTRL = 0x0000; LPC_CAN->IF1_MSK1 = 0x0000; LPC_CAN->IF1_MSK2 = 0 << 2 ; //no mask LPC_CAN->IF1_ARB1 = 0x0000; LPC_CAN->IF1_ARB2 = ID_MVAL | (0 <<2);//receive all LPC_CAN->IF1_DA1 = 0x0000; LPC_CAN->IF1_DA2 = 0x0000; LPC_CAN->IF1_DB1 = 0x0000; LPC_CAN->IF1_DB2 = 0x0000; LPC_CAN->IF1_MCTRL = UMSK|EOB|DLC_MAX; //|RXIE //transfer data to message RAM LPC_CAN->IF1_CMDREQ = 1; while( LPC_CAN->IF1_CMDREQ & IFCREQ_BUSY ); } int main(void) { MyInit(); My_MessageConfig(); while(1) { //read status while (!(LPC_CAN->STAT & STAT_RXOK)); LPC_CAN->STAT &= ~STAT_RXOK; while ( LPC_CAN->IF2_CMDREQ & IFCREQ_BUSY ); LPC_CAN->IF2_CMDMSK = RD|MASK|ARB|CTRL|INTPND|TREQ|DATAA|DATAB; LPC_CAN->IF2_CMDREQ = 1; //read message while ( LPC_CAN->IF2_CMDREQ & IFCREQ_BUSY ); MsgID = (LPC_CAN->IF2_ARB2 &0x1FFF) >> 2; //read message data here!!!! } return 0 ; } |
LPC_CAN->IF2_ARB2 = ID_MVAL | 0; |
LPC_CAN->IF2_ARB2 = ID_MVAL | ((0x100) << 2); |
void MyInit(void) { //Step 1 LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 17); //Step 2 LPC_SYSCON->PRESETCTRL |= (1 << 3); //Initialization if ( !(LPC_CAN->CNTL & (1 << 0)) ) { /* If it's in normal operation already, stop it, reconfigure everything first, then restart. */ LPC_CAN->CNTL |= (1 << 0); /* Default state */ } //This register determines the CAN clock signal. //The CAN_CLK is derived from the peripheral clock PCLK divided by the values in this register. //48Mhz / x = 8Mhz -> x = 6 = Divider -> Clock Divider Value = 0x05 LPC_CAN->CLKDIV = 0x05; //Start Configurastion Bit Timing: LPC_CAN->CNTL |= (1 << 6); //Set Baudrate to 500kBaud at 8Mhz LPC_CAN->BT = 0x2301; //Set Baudrate prescaler extension register to 0x0000 (default) LPC_CAN->BRPE = 0x0000; //Stopp Configuration Bit Timing LPC_CAN->CNTL &= ~(1 << 6); /* Initialization finishes, normal operation now. */ LPC_CAN->CNTL &= ~(1 << 0); while ( LPC_CAN->CNTL & (1 << 0) ); } |
void My_MessageConfig(void) { uint32_t i; LPC_CAN->IF2_CMDMSK = WR|MASK|ARB|CTRL|DATAA|DATAB; LPC_CAN->IF2_MCTRL = 0x0000; LPC_CAN->IF2_MSK1 = 0x0000; LPC_CAN->IF2_MSK2 = 0 << 2 ; //no mask LPC_CAN->IF2_ARB1 = 0x0000; LPC_CAN->IF2_ARB2 = ID_MVAL | 0; LPC_CAN->IF2_DA1 = 0x0000; LPC_CAN->IF2_DA2 = 0x0000; LPC_CAN->IF2_DB1 = 0x0000; LPC_CAN->IF2_DB2 = 0x0000; /* Transfer data to message RAM */ LPC_CAN->IF2_CMDREQ = 1; while( LPC_CAN->IF2_CMDREQ & IFCREQ_BUSY ); return; } |
int main(void) { MyInit(); My_MessageConfig(); while(1) { //Warte bis eine Nachricht empfangen while ( !(LPC_CAN->STAT & STAT_RXOK) ); LPC_CAN->STAT &= ~STAT_RXOK; LPC_CAN->IF2_CMDMSK = 0x7F; /* Start message transfer to object with New data*/ LPC_CAN->IF2_CMDREQ = 1; while ( (LPC_CAN->IF2_CMDREQ & (1<<15)) ); } return 0 ; } |
LPC_CAN->IF1_MSK1 = 0x0000; LPC_CAN->IF1_MSK2 = 0 << 2 ; //no mask LPC_CAN->IF1_ARB1 = 0x0000; LPC_CAN->IF1_ARB2 = ID_MVAL | 0; |