/*********************************************************************//** * @brief Handle valid transmit message * @param[in] msg_no Message Object number * @return None **********************************************************************/ void CAN_TxInt_MessageProcess( uint8_t msg_no ) { /* Clear interrupt pending bit */ CAN_IF_Write(MCTRL, IF2, UMSK|RXIE|EOB|CAN_DLC_MAX); /* Save changes to message RAM */ CAN_IF_writeBuf(IF2,msg_no); return; }
/*********************************************************************//** * @brief Listen for a message on CAN bus * @param[in] msg_no message object number * @param[in] msg_ptr msg buffer pointer * @param[in] RemoteEnable Enable/disable remote frame support, should be: * - TRUE: enable * - FALSE: disable * @return None **********************************************************************/ void CAN_Recv(uint8_t msg_no, uint32_t *msg_ptr, Bool RemoteEnable) { uint32_t rx_id = *msg_ptr; uint32_t rmten = 0; if(RemoteEnable) { rmten = 1<<8; } if(!(rx_id & (0x1<<30))) { /* standard frame */ /* Mxtd: 0, Mdir: 0, Mask is 0x7FF */ CAN_IF_Write(MSK1, IF1, 0x0000); CAN_IF_Write(MSK2, IF1, ID_STD_MASK << 2); /* MsgVal: 1, Mtd: 0, Dir: 0 */ CAN_IF_Write(ARB1, IF1, 0x0000); CAN_IF_Write(MCTRL, IF1, rmten|UMSK|RXIE|EOB|CAN_DLC_MAX); CAN_IF_Write(DA1, IF1, 0x0000); CAN_IF_Write(DA2, IF1, 0x0000); CAN_IF_Write(DB1, IF1, 0x0000); CAN_IF_Write(DB2, IF1, 0x0000); CAN_IF_Write(ARB2, IF1, ID_MVAL | ((rx_id) << 2)); /* Transfer data to message RAM */ CAN_IF_writeBuf(IF1, msg_no); } else { rx_id &= (0x1<<30)-1 ; /* Mask ID bit */ /* Mxtd: 1, Mdir: 0, Mask is 0x1FFFFFFF */ CAN_IF_Write(MSK1, IF1, ID_EXT_MASK & 0xFFFF); CAN_IF_Write(MSK2, IF1, MASK_MXTD | (ID_EXT_MASK >> 16)); /* MsgVal: 1, Mtd: 1, Dir: 0 */ CAN_IF_Write(ARB1, IF1, (rx_id) & 0xFFFF); CAN_IF_Write(MCTRL, IF1, rmten|UMSK|RXIE|EOB|CAN_DLC_MAX); CAN_IF_Write(DA1, IF1, 0x0000); CAN_IF_Write(DA2, IF1, 0x0000); CAN_IF_Write(DB1, IF1, 0x0000); CAN_IF_Write(DB2, IF1, 0x0000); CAN_IF_Write(ARB2, IF1, ID_MVAL | ID_MTD | ((rx_id) >> 16)); /* Transfer data to message RAM */ CAN_IF_writeBuf(IF1, msg_no); } return; }
/*********************************************************************//** * @brief Send a message to the CAN port * @param[in] msg_no message object number * @param[in] msg_ptr msg buffer pointer * @return None **********************************************************************/ void CAN_Send(uint8_t msg_no, uint32_t *msg_ptr ) { uint32_t tx_id, Length; if(msg_ptr == NULL) return; /* first is the ID, second is length, the next four are data */ tx_id = *msg_ptr++; Length = *msg_ptr++; if(Length>CAN_DLC_MAX)Length = CAN_DLC_MAX; CAN_IF_Write(MCTRL, IF1, UMSK|TXIE|TXRQ|EOB|RMTEN|(Length & DLC_MASK)); CAN_IF_Write(DA1, IF1, *msg_ptr); /* Lower two bytes of message pointer */ CAN_IF_Write(DA2, IF1, (*msg_ptr++)>>16); /* Upper two bytes of message pointer */ CAN_IF_Write(DB1, IF1, *msg_ptr); /* Lower two bytes of message pointer */ CAN_IF_Write(DB2, IF1, (*msg_ptr)>>16); /* Upper two bytes of message pointer */ /* Configure arbitration */ if(!(tx_id & (0x1<<30))) /* bit 30 is 0, standard frame */ { /* Mxtd: 0, Mdir: 1, Mask is 0x7FF */ CAN_IF_Write(MSK2, IF1, MASK_MDIR | (ID_STD_MASK << 2)); CAN_IF_Write(MSK1, IF1, 0x0000); /* MsgVal: 1, Mtd: 0, Dir: 1, ID = 0x200 */ CAN_IF_Write(ARB1, IF1, 0x0000); CAN_IF_Write(ARB2, IF1, ID_MVAL| ID_DIR | (tx_id << 2)); } else /* Extended frame */ { /* Mxtd: 1, Mdir: 1, Mask is 0x7FF */ CAN_IF_Write(MSK2, IF1, MASK_MXTD | MASK_MDIR | (ID_EXT_MASK >> 16)); CAN_IF_Write(MSK1, IF1, ID_EXT_MASK & 0x0000FFFF); /* MsgVal: 1, Mtd: 1, Dir: 1, ID = 0x200000 */ CAN_IF_Write(ARB1, IF1, tx_id & 0x0000FFFF); CAN_IF_Write(ARB2, IF1, ID_MVAL|ID_MTD | ID_DIR | (tx_id >> 16)); } /* Write changes to message RAM */ CAN_IF_writeBuf(IF1, msg_no); return; }
/*********************************************************************//** * @brief Handle valid received message * @param[in] LPC_C_CANx Select C_CAN peripheral, should be LPC_C_CAN0 or LPC_C_CAN1 * @param[in] msg_no Message Object number * @return None **********************************************************************/ void CAN_RxInt_MessageProcess(LPC_C_CANn_Type* LPC_C_CANx, uint8_t msg_no ) { uint32_t msg_id; uint32_t *p_add; uint32_t reg1, reg2; /* Import message object to IF2 */ CAN_IF_readBuf(LPC_C_CANx, IF2, msg_no); /* Read the message into the IF registers */ if(LPC_C_CANx == LPC_C_CAN0) p_add = (uint32_t *)&recv_buff[0]; else if(LPC_C_CANx == LPC_C_CAN1) p_add = (uint32_t *)&recv_buff[1]; if( CAN_IF_Read(LPC_C_CANx, ARB2, IF2) & ID_MTD ) /* bit 28-0 is 29 bit extended frame */ { /* mask off MsgVal and Dir */ reg1 = CAN_IF_Read(LPC_C_CANx, ARB1, IF2); reg2 = CAN_IF_Read(LPC_C_CANx, ARB2, IF2); msg_id = (reg1|(reg2<<16)); } else { /* bit 28-18 is 11-bit standard frame */ msg_id = (CAN_IF_Read(LPC_C_CANx, ARB2, IF2) &0x1FFF) >> 2; } p_add[0] = msg_id; p_add[1] = CAN_IF_Read(LPC_C_CANx, MCTRL, IF2) & 0x000F; /* Get Msg Obj Data length */ p_add[2] = (CAN_IF_Read(LPC_C_CANx, DA2, IF2)<<16) | CAN_IF_Read(LPC_C_CANx, DA1, IF2); p_add[3] = (CAN_IF_Read(LPC_C_CANx, DB2, IF2)<<16) | CAN_IF_Read(LPC_C_CANx, DB1, IF2); /* Clear interrupt pending bit */ CAN_IF_Write(LPC_C_CANx, MCTRL, IF2, UMSK|RXIE|EOB|CAN_DLC_MAX); /* Save changes to message RAM */ CAN_IF_writeBuf(LPC_C_CANx, IF2, msg_no); return; }