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

📄 main.c

📁 mb90340的CAN程序
💻 C
字号:
/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
/* ELIGIBILITY FOR ANY PURPOSES.                                             */
/*                 (C) Fujitsu Microelectronics Europe GmbH                  */
/*---------------------------------------------------------------------------
  MAIN.C
  - description
  - See README.TXT for project description and disclaimer.

/*---------------------------------------------------------------------------*/


#include "mb90340.h"

/*===========================================================================*/
/*====== UART 0 =============================================================*/
/*===========================================================================*/

void InitUart0(void)
{
  // Initialize UART asynchronous mode
  BGR0 = 1666; //  9600 Baud @ 16MHz
  // BGR0 = 2083; //  9600 Baud @ 20MHz  
  // BGR0 = 2499; //  9600 Baud @ 24MHz
  SCR0 = 0x17; // 8N1
  SMR0 = 0x0d; // enable SOT3, Reset, normal mode
  SSR0 = 0x00; // LSB first
}

void Putch0(char ch)         /* sends a char */
{
  while (SSR0_TDRE == 0);    /* wait for transmit buffer empty 	*/
  TDR0 = ch;                 /* put ch into buffer			*/
}
unsigned char Getch0(void)     /* Waits for and returns incomming char */
{
  unsigned char rxchar;
  
  for(;;)
  {

    while(SSR0_RDRF == 0)      /* Wait for data received  	           */
    {
      __wait_nop(); 
    }

    rxchar = RDR0;             /* Save receive register                */

    if ((SSR0 & 0xE0) != 0)    /* Check for errors PE, ORE, FRE        */
    {
      SCR0_CRE = 1;            /* Clear error flags 	                 */
    }
    else
    {
      return (rxchar);         /* Return received character            */
    }

  }
  
}



void Puts0(const char *Name2)  /* Puts a String to UART */
{
  int i,len;
 
  len = strlen(Name2);
	
  for (i=0; i<strlen(Name2); i++)   /* go through string                     */
  {
    if (Name2[i] == 10)
      Putch0(13);
    Putch0(Name2[i]);              /* send it out                           */
  }
}


/*===========================================================================*/
/*====== CAN ================================================================*/
/*===========================================================================*/

/*===== CAN1 ======= */

#define	BTR_16M_100k_20_70_3	0x5CC7
#define	BTR_20M_100k_20_70_3	0x5CC9
#define	BTR_24M_100k_20_70_3	0x5CCB

void InitCAN1(void)
{
  CSR1         = 0x81;                 /* bit 7: enable transmit output pin   */
                                      /* bit 0: stop bus operation           */
  while (!CSR1_HALT);
  
  BVALR1	      = 0;                    /* all message buffer are invalid      */
  BTR1         = BTR_16M_100k_20_70_3; /* set bit timeing for 100 kbaud       */
  CSR1         = 0x0080;               /* activate can bus operation          */
	
  AMR01        = 0;                    /* acceptance mask definition 0        */
  AMR11        = 0;                    /* acceptance mask definition 1        */
}


/*===== CAN Buffer ======= */

void CAN1_buffer1(void)
{
  /* CAN1: messagebuffer 1 will be used as receive-buffer                    */
  
  BVALR1_BVAL1 = 0;		            /* message buffer are invalid            */
  IDER1_IDE1   = 0;	                /* 11bit indentifier                     */
  IDR1(1)      = 0x4000;             /* => ID#2 (11bit id = ID28..ID18 @IDRx) */
  AMSR1_AMS1   = 1;		            /* full bit mask (basic can)             */
  TIER1_TIE1   = 0;
  BVALR1_BVAL1 = 1;		            /* message buffer are valid              */

  TREQR1_TREQ1 = 0;		            /* no transmition                        */
  RFWTR1_RFWT1 = 0;		            /* no wait for remote requeset           */
  TRTRR1_TRTR1 = 0;	                /* data frame transfer                   */
}

void CAN1_buffer6(void)
{
  /* CAN1: messagebuffer 6 will be used as send-buffer */
  
  BVALR1_BVAL6 = 0;		            /* message buffer are invalid            */
  IDER1_IDE6   = 0;	                /* 11bit indentifier                                */
  IDR1(6)      = 0x6000;             /* => ID#3 (11bit id = ID28..ID18 @IDRx) */
  AMSR1_AMS6   = 0;		            /* full bit compare                      */
  TIER1_TIE6   = 0;
  BVALR1_BVAL6 = 1;		            /* message buffer are valid              */

  TREQR1_TREQ6 = 0;		            /* no transmition                        */
  RFWTR1_RFWT6 = 0;		            /* no wait for remote requeset           */
  TRTRR1_TRTR6 = 0;	                /* data frame transfer                   */
}

/*===== Readout Buffer x ======= */

unsigned char GetCan1Data (char	Id, unsigned char *BufPtr)
{
  char Len, pos;
  int  Data;
	
  *BufPtr++ = Len = DLCR1(Id);
  for (pos=0; pos<(Len/2+1);pos++)
  {
    Data      = DTR1_WORD(Id,pos);
    *BufPtr++ = Data&0xFF;
    *BufPtr++ = Data>>8;
  }
  return (Len);	
}


/*===========================================================================*/
/*========== MAIN ===========================================================*/
/*===========================================================================*/

void main(void) 
{
  unsigned char ch, CAN1Data[9];
  unsigned int i;
  unsigned long l;
  
  InitIrqLevels();
  __set_il(7);                /* allow all levels          */
  __EI();                     /* globaly enable interrupts */
  
  /* initialize UART0 */
  InitUart0();
  Puts0("UART'0' will be echoed\n");		
  Puts0("UART'0' will be send to CAN ID #3\n");		
  Puts0("CAN ID #2 will be send to UART'0'\n");		
  Puts0("================================================================\n\n");

  /* initialize CAN */ 
  
  InitCAN1(); 
  CAN1_buffer1();
  CAN1_buffer6(); 

  while (1)
  {
    /* UART0 receive/send (echo) => CAN send */

    if (SSR0_RDRF)                    /* check Receive-buffer           */
    {
      Puts0("UART'0'  receive: ");
      ch = RDR0;	                  /* readout character              */
      Putch0(ch);    	              /* send character                 */
      if (ch==13)	
        Putch0(10);

      Puts0("   CAN send    : ");

      DLCR1(6) = 1;	                  /* 1 Byte to send via CAN        */
      DTR1_WORD(6,0) = ch;             /* Character to send              */
      TREQR1_TREQ6 = 1;		          /* transmition request            */
      l = 0;
      while (   (TCR1_TC6==0)             /* wait for transmission complete */
             && (l++ < 50000) );         /* or timeout */
      TCR1_TC6=0;
      if (l == 50001) 
        Puts0("  timeout !\n");
      else
        Puts0("  sent !\n");
    }

    /* CAN Receive */

    if (RCR1_RC1)  /* wait for receive complete indication of buffer 1 */
    {
      for (i = 1; i <= GetCan1Data (1, CAN1Data); i++)
      {
        Puts0("CAN      receive: ");
        Putch0(CAN1Data[i]);
        Puts0("\n");
      }
	RCR1_RC1=0;			
    }
  } /* while (1) */

}/* end of main */

⌨️ 快捷键说明

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