145 lines
6.0 KiB
C
145 lines
6.0 KiB
C
|
#ifndef __LIN_H__
|
|||
|
#define __LIN_H__
|
|||
|
#include "main.h"
|
|||
|
|
|||
|
/* 功能支持 */
|
|||
|
#define SLEEP_SUPPORT 1 /* Lin休眠时是否支持sleep 0-不支持 1-支持 */
|
|||
|
#define AUTOBAUD 0 /* 0-固定波特率 1-自适应波特率 */
|
|||
|
|
|||
|
/* 执行时间优化相关宏定义 */
|
|||
|
#define LIN_GPTIM2_ISR_MASK 6 /* 输入捕获通道1和2中断标志, 写1清0 CC1IF和CC2IF */
|
|||
|
#define LIN_GPTIM2_IER_MASK 2 /* 输入捕获通道1中断使能 */
|
|||
|
|
|||
|
#define LIN_UART_IRQ_PRI 1
|
|||
|
#define LIN_BSTIM_IRQ_PRI 2
|
|||
|
#define LIN_GPITM2_IRQ_PRI 2
|
|||
|
#define LIN_GPIO_IRQ_PRI 2
|
|||
|
|
|||
|
/* LIN 相关宏定义 */
|
|||
|
#define __SYSTEM_CLOCK (8000000)
|
|||
|
#define MAIN_CLOCK __SYSTEM_CLOCK /* 主频, 单位Hz */
|
|||
|
#define TIMER_1MS_LOAD (MAIN_CLOCK/1000) /* 定时器1ms, Load值 */
|
|||
|
#define TIMER_1US_LOAD (MAIN_CLOCK/1000000) /* 定时器1us, Load值 */
|
|||
|
#define TIME_BASE_PERIOD 500 /* 接收超时定时器, 单位us */
|
|||
|
#define TIMER_LOAD_VALUE TIMER_1US_LOAD * TIME_BASE_PERIOD
|
|||
|
#define LIN_IDLE_TIMEOUT 8000 /* TIME_BASE_PERIOD为单位,休眠周期,此时间段内无通信则进入sleep,有通信则重置超时 */
|
|||
|
|
|||
|
/* 输入捕获定时器的分频系数应保证定时器满值时,支持最小波特率2400的128位长度
|
|||
|
主频fMHz,分频系数为A,定时器满值为0x10000,最小波特率为2400
|
|||
|
A * 65536 / f >= 128/2400
|
|||
|
A >= 128 * f /(2400 * 65536)
|
|||
|
*/
|
|||
|
#if (MAIN_CLOCK == 16000000)
|
|||
|
#define MAIN_CLOCK_MHZ 16
|
|||
|
#define LIN_CAPTURE_TIMER_PSC 16
|
|||
|
#define LIN_MIN_BREAK_VALUE 650
|
|||
|
#elif (MAIN_CLOCK == 24000000)
|
|||
|
#define MAIN_CLOCK_MHZ 24
|
|||
|
#define LIN_CAPTURE_TIMER_PSC 24
|
|||
|
#define LIN_MIN_BREAK_VALUE 650
|
|||
|
#elif (MAIN_CLOCK == 32000000)
|
|||
|
#define MAIN_CLOCK_MHZ 32
|
|||
|
#define LIN_CAPTURE_TIMER_PSC 32
|
|||
|
#define LIN_MIN_BREAK_VALUE 650
|
|||
|
#else
|
|||
|
#define MAIN_CLOCK_MHZ 8
|
|||
|
#define LIN_CAPTURE_TIMER_PSC 8
|
|||
|
#define LIN_MIN_BREAK_VALUE 650
|
|||
|
#endif
|
|||
|
|
|||
|
/* 校验类型 */
|
|||
|
#define CHECKSUM_TYPE_STANDARD 0
|
|||
|
#define CHECKSUM_TYPE_ENHANCED 1
|
|||
|
#define CHECKSUM_TYPE CHECKSUM_TYPE_ENHANCED /* 0-标准型 1-增强型 */
|
|||
|
|
|||
|
typedef enum {
|
|||
|
LIN_CMD0 = 0x10,
|
|||
|
LIN_CMD1 = 0x20,
|
|||
|
LIN_CMD2 = 0x21,
|
|||
|
/* 此处增加自定义ID */
|
|||
|
}lin_cmd_t;
|
|||
|
|
|||
|
typedef enum {
|
|||
|
TRANSMIT, /* 主机发送 */
|
|||
|
RECEIVE /* 主机接收 */
|
|||
|
}lin_packet_type_t;
|
|||
|
|
|||
|
typedef struct {
|
|||
|
uint8_t cmd; /* 参考LIN_CMD0 */
|
|||
|
lin_packet_type_t type;/* 命令类型 */
|
|||
|
uint8_t length;
|
|||
|
uint8_t* data;
|
|||
|
uint8_t pid; /* 转换cmd为pid, 初始化时进行 */
|
|||
|
}lin_cmd_packet_t;
|
|||
|
|
|||
|
#define LIN_BREAK_BIT 13 /* 同步间隔, 13bit显性电平 */
|
|||
|
#define LIN_BREAK_BYTE 0x00
|
|||
|
#define LIN_SYN_BYTE 0x55
|
|||
|
|
|||
|
/* lin波特率和字节间间隔 */
|
|||
|
#define LIN_BAUDRATE 19200 /* 波特率, 上限20K */
|
|||
|
#define LIN_RECV_BYTE_TIME_SPACE 12 /* 接收字节间间隔, 最大支持255bit */
|
|||
|
|
|||
|
#define LIN_SYN_BYTE_TIME_SPACE 50 /* 收到间隔段之后 */
|
|||
|
#define LIN_BIT_TIMER_LOAD (MAIN_CLOCK / LIN_BAUDRATE) /* 比特定时器Load值, TIME时钟源24MHz */
|
|||
|
#define RESPONSE_SPACE (50 * LIN_BIT_TIMER_LOAD) /* 应答间隔, 5字节长度, 每字节10bit */
|
|||
|
|
|||
|
#define LIN_BREAK_DELIMITER_TIMES 2 /* (1<<2)间隔段和间隔符长度倍数关系,不足则判定为错误 */
|
|||
|
#define LIN_BREAK_BIT_TIMES 10 /* 间隔段和起始位长度倍数关系, 不足则判定为错误 */
|
|||
|
#define LIN_SYN_BIT_GAP_PERCENTAGE 19 >> 7 /* (x/100 = y >> 7, x为期望的差距, y为计算出的值, 如x=15, 则y=19), 同步段各位与起始位差距, 超出则判定为错误 */
|
|||
|
|
|||
|
#define LIN_UART UART4
|
|||
|
#define LIN_UART_RX_GPIO GPIOB
|
|||
|
#define LIN_UART_RX_PIN FL_GPIO_PIN_2
|
|||
|
#define LIN_UART_TX_GPIO GPIOB
|
|||
|
#define LIN_UART_TX_PIN FL_GPIO_PIN_3
|
|||
|
#define LIN_UART_TX_PIN_IDX 3
|
|||
|
#define LIN_UART_TX_PIN_FCR_MASK 0xC0 /* (3 << (LIN_UART_TX_PIN_IDX << 1)) 便于优化执行时间 */
|
|||
|
#define LIN_UART_TX_PIN_FCR_OUTPUT 0x40 /* (0 << (LIN_UART_TX_PIN_IDX << 1)) */
|
|||
|
#define LIN_UART_TX_PIN_FCR_DIGIT 0x80 /* (2 << (LIN_UART_TX_PIN_IDX << 1)) */
|
|||
|
#define LIN_UART_RX_PIN_IDX 2
|
|||
|
#define LIN_UART_RX_PIN_FCR_MASK 0x30 /* (3 << (LIN_UART_RX_PIN_IDX << 1)) */
|
|||
|
#define LIN_UART_RX_PIN_FCR_INPUT 0x00 /* (0 << (LIN_UART_RX_PIN_IDX << 1)) */
|
|||
|
#define LIN_UART_RX_PIN_FCR_DIGIT 0x20 /* (2 << (LIN_UART_RX_PIN_IDX << 1)) */
|
|||
|
#define LIN_RX_EXTI_LINE FL_GPIO_EXTI_LINE_4
|
|||
|
#define LIN_RX_EXTI_LINE_PIN FL_GPIO_EXTI_LINE_4_PB2
|
|||
|
#define LIN_RX_EXTI_LINE_INDEX 4
|
|||
|
#define LIN_RX_EXTI_EDS_INDEX 8 //24 -> 8 ?
|
|||
|
#define LIN_UART_IRQHandler UART4_IRQHandler
|
|||
|
#define LIN_UART_IRQType UART4_IRQn
|
|||
|
|
|||
|
/*********FM33LG0X8A 80PIN**********/
|
|||
|
//#define LIN_SLP_GPIO GPIOE
|
|||
|
//#define LIN_SLP_PIN FL_GPIO_PIN_6
|
|||
|
|
|||
|
/*********FM33LG0X5A 48PIN**********/
|
|||
|
#define LIN_SLP_GPIO GPIOB
|
|||
|
#define LIN_SLP_PIN FL_GPIO_PIN_6
|
|||
|
#define LIN_SLP_ENABLE() FL_GPIO_ResetOutputPin(LIN_SLP_GPIO, LIN_SLP_PIN)
|
|||
|
#define LIN_SLP_DISABLE() FL_GPIO_SetOutputPin(LIN_SLP_GPIO, LIN_SLP_PIN)
|
|||
|
|
|||
|
/* 用户处理 */
|
|||
|
#define LIN_CMD0_LENGTH 8
|
|||
|
#define LIN_CMD1_LENGTH 8
|
|||
|
#define LIN_CMD2_LENGTH 8
|
|||
|
|
|||
|
extern uint8_t LIN_CMD0_Data[8];
|
|||
|
extern uint8_t LIN_CMD1_Data[8];
|
|||
|
extern uint8_t LIN_CMD2_Data[8];
|
|||
|
extern lin_cmd_packet_t scheduleTable[];
|
|||
|
#define TABLE_SIZE (sizeof(scheduleTable)/sizeof(lin_cmd_packet_t))
|
|||
|
|
|||
|
void lin_init(void);
|
|||
|
|
|||
|
#if (SLEEP_SUPPORT == 1)
|
|||
|
void lin_sleep_init(void);
|
|||
|
|
|||
|
void lin_awake_init(void);
|
|||
|
|
|||
|
uint8_t lin_is_sleep(void);
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif
|