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

📄 main.c

📁 MC9S12DG128上两路CAN模块收发通讯例程
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <string.h>
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/*****************************
    Function Prototype
*****************************/
extern  void Init_CAN0(void);
extern  void Init_CAN4(void);

void CAN0TxData(void);
void CAN4TxData(void);
void delay(void);

/*****************************
    Variable Declaration 
*****************************/
struct CANDATA{
  byte id[4];
  byte data[8];
  byte length;
  byte prio;
};

struct CANDATA send_data;
struct CANDATA recv_data;
unsigned char j=0;
unsigned char txflag=1;

void main(void) {

  DDRB = 0xff;
  PORTB = 0;
  Init_CAN0();
  Init_CAN4();
  
  EnableInterrupts;

  

  for(;;) {
    PORTB++;
    CAN4TxData();
    delay();
  } 
}


void CAN0TxData(void) {
  unsigned char *s,*d;
  char cansel;
  unsigned char i;
  while(txflag!=1);
  txflag = 0;
  j++;
  send_data.id[0] = 0x47;
  send_data.id[1] = 0xF8;
  send_data.id[2] = j;
  send_data.id[3] = 0x10;
  send_data.data[0] = j;
  send_data.data[1] = j+1;
  send_data.data[2] = 'c';
  send_data.data[3] = 'd';
  send_data.data[4] = 'e';
  send_data.data[5] = 'f';
  send_data.data[6] = 'g';
  send_data.data[7] = 'h';  
  send_data.length = 8;
  send_data.prio = 0;

  CAN0TBSEL = CAN0TFLG;
  cansel = CAN0TBSEL;

  
  d = &CAN0TXIDR0;
  s = (unsigned char*)&send_data;
  
  for(i=0;i<14;i++){
    *d++ = *s++;
  }
  
  CAN0TFLG = CAN0TBSEL;
  while(!(CAN0TFLG&cansel));
  
  
}

void CAN4TxData(void) {
  unsigned char *s,*d;
  char cansel;
  unsigned char i;
  while(txflag!=1);
  txflag = 0;
  j++;
  send_data.id[0] = 0x47;
  send_data.id[1] = 0xF8;
  send_data.id[2] = j;
  send_data.id[3] = 0x10;
  send_data.data[0] = j;
  send_data.data[1] = j+1;
  send_data.data[2] = 'c';
  send_data.data[3] = 'd';
  send_data.data[4] = 'e';
  send_data.data[5] = 'f';
  send_data.data[6] = 'g';
  send_data.data[7] = 'h';  
  send_data.length = 8;
  send_data.prio = 0;

  CAN4TBSEL = CAN4TFLG;
  cansel = CAN4TBSEL;

  
  d = &CAN4TXIDR0;
  s = (unsigned char*)&send_data;
  
  for(i=0;i<14;i++){
    *d++ = *s++;
  }
  
  CAN4TFLG = CAN4TBSEL;
  while(!(CAN4TFLG&cansel));
  
  
}

void delay(void) {
  int i;
  for(i=0;i<30000;i++){
    asm nop;
    asm nop;
    asm nop;
  }
}

/*****************************
    System ISR function
*****************************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC

//ISR:CAN0 Receive Frame Interrupt
void ISR_CAN0_RxF(void)  {
  unsigned char i,*s,*d;
  

  s = &CAN0RXIDR0;
  d = (unsigned char*)&recv_data;
  
  for(i=0;i<13;i++){
    *d++ = *s++;
  }
  i=CAN0RXERR;
  txflag = 1;
  CAN0RFLG = 0x01;
  
  asm{
    pula;
    rti;
  }

}

void ISR_CAN4_RxF(void)  {
  unsigned char i,*s,*d;
  

  s = &CAN4RXIDR0;
  d = (unsigned char*)&recv_data;
  
  for(i=0;i<13;i++){
    *d++ = *s++;
  }
  i=CAN4RXERR;
  txflag = 1;
  CAN4RFLG = 0x01;
  
  asm{
    pula;
    rti;
  }

}
#pragma CODE_SEG DEFAULT

⌨️ 快捷键说明

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