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

📄 lqcanmain.c

📁 DG128 CAN接口程序 在飞思卡尔DG128完成CAN总线协议的通信
💻 C
字号:
/********************************************************
龙丘MC9S12(DG128)多功能开发板V4.0
编写:FS
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2008年12月12日
相关信息参考下列地址:
博客:  http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.6
Target : MC9S12DG128B
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz  

测试程序,用CAN0,CAN4进行收发:
作为发送节点则需要定义一个宏  THIS_IS_SENDER
作为接收节点则需要取消宏定义  THIS_IS_SENDER
*********************************************************/
#include <hidef.h>            /* common defines and macros */
#include <mc9s12dg128.h>      /* derivative information */
#include <stdio.h>
#include <string.h>
#include "LQprintp.h"
#include "LQfun.h"  
#include "LQ12864.h" 

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#ifndef U8
  typedef unsigned char U8;
  typedef unsigned int  U16;
  typedef unsigned long U32;
  typedef signed char   S8;
  typedef signed int    S16;
#endif
#ifndef NO_ERR
  #define NO_ERR 0x00
  #define IS_ERR 0x01
#endif
// 作为测试用:定义是什么类型的节点,如果是发送节点则需要此定义,否则注释掉此定义
#define THIS_IS_SENDER  
#define USE_LCD                //使用LCD
#define USE_LED                //使用LED
/*
struct CANDATA{
  byte id[4];
  byte data[8];  
  byte length;
  byte prio;
}send_data,recv_data;
*/
volatile U8 C0rxdata[9][9]={""};           
volatile U8 C4rxdata[9][9]={""};    
volatile int txrxerrflag;              
volatile U8 txbuff[9]="LongQiu";   
volatile U8 LedCnt=0;
U32 CAN0_ID=0x888e; 
U32 CAN4_ID=0x887e; 

#pragma CODE_SEG __NEAR_SEG NON_BANKED 
void interrupt 38  CAN0RxISR(void)
{
  U8 length,index,rxdlr;  
  
  length = (CAN0RXDLR & 0x0F);
  rxdlr=CAN0RXIDR0&0X0F;
  for (index=0; index<length; index++)
    C0rxdata[rxdlr][index] = *(&CAN0RXDSR0 + index); /* Get received data */
  printp("\nCAN0 RX DATA IS:%s",C0rxdata[rxdlr]);   
  #ifdef USE_LCD
    LCD_P6x8Str(34,1,C0rxdata[rxdlr]);
  #endif   
  #ifndef THIS_IS_SENDER
    ++LedCnt;
  #endif  
  CAN0RFLG = 0x01;   /* Clear RXF */
}
void interrupt 54  CAN4RxISR(void)
{
  U8 length,index,rxdlr; 
  
  length = (CAN4RXDLR & 0x0F);
  rxdlr=CAN4RXIDR0&0X0F;
  for (index=0; index<length; index++)
    C4rxdata[rxdlr][index] = *(&CAN4RXDSR0 + index); /* Get received data */
  printp("\nCAN4 RX DATA IS:%s",C4rxdata[rxdlr]);   
  #ifdef USE_LCD
    LCD_P6x8Str(34,5,C4rxdata[rxdlr]);
  #endif  
  #ifndef THIS_IS_SENDER
    #ifdef USE_LCD
      ++LedCnt;
    #endif
  #endif  
  CAN4RFLG = 0x01;   /* Clear RXF */
} 
//============================MAIN()===========================
void main(void) 
{
  /* put your own code here */
  int errorflagtime=0;   // symbol for translate  
  char mydata[9]="CAN0TX";
  unsigned long  TXID=0;
  
  Init_Dev();            // initial board  
  putstr("\nCAN0/4 test program started!");
  
  PORTB=0XFF;
  #ifdef USE_LCD   
    Draw_LQLogo();
    LCD_P6x8Str(19,7,"chiusir@163.com");
  #endif
  delayms(2000);         
  #ifdef USE_LCD
    LCD_CLS();
    LCD_Print(36,2,"龙丘科技");
    LCD_Print(40,4,"开发板");
    LCD_P6x8Str(19,7,"chiusir@163.com");
  #endif
  delayms(2000);   
  #ifdef USE_LCD
    LCD_CLS();      
    LCD_P6x8Str(4,0,"C0RA:");
    LCD_P6x8Str(4,1,"C0RD:");
    LCD_P6x8Str(4,2,"C0TA:0x0000888E");
    LCD_P6x8Str(4,3,"C0TD:");
    LCD_P6x8Str(4,4,"C4RA:");  
    LCD_P6x8Str(4,5,"C4RD:");
    LCD_P6x8Str(4,6,"C4TA:0x0000887E");  
    LCD_P6x8Str(4,7,"C4TD:");  
  #endif
  EnableInterrupts;
  for(;;) 
  { 
    #ifdef THIS_IS_SENDER 
      sprintf((char*)txbuff,"%03d%s",LedCnt,mydata);
      TXID=ConvertID2MSCAN_ID(CAN4_ID);          
      txrxerrflag=CAN0SendFrame(TXID, 0x00, strlen(txbuff), txbuff);
      if(txrxerrflag)
      {
        #ifdef USE_LCD
          LCD_P6x8Str(34,3,"FAILED!");
        #endif
        putstr("\nCAN0 TX DATA FAILED!");        
      }
      else
      {        
        #ifdef USE_LCD
          LCD_P6x8Str(34,3,txbuff);
        #endif
        printp("\nCAN0 TX DATA IS:%s",txbuff);    
      }
      delayms(300);   //修改延时以修改数据发送频率      
      txbuff[6]='4';
      TXID=ConvertID2MSCAN_ID(CAN0_ID);          
      txrxerrflag=CAN4SendFrame(TXID, 0x00, strlen(txbuff), txbuff);
      if(txrxerrflag)
      {
        #ifdef USE_LCD
          LCD_P6x8Str(34,7,"FAILED!");
        #endif
        putstr("\nCAN4 TX DATA FAILED!");        
      }
      else
      {        
        #ifdef USE_LCD
          LCD_P6x8Str(34,7,txbuff);
        #endif
        printp("\nCAN4 TX DATA IS:%s",txbuff); 
      }
      //txrxerrflag=CAN4SendFrame((0x887E4326), 0x00, strlen(txbuff), txbuff);            
      #ifdef USE_LED
        LedCnt=(LedCnt>0XFE?0:++LedCnt);
      #endif
    #else
      #ifdef USE_LED
        LedCnt=(LedCnt>0XFE?0:LedCnt);
      #endif
    #endif
    delayms(300);   //修改延时以修改数据发送频率
    #ifdef USE_LED  
      PORTB=~LedCnt;
    #endif
  } 
  /* please make sure that you never leave this function */
}
 
// ----------------------

⌨️ 快捷键说明

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