📄 main.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 + -