public void tSend(CANMSG message) { byte[] txDATA = new byte[10]; txDATA[0] = WRITE; txDATA[1] = TXB0D0; for (int i = DataIndexOffset; i < message.DataLength + DataIndexOffset; i++) { txDATA[i] = message.data[i - DataIndexOffset]; } spiBus.Write(txDATA); }
public void tId2(CANMSG message) { byte val = 0x00; uint bit11Address = 0x00; bit11Address = (uint)(message.CANID); //val = (byte)(bit11Address >> 3); //WriteRegister(TXB0SIDH, val); val = (byte)(bit11Address << 5); WriteRegister(TXB0SIDL, val); }
/// <summary>Transmit a CAN message to the bus.</summary> /// <param name="message">The CAN Message to be transmitted.</param> /// <param name="timeout"></param> /// <returns></returns> public bool Transmit(CANMSG message, int timeout) { // Holds if message was sent or not. bool sentMessage = false; // Calculate the end time based on current device time. TimeSpan startTime = Utility.GetMachineTime(); TimeSpan endTime = startTime.Add(new TimeSpan(0, 0, 0, 0, timeout)); //-------------------------------------- // Set the CAN ID. byte val = 0x00; uint bit11Address = 0x00; uint bit18Address = 0x00; // Build Extended CAN ID if (message.IsExtended) { // Split the 11 bit and 18 bit sections of the ID. bit11Address = (uint)((message.CANID >> 16) & 0xFFFF); bit18Address = (uint)(message.CANID & 0xFFFFF); // Set the first part of the ID val = (byte)(bit11Address >> 5); WriteRegister(TXB0SIDH, val); // Set the second part of the ID. val = (byte)(bit11Address << 3); val |= (byte)(bit11Address & 0x07); // Mark the message as extended. val |= 1 << EXIDE; WriteRegister(TXB0SIDL, val); // Write the 18 bit part of the ID val = (byte)(bit18Address >> 8); WriteRegister(TXB0EID8, val); val = (byte)(bit18Address); WriteRegister(TXB0EID0, val); } else { // Transmit a 11 bit ID. bit11Address = (uint)(message.CANID); val = (byte)(bit11Address >> 3); WriteRegister(TXB0SIDH, val); val = (byte)(bit11Address << 5); WriteRegister(TXB0SIDL, val); } //-------------------------------------- val = (byte)(message.DataLength & 0x0f); // Check if is a remote frame if (message.IsRemote) { // Mark the frame as remote val |= (byte)(1UL << (TXRTR)); WriteRegisterBit(val, TXRTR, 1); } WriteRegister(TXB0DLC, val); //-------------------------------------- //Write Message Data byte[] txDATA = new byte[10]; txDATA[0] = WRITE; txDATA[1] = TXB0D0; for (int i = DataIndexOffset; i < message.DataLength + DataIndexOffset; i++) { txDATA[i] = message.data[i - DataIndexOffset]; } spi.Write(txDATA); //---------------------- // Command to transmit the CAN message WriteRegisterBit(TXB0CTRL, TXREQ, 1); //---------------------- // Wait untile time out to get confirmation of message was sent. while (Utility.GetMachineTime() < endTime) { val = ReadRegister(CANINTF); if ((val & TX0IF_MASK) == TX0IF_MASK) { sentMessage = true; break; } } ////Abort the send if failed WriteRegisterBit(TXB0CTRL, TXREQ, 0); ////And clear write interrupt WriteRegisterBit(CANINTF, TX0IF, 0); return sentMessage; }
/// <summary> /// Check if a new message was received by the transceiver. /// </summary> /// <param name="msg">The CAN message that will contain the retrived message.</param> /// <param name="timeout">The time to wait if a message become available.</param> /// <returns>True if a message was received.</returns> public bool Receive(out CANMSG msg, int timeout) { bool gotMessage = false; byte val; msg = new CANMSG(); TimeSpan startTime = Utility.GetMachineTime(); TimeSpan endTime = startTime.Add(new TimeSpan(0, 0, 0, 0, timeout)); gotMessage = false; while (Utility.GetMachineTime() < endTime) { val = ReadRegister(CANINTF); //If we have a message available, read it if ((val & RX0IF_MASK) == RX0IF_MASK) { gotMessage = true; break; } } if (gotMessage) { val = ReadRegister(RXB0CTRL); msg.IsRemote = ((val & 0x04) == 0x04) ? true : false; //Address received from, identify the identifier int adddresVal = 0; val = ReadRegister(RXB0SIDH); adddresVal |= (val << 3); val = ReadRegister(RXB0SIDL); adddresVal |= (val >> 5); bool isExtended = ((val & EXIDE_MASK) == EXIDE_MASK) ? true : false; uint adddresExtVal = 0; if (isExtended) { adddresExtVal = (uint)((val & 0x03) << 16); val = ReadRegister(RXB0EID8); adddresExtVal |= (uint)(val << 8); val = ReadRegister(RXB0EID0); adddresExtVal |= val; adddresVal = (int)((adddresVal << 18) | adddresExtVal); } msg.CANID = (uint)adddresVal; //Read data bytes val = ReadRegister(RXB0DLC); int dataLen = (val & 0xf); byte[] CmdBuffer = new byte[] { READ, RXB0D0 }; msg.data = new byte[dataLen]; spi.WriteRead(CmdBuffer, msg.data, 2); //And clear read interrupt WriteRegisterBit(CANINTF, RX0IF, 0); } else { } return gotMessage; }
public bool Transmit(CANMSG message, int timeout) { // Holds if message was sent or not. bool sentMessage = false; // Calculate the end time based on current device time. TimeSpan startTime = Utility.GetMachineTime(); TimeSpan endTime = startTime.Add(new TimeSpan(0, 0, 0, 0, timeout)); //-------------------------------------- // Set the CAN ID. byte val = 0x00; uint bit11Address = 0x00; uint bit18Address = 0x00; // Build Extended CAN ID if (message.IsExtended) { // Split the 11 bit and 18 bit sections of the ID. bit11Address = (uint)((message.CANID >> 16) & 0xFFFF); bit18Address = (uint)(message.CANID & 0xFFFFF); // Set the first part of the ID val = (byte)(bit11Address >> 5); WriteRegister(TXB0SIDH, val); // Set the second part of the ID. val = (byte)(bit11Address << 3); val |= (byte)(bit11Address & 0x07); // Mark the message as extended. val |= 1 << EXIDE; WriteRegister(TXB0SIDL, val); // Write the 18 bit part of the ID val = (byte)(bit18Address >> 8); WriteRegister(TXB0EID8, val); val = (byte)(bit18Address); WriteRegister(TXB0EID0, val); } else { // Transmit a 11 bit ID. bit11Address = (uint)(message.CANID); val = (byte)(bit11Address >> 3); WriteRegister(TXB0SIDH, val); val = (byte)(bit11Address << 5); WriteRegister(TXB0SIDL, val); } //-------------------------------------- val = (byte)(message.DataLength & 0x0f); // Check if is a remote frame if (message.IsRemote) { // Mark the frame as remote val |= (byte)(1UL << (TXRTR)); WriteRegisterBit(val, TXRTR, 1); } WriteRegister(TXB0DLC, val); //-------------------------------------- //Write Message Data byte[] txDATA = new byte[10]; txDATA[0] = WRITE; txDATA[1] = TXB0D0; for (int i = DataIndexOffset; i < message.DataLength + DataIndexOffset; i++) { txDATA[i] = message.data[i - DataIndexOffset]; } spiBus.Write(txDATA); //---------------------- // Command to transmit the CAN message WriteRegisterBit(TXB0CTRL, TXREQ, 1); //---------------------- // Wait untile time out to get confirmation of message was sent. while (Utility.GetMachineTime() < endTime) { val = ReadRegister(CANINTF); if ((val & TX0IF_MASK) == TX0IF_MASK) { sentMessage = true; break; } } ////Abort the send if failed WriteRegisterBit(TXB0CTRL, TXREQ, 0); ////And clear write interrupt WriteRegisterBit(CANINTF, TX0IF, 0); return(sentMessage); }
/// <summary> /// Check if a new message was received by the transceiver. /// </summary> /// <param name="msg">The CAN message that will contain the retrived message.</param> /// <param name="timeout">The time to wait if a message become available.</param> /// <returns>True if a message was received.</returns> public bool Receive(out CANMSG msg, int timeout) { bool gotMessage = false; byte val; msg = new CANMSG(); TimeSpan startTime = Utility.GetMachineTime(); TimeSpan endTime = startTime.Add(new TimeSpan(0, 0, 0, 0, timeout)); gotMessage = false; while (Utility.GetMachineTime() < endTime) { val = ReadRegister(CANINTF); //If we have a message available, read it if ((val & RX0IF_MASK) == RX0IF_MASK) { gotMessage = true; break; } } if (gotMessage) { val = ReadRegister(RXB0CTRL); msg.IsRemote = ((val & 0x04) == 0x04) ? true : false; //Address received from, identify the identifier int adddresVal = 0; val = ReadRegister(RXB0SIDH); adddresVal |= (val << 3); val = ReadRegister(RXB0SIDL); adddresVal |= (val >> 5); bool isExtended = ((val & EXIDE_MASK) == EXIDE_MASK) ? true : false; uint adddresExtVal = 0; if (isExtended) { adddresExtVal = (uint)((val & 0x03) << 16); val = ReadRegister(RXB0EID8); adddresExtVal |= (uint)(val << 8); val = ReadRegister(RXB0EID0); adddresExtVal |= val; adddresVal = (int)((adddresVal << 18) | adddresExtVal); } msg.CANID = (uint)adddresVal; //Read data bytes val = ReadRegister(RXB0DLC); int dataLen = (val & 0xf); byte[] CmdBuffer = new byte[] { READ, RXB0D0 }; msg.data = new byte[dataLen]; spi.WriteRead(CmdBuffer, msg.data, 2); //And clear read interrupt WriteRegisterBit(CANINTF, RX0IF, 0); } else { } return(gotMessage); }
/// <summary>Transmit a CAN message to the bus.</summary> /// <param name="message">The CAN Message to be transmitted.</param> /// <param name="timeout"></param> /// <returns></returns> public bool Transmit(CANMSG message, int timeout) { // Holds if message was sent or not. bool sentMessage = false; // Calculate the end time based on current device time. TimeSpan startTime = Utility.GetMachineTime(); TimeSpan endTime = startTime.Add(new TimeSpan(0, 0, 0, 0, timeout)); //-------------------------------------- // Set the CAN ID. byte val = 0x00; uint bit11Address = 0x00; uint bit18Address = 0x00; // Transmit a 11 bit ID. bit11Address = (uint)(message.CANID); val = (byte)(bit11Address >> 3); WriteRegister(TXB0SIDH, val); val = (byte)(bit11Address << 5); WriteRegister(TXB0SIDL, val); //-------------------------------------- val = (byte)(message.DataLength & 0x0f); // Check if is a remote frame if (message.IsRemote) { // Mark the frame as remote val |= (byte)(1UL << (TXRTR)); WriteRegisterBit(val, TXRTR, 1); } WriteRegister(TXB0DLC, val); //-------------------------------------- //Write Message Data byte[] txDATA = new byte[10]; txDATA[0] = WRITE; txDATA[1] = TXB0D0; for (int i = DataIndexOffset; i < message.DataLength + DataIndexOffset; i++) { txDATA[i] = message.data[i - DataIndexOffset]; } spi.Write(txDATA); //---------------------- // Command to transmit the CAN message WriteRegisterBit(TXB0CTRL, TXREQ, 1); //---------------------- // Wait untile time out to get confirmation of message was sent. //while (Utility.GetMachineTime() < endTime) //{ // val = ReadRegister(CANINTF); // if ((val & TX0IF_MASK) == TX0IF_MASK) // { // sentMessage = true; // break; // } //} ////Abort the send if failed //WriteRegisterBit(TXB0CTRL, TXREQ, 0); ////And clear write interrupt WriteRegisterBit(CANINTF, TX0IF, 0); return(sentMessage); }
public void tSend(CANMSG message) { byte[] txDATA = new byte[10]; txDATA[0] = WRITE; txDATA[1] = TXB0D0; for (int i = DataIndexOffset; i < message.DataLength + DataIndexOffset; i++) { txDATA[i] = message.data[i - DataIndexOffset]; } spi.Write(txDATA); }
// Have to hack the transmit function to work with chip select too. public void tId(CANMSG message) { byte val = 0x00; uint bit11Address = 0x00; bit11Address = (uint)(message.CANID); val = (byte)(bit11Address >> 3); WriteRegister(TXB0SIDH, val); val = (byte)(bit11Address << 5); WriteRegister(TXB0SIDL, val); }