/******************************************************************************
�� �� ����MSCAN0.h
����������MSCAN0�����շ����ƺ�����ͷ�ļ�
��    �ߣ�����
��    ����V1.0
��    �ڣ�2016.11.5
******************************************************************************/

#ifndef _MSCAN0_H_
#define _MSCAN0_H_

#include "stdint.h"
#include "CRG.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

#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;

/******************************************************************************
��������
******************************************************************************/
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);

void bsp_CAN_SleepRelease ( void );
void bsp_tx_msgbuf_abort ( void );
void bsp_CAN_Sleep ( void );

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 );
void MSCAN0_L_Data_Service(void);
#endif