📄 j1939_hal.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 + -