#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