MSCAN0_J1939.h 6.36 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
/******************************************************************************
文 件 名:MSCAN0.h
功能描述:MSCAN0总线收发控制函数库头文件
作    者:张暄
版    本:V1.0
日    期:2016.11.5
******************************************************************************/

#ifndef _MSCAN0_J1939_H_
#define _MSCAN0_J1939_H_

#include "GPIO.h"
#include "CRG.h"

extern uint8_t NM_RECEIVE;
extern INT8U BUS_OFF_FLAG; 

/* 网络管理相关头文件 */
//#include "Std_Types.h"            //----hyq--20180728
//#include "ComStack_Types.h"
//#include "Nm_Cbk.h"

//extern uint8_t NM_RECEIVE;
/******************************************************************************

                                波特率设置

===============================================================================
- MSCAN通过其预分频器生成时间量子Tq作为采样CAN信号的时基

- 依据 Bosch CAN 2.0A/B 标准, MSCAN接收/发送每一位的时间被分为如下三段:

  ----------------------------------------------------------------------------
  | Sync_Seg |            Time Segment 1            |     Time Segment 2     |
  ----------------------------------------------------------------------------
  |<- 1 Tq ->|<------------  4 ~ 16 Tq  ----------->|<-----  2 ~ 8 Tq  ----->|
  |                                                                          |
  |<---------------------------  Total 8 ~ 25 Tq  -------------------------->|
  
  Sync_Seg:本段有固定的1Tq时长,CAN总线上信号的上升或下降沿在本段产生(发送时)或
            触发本段(接收时),标志CAN总线一个数据位收发的开始,用于同步收发
  时段 1  :本段包括CAN标准的PROP_SEG段和PHASE_SEG1段,接收时,数据的采样发生于本
            段的后段靠近下一段处,本段的时长可以设置为 4 ~ 16 Tq
  时段 2  :本段包括CAN标准的PHASE_SEG2段,本段的时长可以设置为 2 ~ 8 Tq

- 同步跳转宽度SJW:在重同步期间,采样点的位置被移动整数个Tq,该时间份额被允许的最
                   大值称为同步跳转宽度,它可被设置为 1 ~ 4 Tq
                   
- 用户有责任确保位时间设置遵从CAN标准
  --------------------------------------------------
       时段 1     |     时段 2     |  同步跳转宽度
  --------------------------------------------------
       5 ~ 10     |       2        |     1 ~ 2
       4 ~ 11     |       3        |     1 ~ 3
       5 ~ 12     |       4        |     1 ~ 4
       6 ~ 13     |       5        |     1 ~ 4
       7 ~ 14     |       6        |     1 ~ 4
       8 ~ 15     |       7        |     1 ~ 4
       9 ~ 16     |       8        |     1 ~ 4
  --------------------------------------------------
******************************************************************************/
#define   MSCAN0_BAUD_RATE                  500             //波特率,单位kbps(假象,不起作用, MSCAN0_Init函数直接设置寄存器)

#define   MSCAN0_T_SEG1                     11              //时间段1的Tq数
#define   MSCAN0_T_SEG2                     4               //时间段2的Tq数

#define   MSCAN0_SAMPLE_POINT               MSCAN0_SAMPLE_1POINT
#define   MSCAN0_SJW                        3               //同步跳转宽度

/******************************************************************************
采样点数选择                                                                                                                                    
******************************************************************************/
#define   MSCAN0_SAMPLE_1POINT              0x00            //每位采样1个样本(高速CAN推荐)
#define   MSCAN0_SAMPLE_3POINT              0x80            //每位采样3个样本

/******************************************************************************
Bus-off设置
******************************************************************************/
#define   MSCAN0_BUS_OFF_AUTO_RECOVERY      0               //Bus-off自动恢复使能

#define   MSCAN0_BUS_OFF_LV1_RECOVERY_TIME  100             //Bus-off恢复时间,单位ms
#define   MSCAN0_BUS_OFF_LV2_RECOVERY_TIME  1000            //Bus-off恢复时间,单位ms

#define   MSCAN0_BUS_LIMP_MODE_ENABLE       0               //跛行模式使能
#define   MSCAN0_BUS_LIMP_MODE_THRESHOLD    11              //进入跛行模式门限

/******************************************************************************
波特率预处理
******************************************************************************/
#define   MSCAN0_PRESCALER    (OSCCLK / (1 + MSCAN0_T_SEG1 + MSCAN0_T_SEG2) / MSCAN0_BAUD_RATE / 1000)

#define   MSCAN0_BTR0_VALUE   ((uint8_t)((MSCAN0_SJW - 1) << 6) | (uint8_t)(MSCAN0_PRESCALER - 1))
#define   MSCAN0_BTR1_VALUE   (MSCAN0_SAMPLE_POINT | (uint8_t)((MSCAN0_T_SEG2 - 1) << 4) | (uint8_t)(MSCAN0_T_SEG1 - 1))

/******************************************************************************
Bus-off状态
******************************************************************************/
#define   MSCAN0_BUS_STABLE                 0x00
#define   MSCAN0_BUS_OFF_LV1                0x01
#define   MSCAN0_BUS_OFF_LV2                0x02
#define   MSCAN0_BUS_LIMP                   0x03

/******************************************************************************
报文发送状态
******************************************************************************/
#define   COMPLETE                          0x00
#define   NOT_COMPLETE                      (!COMPLETE)

/******************************************************************************
Bus-off监控结构
******************************************************************************/
typedef struct
{
  uint8_t  Status;
  uint8_t  Timer;
  uint8_t  Cnt;
}MSCAN0BusoffMonitorStruct;

//J1939 ID解析
typedef struct{
  uint8_t     :3;
  uint8_t PRIO:3;
  uint8_t R   :1;
  uint8_t DP  :1;
  uint8_t PF2 :6;
  uint8_t PF1 :2;
  uint8_t PS  :8;
  uint8_t SA  :8;
}MSCANIDStruct;
#define GetMSCANID_PF(mscanID)   ( ((uint8_t)(mscanID.PF2))<<2 | (mscanID.PF1) )

/******************************************************************************
函数声明
******************************************************************************/
void MSCAN0_L_Data_Request(uint32_t Identifier, uint8_t DLC, uint8_t *Data, uint8_t Priority);
void MSCAN0_L_Data_Indication(uint32_t Identifier, uint8_t DLC, uint8_t *Data);
void MSCAN0_L_Data_Confirm(uint32_t Identifier, uint8_t TransferStatus);

//Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId, PduInfoType* PduInfoPtr);//网络管理发送调用接口

void MSCAN0_Bus_Off_Monitoring_Service(void);
uint8_t MSCAN0_Get_Bus_Status(void);

void MSCAN0_Init(void);
void MSCAN0_Enter_Low_Power_Mode(void);
void MSCAN0_Exit_Low_Power_Mode(void);
uint8_t MSCAN0_Get_Wake_Up_Flag(void);

#endif