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

📄 j1939_hal.c

📁 基于ucosSAEj1939的汽车组合仪表,硬件是MC9S12H128
💻 C
字号:

/**************************************************************************************
*                                                                                       
*                      北京航空航大学 706教研室                         
*                   All rights reserved.       2005                                                 
*                                                                                       
*======================================================================================
*                                                                                       
*       文件名:         HAL.c                                                        
*       大纲:           J1939协议栈                  
*       文件标识:                                                                       
*       摘 要:                                                                                                                                                              
*                                                                                      
*======================================================================================
*                                                                                      
*       描述:           硬件抽象层文档                                                                                      
*                                                                                      
*       控制器:         Freescale MC9s12H256                                         
*                                                                                      
*       编译器:         Metrowerks CodeWarrior IDE v5.2.1149                            
*                                                                                      
*======================================================================================
*                                                                                      
*       当前版本:   1.0.0                                                                   
*       编程人员:   孙进                                                                 
*       完成日期:   2006年2月                                                                                                                                                                                                   
*                                                                                       
*======================================================================================                                                                          
*
*       更新历史记录:                                                                   
*                                                                                      
***************************************************************************************/

#include <hidef.h>      /* common defines and macros */
#include <MC9S12H256.h>     /* derivative information */
#include "J1939_includes.h"
#include "\Ucos\includes.h"
#include "\driver\printp.h"


CAN_PACKET_T rev_can_packet;

void MSCAN1Init(void) 
{
    CAN1CTL0 |= 0x01;			      //进入复位模式
    while((CAN1CTL1&0x01) != 0x01);
    //CAN1CTL1 = 0xE0;				  //使能MSCAN,选BusClock,LISTEN位要置0!
    CAN1CTL1_CANE = 1;
    CAN1CTL1_CLKSRC = 1;
    CAN1CTL1_LOOPB = 0;
    CAN1CTL1_LISTEN = 0;
    
    CAN1BTR0 = 0x01;
    CAN1BTR1 = 0x1c;			      //波特率 250kbps,busclock=16M
    
    CAN1IDAC = 0;                     //32位双滤波模式
    
    //CAN1CTL0_TIME = 1;
    
    CAN1IDAR0 = 0x00;                 //屏蔽码全FF
    CAN1IDAR1 = 0x00; 
    CAN1IDAR2 = 0x00;
    CAN1IDAR3 = 0x00; 
    CAN1IDMR0 = 0xFF; 
    CAN1IDMR1 = 0xFF;				  //屏蔽SRR和IDE
    CAN1IDMR2 = 0xFF;
    CAN1IDMR3 = 0xFF;			      //屏蔽RTR

    CAN1IDAR4 = 0x00;				  //注意:如果标准贞ID设为1000,则也可接收到,因为1000已超出11位,所以此时的ID也为0
    CAN1IDAR5 = 0x00;
    CAN1IDAR6 = 0x00;
    CAN1IDAR7 = 0x00;	
    CAN1IDMR4 = 0xFF;
    CAN1IDMR5 = 0xFF;
    CAN1IDMR6 = 0xFF;
    CAN1IDMR7 = 0xFF;    
      
    CAN1CTL0 &= 0xFE;
    
    while((CAN1CTL1&0x01) == 0x01);
    
    CAN1RIER_RXFIE = 1; /* enable receive buffer full interrupt*/
    CAN1RIER_OVRIE = 1;
    CAN1RIER_CSCIE = 1;
}

/*硬件抽象层初始化函数*/
void HAL_init(void)
{
	  MSCAN1Init();
}

/*CAN发送函数*/
void Trans_CANpkt(const CAN_PACKET_T *pkt_ptr) 
{
    char cansel;
 
    cansel = CAN1TFLG;  /*select one available transmit buffer*/
    CAN1TBSEL = cansel;
    cansel = CAN1TBSEL;
    
    /*Extended ID*/
    CAN1TXIDR0 = (pkt_ptr->identifier>>21) & 0xFF;      
    CAN1TXIDR1 = (pkt_ptr->identifier>>18) & 0x07; 
    CAN1TXIDR1 = CAN1TXIDR1 << 5;
    CAN1TXIDR1 = CAN1TXIDR1 | ((pkt_ptr->identifier>>15) & 0x07);
    CAN1TXIDR1_SRR = 1;
    CAN1TXIDR1_IDE = 1;                            //扩展帧			
    CAN1TXIDR2 = (pkt_ptr->identifier>>7) & 0xFF; 
    CAN1TXIDR3 = (pkt_ptr->identifier<<1) & 0xFF; 
    CAN1TXIDR3_RTR = 0;                            //数据帧   
    CAN1TXDSR0 = pkt_ptr->data[0];
    CAN1TXDSR1 = pkt_ptr->data[1];
    CAN1TXDSR2 = pkt_ptr->data[2];
    CAN1TXDSR3 = pkt_ptr->data[3];
    CAN1TXDSR4 = pkt_ptr->data[4];
    CAN1TXDSR5 = pkt_ptr->data[5];
    CAN1TXDSR6 = pkt_ptr->data[6];
    CAN1TXDSR7 = pkt_ptr->data[7];   
    CAN1TXDLR = pkt_ptr->byte_count;
         
    CAN1TXTBPR = 0;		                            //发送缓冲优先级
  
    CAN1TFLG = CAN1TBSEL;  /*clearing TxE to lauch transmission*/    
}

/*CAN接收中断服务程序*/
#pragma TRAP_PROC
void MSCAN1Rec(void)  
{   
    OSIntEnter();
    OS_SAVE_SP();
    
    CAN1RFLG_RXF = 1;           //清中断
    
    if(CAN1RXIDR1_IDE==1)   /* 扩展帧类型 */
    {
        if(CAN1RXIDR3_RTR == 0)					//数据帧
        {          
            OS_ENTER_CRITICAL();
            rev_can_packet.identifier = CAN1RXIDR0;
            rev_can_packet.identifier <<= 3;
            rev_can_packet.identifier |= (CAN1RXIDR1>>5);
            rev_can_packet.identifier <<= 3;
            rev_can_packet.identifier |= (CAN1RXIDR1&0X07);
            rev_can_packet.identifier <<= 8;
            rev_can_packet.identifier |= CAN1RXIDR2;
            rev_can_packet.identifier <<= 7;
            rev_can_packet.identifier |= (CAN1RXIDR3>>1);
            rev_can_packet.data[0] = CAN1RXDSR0;
            rev_can_packet.data[1] = CAN1RXDSR1;
            rev_can_packet.data[2] = CAN1RXDSR2;
            rev_can_packet.data[3] = CAN1RXDSR3;
            rev_can_packet.data[4] = CAN1RXDSR4;
            rev_can_packet.data[5] = CAN1RXDSR5;
            rev_can_packet.data[6] = CAN1RXDSR6;
            rev_can_packet.data[7] = CAN1RXDSR7;   
            rev_can_packet.byte_count = CAN1RXDLR & 0x0F;
            OS_EXIT_CRITICAL();
            Rev_CANpkt(&rev_can_packet); 
      }
      else //远程帧
      {
      }
            
   }
   else   /* 标准帧类型 */
   {

   }  
   
   OSIntExit();
}

#pragma TRAP_PROC
void MSCAN1Error(void)          //错误处理程序
{
    //DisableInterrupts;
    //OS_PUSH_PPAGE();
    OSIntEnter();
    OS_SAVE_SP();
  
  	if(CAN1RFLG_CSCIF!=0)
  	{
  	    CAN1RFLG_CSCIF = 1;    
		PTL = 0xFF;
		HAL_init();
  	    
  	} 
  	else if(CAN1RFLG_OVRIF!=0) 
  	{
  	    CAN1RFLG_OVRIF = 1;
		PTL = 0xFF;
		HAL_init();    
  	}
  	     	  	
    OSIntExit();
    //OS_POP_PPAGE();
}

⌨️ 快捷键说明

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