2025-02-19 16:33:45 +08:00

184 lines
8.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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.
*/
#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 (32000000)
#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,
LIN_CMD3 = 0x30,
LIN_CMD4 = 0x31,
/* 此处增加自定义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 2
#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
void GetMasterData(uint8_t *buf);
void SetSlaveData(uint8_t *buf);
#endif