📄 main.c
字号:
// The route is testing CAN
#include "mb90540.h"
// BTR value get from BITMIXER.EXE in FUJISTU and references to CANOPEN specfication
#define BTR_16M_2000K 0x1400
#define BTR_16M_1000K 0x1C00
#define BTR_16M_500K 0x1C01
#define BTR_16M_250K 0x1C03
#define BTR_16M_125K 0x4987
#define BTR_16M_100K 0x5CC7
// Initialization CAN0
void InitCAN0(void)
{
CSR0_TOE = 1; // BIT 7: enable PIN 73 for CAN0
// transmit output
do
{
CSR0_HALT = 1;
// BIT 0: stop bus operation
}while(CSR0_HALT == 0);
BVALR0_BVAL0 = 0; // buffer0 data is invalid
BVALR0_BVAL1 = 0; // buffer1 data is invaild
BTR0 = BTR_16M_125K; // set bit timeing for 250k
CSR0 = 0x0080; // activate can bus operation
// acceptance mask definition
AMR00 = 0x00;
AMR10 = 0x00;
// full bit compare
AMSR0_AMS0 = 0;
AMSR0_AMS1 = 0;
// 11 bit identifier
IDER0_IDE0 = 0;
IDER0_IDE1 = 0;
// set idr0 to 1, ID mapping to ID register value
// reference to BITMIXER.EXE
IDR0(0) = 0x2000;
// set idr1 to 2
IDR0(1) = 0x4000;
// disable buffer0 transmission interrupt
TIER0_TIE0 = 0;
// disable buffer1 transmission interrupt
TIER1_TIE1 = 0;
// enable buffer0 receive interrupt
RIER0_RIE0 = 1;
// enable buffer1 receive interrupt
RIER0_RIE1 = 1;
// enable buffer0 data is vaild
BVALR0_BVAL0 = 1;
// enable buffer1 data is vaild
BVALR0_BVAL1 = 1;
// no transmission
TREQR0_TREQ0 = 0;
TREQR0_TREQ1 = 0;
// no wait for remote request
RFWTR0_RFWT0 = 0;
RFWTR0_RFWT1 = 0;
// data frame to be transferred
TRTRR0_TRTR0 = 0;
TRTRR0_TRTR1 = 0;
}
// Initialization UART1
void InitUart(void)
{
// initialize UART1 e.g. operation mode, baud rate, stop bit, data length etc.
// set clockspeed as PLLX4 in start.asm
// Make SOT1 working
DDR4_D45 = 1;
// serial mode register
SMR1 = 0x01;
// serial control register
SCR1 = 0x13;
// prescaler control register,baud rate 9600
U1CDCR = 0x88;
// enable recvive interrupt
SSR1_RIE = 1;
}
void delay()
{
int i,j;
for(j = 0; j <= 3; j++)
for(i = 0; i <= 32760; i++);
}
// sends a char
void Putch (char ch)
{
// wait for transmit buffer is empty
while (SSR1_TDRE == 0);
// put char into buffer
SODR1 = ch;
}
void CAN0WriteCh (unsigned ch)
{
DLCR0(0) = 1; // data length
DTR0_WORD(0,0) = ch;
TREQR0_TREQ0 = 1;
while (TCR0_TC0==0)
PDR2 = 0x5a;
TCR0_TC0=0;
}
// UART1 receive and CAN transfer interrupt route
__interrupt void UART1RevIRQ(void)
{
unsigned char ch;
ch = SIDR1;
CAN0WriteCh(ch);
}
// CAN0 receive interrupt route
unsigned char RevFlag0,RevFlag1,DataLength;
unsigned char DataBuffer[8];
__interrupt void CANRevIRQ (void)
{
unsigned char i;
// read data in receive buffer0
if(RCR0_RC0 == 1)
{
// set receive buff0 flag
RevFlag0 = 1;
// get receive buffer0 length
DataLength = DLCR0(0);
RCR0_RC0 = 0;
// get receive buffer0 data
for(i = 0; i < DataLength; i++)
{
DataBuffer[i] = DTR0_BYTE(0,i);
Putch(DataBuffer[i]);
}
}
else
RevFlag0 = 0;
// read data in receive buffer1
if(RCR0_RC1 == 1)
{
// set receive buff1 flag
RevFlag1 = 1;
// get receive buffer1 length
DataLength = DLCR0(1);
RCR0_RC1 = 0;
// get receive buffer1 data
for(i = 0; i < DataLength; i++)
{
DataBuffer[i] = DTR0_BYTE(1,i);
Putch(DataBuffer[i]);
}
}
else
RevFlag1 = 0;
// display DataBuffer[0] data with LED
PDR2 = ~DataBuffer[0];
}
main()
{
unsigned char k = 0;
// enable PORT2 as Output
DDR2 = 0xff;
PDR2 = 0x00;
delay();
delay();
PDR2 = 0x55;
delay();
PDR2 = 0xaa;
delay();
PDR2 = 0xff;
InitUart();
InitCAN0();
InitIrqLevels();
// enable all interrupt level
__set_il(7);
// enable interrupt
__EI();
while(1)
{
if(RevFlag0 == 0)
{
PDR2_P26 = 0;
delay();
PDR2_P26 = 1;
delay();
}
else
RevFlag0 = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -