📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/* Error Flags Definition */
#define NO_ERR 0x00
#define ERR_BUFFER_FULL 0x80
/* Functions Prototypes */
void CANInit(void);
unsigned char CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata );
void Delay(void);
/* Global Variables */
unsigned char rxdata[8];
/* Application */
void main () {
unsigned char errorflag = NO_ERR;
unsigned char txbuff[] = "S12DG---";
DDRH_DDRH1 = 1;
PTH_PTH1 = 0;
CANInit(); /* Initialize MSCAN12 Module */
while(!(CAN0CTL0&0x10)); /* Wait for Synchronization */
CAN0RFLG = 0xC3; /* Reset Receiver Flags
*
* 0b11000011
* ||||||||__ Receive Buffer Full Flag
* |||||||___ Overrun Interrupt Flag
* ||||||____
* |||||_____>- Transmitter Status Bits
* ||||______
* |||_______>- Receiver Status Bits
* ||________ CAN Status Change Interrupt Flag
* |_________ Wake-Up Interrupt Flag
*/
CAN0RIER = 0x01; /* Enable Receive Buffer Full Interrupt
*
* 0b00000001
* ||||||||__ Receive Buffer Full Int enabled
* |||||||___ Overrun Int disabled
* ||||||____
* |||||_____>- Tx Status Change disabled
* ||||______
* |||_______>- Rx Status Change disabled
* ||________ Status Change Int disabled
* |_________ Wake-Up Int disabled
*/
EnableInterrupts;
for (;;) {
errorflag = CAN0SendFrame((0x877E4326), 0x00, sizeof(txbuff)-1, txbuff);
Delay();
}
}
/*
* CANInit: This function sets the module into soft reset mode and then
* initializes the timing, control and filter registers.
*
* Bit Timing Definitions
* ----------------------
*
* Parameters: None
*
* Return : None
*/
void CANInit(void) {
CAN0CTL0 = 0x01; /* Enter Initialization Mode
*
* 0b00000001
* ||||||||__ Enter Initialization Mode
* |||||||___ Sleep Mode Request bit
* ||||||____ Wake-Up disabled
* |||||_____ Time stamping disabled
* ||||______ Synchronized Status
* |||_______ CAN not affected by Wait
* ||________ Receiver Active Status bit
* |_________ Received Frame Flag bit
*/
while (!(CAN0CTL1&0x01)){}; /* Wait for Initialization Mode acknowledge
* INITRQ bit = 1
*/
CAN0CTL1 = 0xA0; /* Enable MSCAN module and LoopBack Mode
*
* 0b10100000
* ||||||||__ Initialization Mode Acknowledge
* |||||||___ Sleep Mode Acknowledge
* ||||||____ Wake-up low-pass filter disabled
* |||||_____ Unimplemented
* ||||______ Listen Only Mode disabled
* |||_______ Loop Back Mode enabled
* ||________ Ext Osc/Xtal as Clock Source
* |_________ MSCAN Module enabled
*/
CAN0BTR0 = 0xC1; /* Synch Jump = 2 Tq clock Cycles
*
* 0b01000011
* ||||||||__
* |||||||___\
* ||||||____ |
* |||||_____ |_ CAN Clock Prescaler = 4
* ||||______ |
* |||_______ |
* ||________/
* |_________>- SJW = 2
*/
CAN0BTR1 = 0xF6; /* Set Number of samples per bit, TSEG1 and TSEG2
*
* 0b00010100
* ||||||||__
* |||||||___|
* ||||||____|- TSEG1 = 5
* |||||_____|
* ||||______
* |||_______\_ TSEG2 = 2
* ||________/
* |_________ One sample per bit
*/
CAN0IDAC = 0x10; /* Set four 16-bit Filters
*
* 0b00010000
* ||||||||__
* |||||||___\_ Filter Hit Indicator
* ||||||____/
* |||||_____ Unimplemented
* ||||______
* |||_______>- Four 16-bit Acceptance Filters
* ||________
* |_________>- Unimplemented
*/
/* Acceptance Filters */
CAN0IDAR0 = 0; //|\ 16 bit Filter 0
CAN0IDMR0 = 0xFF; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR1 = 0; //| / with ID 0x100
CAN0IDMR1 = 0xFF; //|/
CAN0IDAR2 = 0; //|\ 16 bit Filter 1
CAN0IDMR2 = 0; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR3 = 0; //| / with ID 0x000
CAN0IDMR3 = 0; //|/
CAN0IDAR4 = 0; //|\ 16 bit Filter 2
CAN0IDMR4 = 0; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR5 = 0; //| / with ID 0x000
CAN0IDMR5 = 0; //|/
CAN0IDAR6 = 0; //|\ 16 bit Filter 3
CAN0IDMR6 = 0; //| \__ Accepts Standard Data Frame Msg
CAN0IDAR7 = 0; //| / with ID 0x000
CAN0IDMR7 = 0; //|/
CAN0CTL0 = 0x00; /* Exit Initialization Mode Request */
while ((CAN0CTL1&0x01) != 0){}; /* Wait for Normal Mode */
}
/*
* CANSendFrame: This function sends a frame taking the ID, and a pointer to
* data as parameters. It might not be the best way to do it but
* hey, it works!
*
* Parameters: id - CAN frame ID in the MSCAN format.
* priority - value copied into the internal local priority register.
* length - Number of data bytes contained in the frame.
* *txdata - pointer to the data to transmit.
*
* Return : None
*/
unsigned char CAN0SendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata ){
unsigned char index;
unsigned char txbuffer = {0};
if (!CAN0TFLG) /* Is Transmit Buffer full?? */
return ERR_BUFFER_FULL;
CAN0TBSEL = CAN0TFLG; /* Select lowest empty buffer */
txbuffer = CAN0TBSEL; /* Backup selected buffer */
/* Load Id to IDR Registers */
*((unsigned long *) ((unsigned long)(&CAN0TXIDR0)))= id;
for (index=0;index<length;index++) {
*(&CAN0TXDSR0 + index) = txdata[index]; /* Load data to Tx buffer
* Data Segment Registers
*/
}
CAN0TXDLR = length; /* Set Data Length Code */
CAN0TXTBPR = priority; /* Set Priority */
CAN0TFLG = txbuffer; /* Start transmission */
while ((CAN0TFLG & txbuffer) != txbuffer); /* Wait for Transmission
* completion
*/
return NO_ERR;
}
/*
* Delay: Simple loop to generate delays.
*
* Parameters: none
*
* Return: none
*/
void Delay (void) {
unsigned int counter;
for (counter=0;counter<10000;counter++);
}
/*
* CANRxISR: Rx ISR for CAN frames. Data is copied to a global variable.
*
* Parameters: none
*
* Return : None
*/
#pragma CODE_SEG NON_BANKED
void interrupt 38 CAN0RxISR(void) {
unsigned char length, index;
length = (CAN0RXDLR & 0x0F);
for (index=0; index<length; index++)
rxdata[index] = *(&CAN0RXDSR0 + index); /* Get received data */
CAN0RFLG = 0x01; /* Clear RXF */
}
#pragma CODE_SEG DEFAULT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -