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

📄 main.c

📁 freescale的mc9s12dj64的测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#define SET_K1LOGIC(l)  {PORTE_BIT6 = l&0x01;}  // PE6配置KBUS1的逻辑
// K1功能选择(指K1~K16)(0=KBUS; 1=CAN1L; 2=SWCAN; 3=CLOSE)
#define SET_K1CFG(c)    {PORTB_BIT7 = c&0x01; PORTE_BIT7 = (c>>1)&0x01;}    // PB7,PE7配置K1的功能

/*******************************************************************************
*	MSCAN12操作
*/
#define EXTENDED_FRAME_ID   0x7FF   //11bit
/*******************************************************************************
* FUCNAME   :   CAN1_Open
* DESC      :   CAN1 打开, OBD6和OBD14接通CAN1H/L
* INPUT     :   void
* RETURN    :   void
*******************************************************************************/
void CAN1_Open(void)	{
    PTT_PTT7=0;     // close CAN3 (SIGCAN)
    MODRR = 0x01;   // CAN->PM2,PM3
    PTT_PTT2 = 0;   // (PT2=0) >> PhotoMOS ON : CAN1H->OBD6;
    SET_K1CFG(1);   // K1~16功能设置为CAN1L
    SET_K1PORT(9);  // Select K1 Port 9 OBD14
}

/*******************************************************************************
* FUCNAME   :   CAN2_Open
* DESC      :   CAN2 打开, OBD3和OBD11接通CAN2H/L
* INPUT     :   void
* RETURN    :   void
*******************************************************************************/
void CAN2_Open()	{
    PTT_PTT7=0;     // close CAN3 (SIGCAN)
    MODRR = 0x02;   // CAN->PM4,PM5
    PTT_PTT1 = 0;	// 
    PTT_PTT3 = 0;   // (PT1=0;PT3=0) >> PhotoMOS ON : CAN2H->OBD3; CAN2L->OBD11
}

/*******************************************************************************
* FUCNAME   :   CAN3_Open
* DESC      :   CAN3 打开, 单线CAN
* INPUT     :   void
* RETURN    :   void
*******************************************************************************/
void CAN3_Open() {
    PTT_PTT7=1;     // open CAN3 (SIGCAN)
    MODRR = 0x03;   // CAN->PJ6,PJ7  
    SET_K1CFG(2);   // K1~16功能设置为SIGCAN
    //SET_K1PORT(7);  // Select K1 Port 
}

/*******************************************************************************
* FUCNAME   :   CAN_Close
* DESC      :   CAN 关闭所有, 切断所有CAN端口
* INPUT     :   void
* RETURN    :   void
*******************************************************************************/
void CAN_Close() {
    PTT_PTT2 = 1;   // (PT2=1) >> PhotoMOS OFF : CAN1H->OBD6;
    PTT_PTT1 = 1;    
    PTT_PTT3 = 1;   // (PT1=1;PT3=1) >> PhotoMOS OFF : CAN2H->OBD3; CAN2L->OBD11
    PTT_PTT7 = 0;   // close CAN3 (SIGCAN)
    SET_K1CFG(3);   // K1~16功能设置为NC
    SET_K1PORT(3);  // Select K1 Port 3 OBD7
}

/*******************************************************************************
* FUCNAME   :   Can_FormatId
* DESC      :   CAN ID 格式化为CAN0TXIDR0~3所定义的格式,支持标准ID和扩展ID
* INPUT     :   msg,	4字节ID
* RETURN    :   格式化后的4字节ID,可以直接写入ID寄存器.
*******************************************************************************/
dword Can_FormatId(dword msg)
{
    dword ID;
    //
	if (msg <= EXTENDED_FRAME_ID)  	// Is it the standard frame?
  	  	ID = msg << 21;				//st_frame
  	else
      	ID = ((msg << 1) & 0x0007FFFF) | ((msg << 3) & 0xFFE00000) | 0x00080000;//ex_frame
    return ID;
}

//CAN波特率
int CanBaudList[33]= {
0x0014, 0x001c, 0x031c, 0x311c, \
0x8023, 0x80d8, 0x81fa, 0x83fa  \
};
int CurCanBaud=0x001c;  // 500K/CIA
/*******************************************************************************
* FUCNAME   :   CAN_Init
* DESC      :   CAN控制器初始化
* INPUT     :   baud,	波特率
* RETURN    :   void
*******************************************************************************/
void CAN_Init(int baud) 
{
	int	i;
    
	//SCI1CR2 &= ~(SCI1CR2_RIE_MASK | SCI1CR2_RE_MASK);
	
    SCI0_Puts("\n CAN TEST");
    
//    CAN2_Open();
    
	//init CAN
	SCI0_Puts("\n CAN0 Initialization");
	CAN0CTL1_CANE =1;           // MSCAN ENABLE
	CAN0CTL0_INITRQ =1;         // MSCAN 软复位开始
	while(!CAN0CTL1_INITAK);    // 等待INITAK=1	    
	                                     
 	CAN0CTL1_CLKSRC = 0;        // Select the clock source from crystal:8mhz
	*(word *)&CAN0BTR0 = baud;// 波特率 1M: CIA=0x0014 ; !CIA=0x8023
	printf(" Baud = %04x", baud);
	
	CAN0CTL1_LISTEN=0;          // 非侦听
	
	CAN0IDAC_IDAM=0;			// 验收过滤器工作方式:2个32位过滤器 // wmj
	*(dword *)&CAN0IDAR0 = 0x01f000000;	// 验收寄存器
	*(dword *)&CAN0IDMR0 = 0x0f0ffffff;	// 验收屏蔽寄存器, 
	
    SCI0_Puts("\n Start device");	
	CAN0CTL0_INITRQ = 0;		// MSCAN 软复位结束
	while(CAN0CTL1_INITAK);		// 等待INITAK=0
	while(!CAN0CTL0_SYNCH);     // Wait for synchronization
	CAN0RFLG |= 0xFE;			// 清零CAN0RFLG的bit7~bit1
	CAN0RIER = 0x00;            // disable all CAN interrupts
	//INT_HIGHT(0xB2);			// CAN0接收中断置优先级最高
	Delay_1ms(1);
}

/*******************************************************************************
* FUCNAME   :   CAN_Send
* DESC      :   CAN发送一帧数据
* INPUT     :   id,	发送ID
				p,	发送数据
* RETURN    :   void
*******************************************************************************/
void CAN_Send(word id, byte *p) {
	int i;
	
    // 发送
    SCI0_Puts("\n Send data...");
    printf(" id = %04x", id);	
	while(!(CAN0TFLG & 1));     // Is the transmit buffer empty? 1=empty!
  	CAN0TBSEL = CAN0TFLG;		// CAN0发送缓冲区选择
 	*(dword *)&CAN0TXIDR0=Can_FormatId(id);	// 发送ID
  	for (i=0;i<8;i++)
   	{
   		*((byte *)&CAN0TXDSR0 + i) = *(p+i);
   	}
   	CAN0TXIDR1_IDE = 0;         // Standard Frame;
   	CAN0TXIDR3_RTR = 0;         // 0, 数据帧; 1, 远程帧;
   	CAN0TXIDR1_SRR = 0;         // 此位只在扩展帧时需要设置
  	
	//
   	CAN0TXDLR = 0x08;			// 数据长度寄存器 max frame lenth            
  	CAN0TXTBPR = 0;             // Set the priority (high)
   	CAN0TFLG = CAN0TBSEL;		// 清除TXEn标志, Start transmission  
   	SCI0_Puts("\n Send end...");

   	Delay_1ms(1);

}

/*******************************************************************************
*	CAN控制器软复位
*/
void CAN_Rst(void)
{
    CAN0CTL0_INITRQ = 1;                 // Disable device
    while(!CAN0CTL1_INITAK);             // Wait for device initialization acknowledge
    CAN0CTL0_INITRQ = 0;                 // Start device
    while(CAN0CTL1_INITAK);              // Wait for device initialization acknowledge
//  	while(!CAN0CTL0_SYNCH);         	// Wait for synchronization
  	CAN0RFLG |= 0xFE;               	// Reset error flags
//  	CAN0RIER = 0xFF;                // Enable interrupts
//  	CAN0RIER = 0x3D;                	// Enable interrupts
  	CAN0RIER = 0x29;                	// Enable interrupts
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 37 void CANerr_ISR(void)	//需要完善 2006-10-5 10:21
{
  	if((CAN0RFLG &0x28)==0x28){
  		CAN0TARQ=0;
  		CAN_Rst();
  	}
   	CAN0RFLG |= 0xFE;              // Reset error flags
}

byte CanRxBuf[16];

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 38 void CANrx_ISR(void)
{
	dword	Back_ID,Frame_len, *pt;
  	byte	i,temp;

	Back_ID = *(dword *)&CAN0RXIDR0;
  	if (CAN0RXIDR1_IDE){              		// extended frame
  		if(0x00!=CAN0RXIDR3_RTR){CAN0RFLG_RXF = 1;return;}	//no Is frame "data frame"
  	}
  	else {									// standard frame
  		if(0x00!=CAN0RXIDR1_SRR){CAN0RFLG_RXF = 1;return;}	//no Is frame "data frame"
  	}
		
		Frame_len=CAN0RXDLR;
		i=0;
		CanRxBuf[i++]=CAN0RXDSR0;
		CanRxBuf[i++]=CAN0RXDSR1;
		CanRxBuf[i++]=CAN0RXDSR2;
		CanRxBuf[i++]=CAN0RXDSR3;
		CanRxBuf[i++]=CAN0RXDSR4;
		CanRxBuf[i++]=CAN0RXDSR5;
		CanRxBuf[i++]=CAN0RXDSR6;
		CanRxBuf[i++]=CAN0RXDSR7;
  		CAN0RFLG_RXF = 1;               // Reset the reception complete flag
  		
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 39 void CANtx_ISR(void)
{
//   	CAN0TIER =0;
}

/*******************************************************************************
*	测试main
*/
void main(void) {
    int i;
    word val;
    char key;
    byte *m, vol;
    
    long long t;
    
    
    int v1=0, v2=0, c1=0, p=0, l=0, b=0, j1, k1, m1;
    
    
    i=sizeof(t);
    
	DisableInterrupts;
	
	PORT_Init();
    PLL_Init();
    RTI_Init();
    TimeInit();
    PWM_Init(0);
    
	for(i=0;i<3;i++) {
            PORTAB=0x0000;        
            DELAY_1MS(200);  
            PORTAB=0xffff;
            DELAY_1MS(200);   
	}
	
    SCI0_Init();
    
    
    m = (byte *)malloc(10);
    printf("\n %04x", m);
    for(i=0;i<10;i++) {
        *m++=(byte)i;
    }
    free(m);
    printf("\n %04x", m);
    
    
    printf("\n printf 0x%08x", (dword)0xf0f0f0f0);
    
CL:             
    SCI0_Puts("\n******************************");
    SCI0_Puts("\n9S12TEST @ AUTOSCAN");
    SCI0_Puts("\n******************************");
    SCI0_Puts("\nTEST list:");
    SCI0_Puts("\n [1]:K1 Voltage;");
	SCI0_Puts("\n [2]:K2 Voltage;");
	SCI0_Puts("\n [3]:K1 Port;");
	SCI0_Puts("\n [4]:K1 Config;");
	SCI0_Puts("\n [l]:K1 Logic;");
	SCI0_Puts("\n [s]:KBUS Send;");
	SCI0_Puts("\n [5]:CAN Baudrate;");
	SCI0_Puts("\n [a]:CAN1 Open;");
	SCI0_Puts("\n [b]:CAN2 Open;");
	SCI0_Puts("\n [c]:CAN Send;");
	SCI0_Puts("\n [d]:CAN Reset;"); 
    SCI0_Puts("\n [e]:ECLK_PWM Start;");
    SCI0_Puts("\n [f]:ECLK_PWM Stop;");
    SCI0_Puts("\n [g]:CAN All Close;");
    SCI0_Puts("\n [p]:J1850 PWM Test;");
    SCI0_Puts("\n [j]:PWM Open/Close;"); 
    SCI0_Puts("\n [v]:J1850 VPW Test;");
    SCI0_Puts("\n [k]:VPW Open/Close;");
    SCI0_Puts("\n [x]:X931X Test;");
    while(1) {
        key = SCI0_Getc();
        
		switch(key)
		{
    		
		 	case '1':
		        if(v1>3) {
		            v1 = 0;
		        }
		        if(v1==0) {
		            SCI0_Puts("\nVDDK1 = NO PUP");
		        } else if(v1==1) {
		            SCI0_Puts("\nVDDK1 = 5V");
		        } else if(v1==2) { 
		            SCI0_Puts("\nVDDK1 = 12V");
		        } else if(v1==3) { 
		            SCI0_Puts("\nVDDK1 = NO PUP");
		        } 
		        SET_VDDK1(v1);
    		    v1++;
		        break;
		    case '2': 
		        if(v2>3) {
		            v2 = 0;
		        }
		        if(v2==0) {
		            SCI0_Puts("\nVDDK2 = NO PUP");
		        } else if(v2==1) {
		            SCI0_Puts("\nVDDK2 = 5V");
		        } else if(v2==2) { 
		            SCI0_Puts("\nVDDK2 = 12V");
		        } else if(v2==3) { 
		            SCI0_Puts("\nVDDK2 = NO PUP");
		        } 
		        SET_VDDK2(v2); 
		        v2++;
		        break;
		    case '3':
		        if(p>15) {
		            p=0;
		        }
		        printf("\nK1PORT = %02x", p);
		        SET_K1PORT(p);  
		        p++;
		        break;
		    case '4':
		        if(c1>3) {
		            c1 = 0;
		        }
		        if(c1==0) {
		            SCI0_Puts("\n K1_CFG = K1_EN");
		        } else if(c1==1) {
		            SCI0_Puts("\n K1_CFG = CAN1L_EN");
		        } else if(c1==2) { 
		            SCI0_Puts("\n K1_CFG = SWCAN_EN");
		        } else if(c1==3) { 
		            SCI0_Puts("\n K1_CFG = N.C.");
		        } 
		        SET_K1CFG(c1);
    		    c1++;
		        break;
		    case 'l':
    		    if(l&0x01) {
    		        SCI0_Puts("\nK1 Logic +");

    		    }
    		    else {
    		        SCI0_Puts("\nK1 Logic -");
    		    }    
		        SET_K1LOGIC(l); 
		        l++;
		        break;
    		case 's': 
    			SCI0_Puts("\nKBUS SEND");
    			SCI1_Init();
    			for(i=0; i<8; i++) {
                	SCI1_Putc(sendbytebuf[i]);
                }
    			break;
		    case '5':
		        if(b>8) {
		            b=0;
		        }
		        CurCanBaud=CanBaudList[b];
		        printf("\nCan baud = 0x%04x", CurCanBaud);
		        CAN_Init(CurCanBaud);
		        b++;
		        break;
    		case 'a':    		        
                SCI0_Puts("\n CAN1 OPEN");
                CAN1_Open();
    		    break;
		    case 'b':   		        
                SCI0_Puts("\n CAN2 OPEN");
                CAN2_Open();
		        break;
		    case 'c':
		    	CAN_Init(CurCanBaud);
		        SCI0_Puts("\n CAN SEND");
		        CAN_Send(0x200, sendbytebuf);
		        break;
		    case 'd':
		        CAN_Rst();
		        break;
		    case 'g':
		        CAN_Close();
            	break;
    		case 'e': 
    			SCI0_Puts("\n PWM ECLK START!");
    			PWM3_153K(155,(155-1)/2);       // 155 = 153.6k 
    			break;
		    case 'f':
		        SCI0_Puts("\n PWM ECLK STOP!");
    			PWM3_153K(0,0);       // stop
    			break;
		    case 'p':
		        J1850_PwmTest();
		        break;
		    case 'v':
		        J1850_VpwTest();
		        break;
		    case 'j':
		        if(j1&0x01) { 
    		        SCI0_Puts("\n PWM Open");
		            PWM_OPEN();

    		    }
    		    else {
    		        SCI0_Puts("\n PWM Close");
    		        PWM_CLOSE();
    		    }    
		        j1++;
		        break;
		    case 'k':
		        if(k1&0x01) { 
    		        SCI0_Puts("\n VPW Open");
		            VPW_OPEN();

    		    }
    		    else {
    		        SCI0_Puts("\n VPW Close");
    		        VPW_CLOSE();
    		    }    
		        k1++;
		        break;
		    case 'm':
		        if(m1&0x01) { 
    		        SCI0_Puts("\n PWM TX = 1");
		            PTP_PTP0 = 1;

    		    }
    		    else {
    		        SCI0_Puts("\n PWM TX = 0");
		            PTP_PTP0 = 0;
    		    }    
		        m1++;
		        break;
    		case 'x': 
    			SCI0_Puts("\n X931X Test");
    			while(1) {
        			SCI0_Puts("\n[0]:set; [u]:up; [d]:down; [s]:store; [esc]:exit");
        			key = SCI0_Getc();
        			if(key==0x1b)
        			    break;
        			switch(key)
            		{
                		case '0':
                		    X931X_Set(99);
                		    break;
            		    case 'u':
            		        X931X_Up();
            		        break;
            		    case 'd':
            		        X931X_Down();
            		        break;
            		    case 's':
            		        X931X_Store();
            		        break;
            		    case 'r':
            		        val = ATD_Read(6);
            		        SCI0_Puts("\nREF_K A/D read:");
            		        printf("\n %04x", val);
            		        break;
                		default:
                		    break;
            		}
    			}
    			break;
    		case 'h': 
    			goto CL;
    			break;
    		default:
    		    SCI0_Puts("\n Error command! Press [h] for help");
    		    break;
		}
    }
	
  	/* put your own code here */
  	EnableInterrupts;

  	for(;;) {} /* wait forever */
  	/* please make sure that you never leave this function */
}

⌨️ 快捷键说明

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