⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mscandrvlite.c

📁 freescale最新的16位单片机
💻 C
📖 第 1 页 / 共 4 页
字号:
                        MB_MSCAN[2] = buffer;                           /* write buffer # */
                        MSCAN_L_Load_Buff(TX_BUFF2, buffer, MB_ID_Ref);
                        CANTFLG = 0x04;                                 /* write 1 to TXE to schedule buffer */
                        CANTIER |= 0x04;                                /* enable interrupt for this buffer */
                  }
#if (NO_OF_MSCAN_TXBUFFER != 3)
#error msCAN buffer not checked
#endif
            }
      }     /* end: If all msCAN transmit buffers are already scheduled */
}


/******************************************************************************
Function Name     :     MSCAN_L_Load_Buff
Engineer          :     Stuart Robb
Date              :     1/7/98

Arguments         : msCAN buffer number
                          driver buffer number
                          address of message Identifier

Return            : none
Notes             : All interrupts must be disabled when this function is called
******************************************************************************/
void
MSCAN_L_Load_Buff (UINT8 TX_Buff, UINT8 buffer, UINT8 MO_ID_Ref)
{
      UINT8 *bufferData;                        
      UINT8 dataLength, 
              i;
      
      CANTBSEL = TX_Buff;                                    /* select TX buffer into register space */
      
      *TX_BUFF_IDR_Ptr = M_Identifier_CAN0[MO_ID_Ref];       /* copy 32-bit ID to msCAN buffer */
            
      if (BufferMode_CAN0[buffer] == TXRF)                   /* remote frame to be transmitted */
      {
            if (M_IdentifierType_CAN0[MO_ID_Ref] == STANDARD)
            {
                  TX_BUFF_IDR1 |= 0x10;                      /* set RTR in Standard Identifier */
            }
            else  /* extended ID */
            {
                  TX_BUFF_IDR3 |= 0x01;                      /* set RTR in Extended Identifier */
            }
      }  /* end: if remote frame */

      else            /* data frame to be transmitted */
      {
            dataLength = BufferDLC_CAN0[buffer];
            TX_BUFF_DLR = dataLength;                        /* copy DLC to msCAN buffer */

            bufferData = BufferData_CAN0[buffer];                 

            for (i = 0; i < dataLength; i++)
            {
                  TX_BUFF_DSR_Ptr[i] = bufferData[i];        /* copy data to msCAN buffer */
            }
      }               /* end: else data frame */


      TX_BUFF_TBPR = BufferID_Ref_CAN0[buffer];          /* set priority = ID_Ref */

      BufferStatus_CAN0[buffer] = QUEUED2;            
}

/******************************************************************************
Function Name     :     CAN_L_AbortMB
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     buffer number 

Return            :     ERR_OK if no error, otherwise error code
******************************************************************************/
UINT8
CAN_L_AbortMB (UINT8 buffer)
{
      UINT8 currentCANTIER;

      if (CANCTL1 & INITAK)
      {
            return (ERR_INIT);
      }

      if (buffer >= NoOfMB)
      {
            return (ERR_MB);
      }

      if (BufferMode_CAN0[buffer] == RXDF)
      {
            return (ERR_CONFIG);
      }

      SEI;
      currentCANTIER = CANTIER;
      CANRIER &= ~RXFIE;                                     /* disable receive interrupt */
      CANTIER = 0;                                           /* disable transmit interrupts */
      if (!(CCRcopy & IMASK))
      {
            CLI;                                             /* restore interrupt mask */
      }

      switch (BufferStatus_CAN0[buffer])
      {
            case QUEUED:
                  BufferStatus_CAN0[buffer] = ABORTED;
                  break;

            case QUEUED2:
                  BufferStatus_CAN0[buffer] = ABORTREQ;

                  if (MB_MSCAN[0] == buffer)                 /* Message Buffer in msCAN buffer */
                  {
                        CANTARQ |= 0x01;              /* set ABTRQi for msCAN buffer */
                  }
                  
                  else
                  {
                        if (MB_MSCAN[1] == buffer)           /* Message Buffer in msCAN buffer */
                        {
                              CANTARQ |= 0x02;        /* set ABTRQi for msCAN buffer */
                        }
                        
                        else
                        {
                              CANTARQ |= 0x04;        /* set ABTRQi for msCAN buffer */
                        }

#if (NO_OF_MSCAN_TXBUFFER != 3)
#error msCAN buffer not checked
#endif
                  }
                  break;

            default:                                         /* not queued */
                  CANRIER |= RXFIE;                          /* restore receive interrupt */
                  CANTIER = currentCANTIER;                  /* restore transmit interrupts */
                  return (ERR_NOTQED);
      }

      CANRIER |= RXFIE;                                        /* restore receive interrupt */
      CANTIER = currentCANTIER;                              /* restore transmit interrupts */
      return (ERR_OK);
}

/******************************************************************************
Function Name     :     CAN_L_ReadDataMB
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     buffer number
                        address for data 

Return            :     ERR_OK if no error, otherwise error code
******************************************************************************/
UINT8
CAN_L_ReadDataMB (UINT8 buffer, UINT8* dataPtr)
{
      UINT8 errorStatus;

      errorStatus = L_ReadDataMB (buffer, dataPtr);

      CANRIER |= RXFIE;                                        /* restore receive interrupt */
      return (errorStatus);   
}

/******************************************************************************
Function Name     :     L_ReadDataMB
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     buffer number
                        address for data 

Return            :     ERR_OK if no error, otherwise error code
******************************************************************************/
UINT8
L_ReadDataMB (UINT8 buffer, UINT8* dataPtr)
{
      UINT8 *bufferPtr;       
      UINT8 dataLength, 
              i;

      if (buffer >= NoOfMB)
      {
            return (ERR_MB);
      }

      if (BufferMode_CAN0[buffer] != RXDF)
      {
            return (ERR_CONFIG);
      }

      if (BufferStatus_CAN0[buffer] == NODATA)
      {
            return (ERR_NODATA);
      }

      SEI;                                                   /* disable all interrupts */
      CANRIER &= ~RXFIE;                                       /* disable receive interrupt */
      if (!(CCRcopy & IMASK))
      {
            CLI;                                             /* restore interrupt mask */
      }

      dataLength = BufferDLC_CAN0[buffer];
      *dataPtr = dataLength;                                 /* copy DLC */
      dataPtr++;

      bufferPtr = BufferData_CAN0[buffer];                   /* BufferData_CAN0[buffer] is first dimension */

      for (i = 0; i < dataLength; i++)                       /* copy data */
      {
            dataPtr[i] = bufferPtr[i];
      }

      BufferStatus_CAN0[buffer] = READDATA;

      return (ERR_OK);
}

/******************************************************************************
Function Name     :     CAN_L_ReadMB
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     buffer number
                        address for data 

Return            :     ERR_OK if no error, otherwise error code
******************************************************************************/
UINT8
CAN_L_ReadMB (UINT8 buffer, UINT8* dataPtr)
{
      UINT8 errorStatus;

      errorStatus = L_ReadDataMB (buffer, dataPtr);
      
      if (errorStatus == ERR_OK)
      {
            if (TimeStampOption)
            {
                  *(UINT16 *)(dataPtr + 9) = BufferTimeStamp_CAN0[buffer];     /* copy time stamp */
            }

            else
            {
                  errorStatus = ERR_TS;
            }
      }

      CANRIER |= RXFIE;                                        /* restore receive interrupt */
      return (errorStatus);
}

/******************************************************************************
Function Name     :     CAN_ReadTimeMB
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     buffer number
                        address for data 

Return            :     ERR_OK if no error, otherwise error code
******************************************************************************/
UINT8
CAN_L_ReadTimeMB (UINT8 buffer, UINT16* dataPtr)
{
      if (!TimeStampOption)
      {
            return (ERR_TS);
      }

      if (buffer >= NoOfMB)
      {
            return (ERR_MB);
      }

      if (BufferMode_CAN0[buffer] == CLOSED)
      {
            return (ERR_CONFIG);
      }

      if (BufferStatus_CAN0[buffer] < TRANSMITTED)           /* NODATA, VALIDDATA, QUEUED, QUEUED2, ABORTREQ, ABORTED */
      {
            return (ERR_NODATA);
      }

      SEI;

      *dataPtr = BufferTimeStamp_CAN0[buffer];          /* copy time stamp */

      if (!(CCRcopy & IMASK))
      {
            CLI;                                             /* restore interrupt mask */
      }

      return (ERR_OK);

}

/******************************************************************************
Function Name     :     CAN0_TransmitISR
Engineer          :     Stuart Robb
Date              :     10/8/98

Arguments         :     none
Return            :     none
Notes             :     Hiware compiler version 5.0.7 fixes bug.
******************************************************************************/
#ifdef HICROSS
#pragma TRAP_PROC
#endif

#ifdef COSMIC
@interrupt
#endif

void
CAN0_TransmitISR (void)
{
      UINT8  TX_Buff;
      UINT8  interruptBufferBit,
             interruptBufferNo, 
             buffer, 
             highestPriority = 0xff, 
             highestPriorityBuffer,
             nextBuffer = LowestQueuedBuffer;

#ifdef BENCHMARK
      PORTB |= 0x02;                                          /* set bit 1 */
#endif

      /* Find buffer that caused interrupt, and write new status */

      interruptBufferBit = (CANTFLG & CANTIER);                       /* position of set bit indicates buffer */

      if (interruptBufferBit & 0x01)
      {
            interruptBufferNo = 0;
            TX_Buff = TX_BUFF0;
            CANTIER &= ~0x01;                                    /* disable interrupt */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -