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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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);
        }