/** * * Send a CAN frame. * * @param InstancePtr is a pointer to the driver instance * * @return XST_SUCCESS if successful, a driver-specific return code if not. * * @note * * This function waits until TX FIFO has room for at least one frame before * sending a frame. So this function may block if the hardware is not built * correctly. * ******************************************************************************/ static int SendFrame(XCanPs *InstancePtr) { u8 *FramePtr; int Index; int Status; /* * Create correct values for Identifier and Data Length Code Register. */ TxFrame[0] = (u32)XCanPs_CreateIdValue((u32)TEST_MESSAGE_ID, 0, 0, 0, 0); TxFrame[1] = (u32)XCanPs_CreateDlcValue((u32)FRAME_DATA_LENGTH); /* * Now fill in the data field with known values so we can verify them * on receive. */ FramePtr = (u8 *)(&TxFrame[2]); for (Index = 0; Index < FRAME_DATA_LENGTH; Index++) { *FramePtr++ = (u8)Index; } /* * Wait until TX FIFO has room. */ while (XCanPs_IsTxFifoFull(InstancePtr) == TRUE); /* * Now send the frame. * * Another way to send a frame is keep calling XCanPs_Send() until it * returns XST_SUCCESS. No check on if TX FIFO is full is needed anymore * in that case. */ Status = XCanPs_Send(InstancePtr, TxFrame); return Status; }
/** * * Send a CAN frame. * * @param InstancePtr is a pointer to the driver instance. * * @return None. * * @note None. * ******************************************************************************/ static void SendFrame(XCanPs *InstancePtr) { u8 *FramePtr; int Index; int Status; /* * Create correct values for Identifier and Data Length Code Register. */ TxFrame[0] = (u32)XCanPs_CreateIdValue((u32)TEST_MESSAGE_ID, 0, 0, 0, 0); TxFrame[1] = (u32)XCanPs_CreateDlcValue((u32)FRAME_DATA_LENGTH); /* * Now fill in the data field with known values so we can verify them * on receive. */ FramePtr = (u8 *)(&TxFrame[2]); for (Index = 0; Index < FRAME_DATA_LENGTH; Index++) { *FramePtr++ = (u8)Index; } /* * Now wait until the TX FIFO is not full and send the frame. */ while (XCanPs_IsTxFifoFull(InstancePtr) == TRUE); Status = XCanPs_Send(InstancePtr, TxFrame); if (Status != XST_SUCCESS) { /* * The frame could not be sent successfully. */ LoopbackError = TRUE; SendDone = TRUE; RecvDone = TRUE; } }