/******************************************************************************
�� �� ����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��,����ʱ,���ݵIJ��������ڱ�
            �εĺ�ο�����һ�δ�,���ε�ʱ����������Ϊ 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