184 lines
8.3 KiB
C
Raw Normal View History

2025-02-19 13:21:11 +08:00
/*
* Copyright (c) 2022, SHANGHAI FUDAN MICROELECTRONICS GROUP CO., LTD.(FUDAN MICROELECTRONICS./ FUDAN MICRO.)
* All rights reserved.
*
* Processor: FM33LG0xxA
* http: http://www.fmdevelopers.com.cn/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* 4. To provide the most up-to-date information, the revision of our documents
* on the World Wide Web will be the most Current. Your printed copy may be
* an earlier revision. To verify you have the latest information avaliable,
* refer to: http://www.fmdevelopers.com.cn/.
*
* THIS SOFTWARE IS PROVIDED BY FUDAN MICRO "AS IS" AND ANY EXPRESSED
* ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.IN NO EVENT SHALL FUDAN MICRO OR ITS CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISINGIN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OFTHE POSSIBILITY OF SUCH DAMAGE.
*/
2025-02-18 10:13:34 +08:00
#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 相关宏定义 */
2025-02-19 13:21:11 +08:00
#define __SYSTEM_CLOCK (32000000)
2025-02-18 10:13:34 +08:00
#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位长度
fMHzA0x100002400
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,
2025-02-19 13:21:11 +08:00
LIN_CMD2 = 0x21,
LIN_CMD3 = 0x30,
LIN_CMD4 = 0x31,
2025-02-18 10:13:34 +08:00
/* 此处增加自定义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
2025-02-19 13:21:11 +08:00
void GetMasterData(uint8_t *buf);
void SetSlaveData(uint8_t *buf);
2025-02-18 10:13:34 +08:00
#endif