Files
vision-anti-pinch/include/zcan.h
T

444 lines
18 KiB
C

#pragma once
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
#define ZCAN_API
#define INVALID_HANDLE_VALUE ((HANDLE)(-1))
#define CMD_CAN_FILTER 0x14 // 滤波
#define CMD_CAN_TTX 0x16 // 定时发送
#define CMD_CAN_TTX_CTL 0x17 // 使能定时发送
#define CMD_CAN_TRES 0x18 // CAN终端电阻
#define ZCAN_CMD_SET_CHNL_RECV_MERGE 0x32 // 设置合并接收 0:不合并接收;1:合并接收
#define ZCAN_CMD_GET_CHNL_RECV_MERGE 0x33 // 获取是否开启合并接收 0:不合并接收;1:合并接收
#define CMD_SET_SN 0x42 // 获取SN号
#define CMD_GET_SN 0x43 // 设置SN号
#define CMD_CAN_TX_TIMEOUT 0x44 // 发送超时
#define ZCAN_CMD_GET_SEND_QUEUE_SIZE 0x100 // 获取队列大小,uint32_t
#define ZCAN_CMD_GET_SEND_QUEUE_SPACE 0x101 // 获取队列剩余空间, uint32_t
#define ZCAN_CMD_SET_SEND_QUEUE_CLR 0x102 // 清空发送队列,1:清空
#define ZCAN_CMD_SET_SEND_QUEUE_EN 0x103 // 开启发送队列,1:使能
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
typedef unsigned long long U64;
enum eZCANDataDEF
{
//数据类型
ZCAN_DT_ZCAN_CAN_DATA = 1, // CAN/CANFD数据
ZCAN_DT_ZCAN_CANFD_DATA = 2, // CAN/CANFD数据
ZCAN_DT_ZCAN_ERROR_DATA = 3, // CAN/CANFD错误数据
ZCAN_DT_ZCAN_LIN_DATA = 4, // LIN数据
ZCAN_DT_ZCAN_LIN_ERROR_DATA = 5, // LIN错误数据
};
#pragma pack(push, 1)
typedef enum {
ZCAN_TX_NORM = 0, /**< normal transmission */
ZCAN_TX_ONCE = 1, /**< single-shot transmission */
ZCAN_SR_NORM = 2, /**< self reception */
ZCAN_SR_ONCE = 3, /**< single-shot transmission & self reception */
} ZCAN_TX_MODE;
/** CAN filter configuration */
typedef struct {
U8 type; /**< 0-std_frame, 1-ext_frame */
U8 pad[3];
U32 sid; /**< start-id */
U32 eid; /**< end-id */
} ZCAN_FILTER;
typedef struct {
U32 size;
ZCAN_FILTER table[64];
} ZCAN_FILTER_TABLE;
/** controller initialization */
typedef struct {
U32 clk; // 时钟频率
U32 mode; /**< bit0-normal/listen_only, bit1-ISO/BOSCH */
struct {
U8 tseg1;
U8 tseg2;
U8 sjw;
U8 smp;
U16 brp;
} aset;
struct {
U8 tseg1;
U8 tseg2;
U8 sjw;
U8 smp;
U16 brp;
} dset;
} ZCAN_INIT;
/** CAN message info */
typedef struct {
U32 txm : 4; /**< TX-mode, @see ZCAN_TX_MODE */
U32 fmt : 4; /**< 0-CAN2.0, 1-CANFD */
U32 sdf : 1; /**< 0-data_frame, 1-remote_frame */
U32 sef : 1; /**< 0-std_frame, 1-ext_frame */
U32 err : 1; /**< error flag */
U32 brs : 1; /**< bit-rate switch */
U32 est : 1; /**< error state */
U32 tx : 1; /**< received valid, tx frame */
U32 echo : 1; /**< tx valid, echo frame */
U32 qsend_100us:1; /**< queue send delay unit, 1-100us, 0-ms */
U32 qsend:1; /**< send valid, queue send frame */
U32 pad : 15;
} ZCAN_MSG_INF;
/** CAN message header */
typedef struct {
U32 ts; /**< timestamp */
U32 id; /**< CAN-ID */
ZCAN_MSG_INF inf; /**< @see ZCAN_MSG_INF */
U16 pad; /**< send queue delay */
U8 chn; /**< channel */
U8 len; /**< data length */
} ZCAN_MSG_HDR;
/** CAN2.0-frame */
typedef struct {
ZCAN_MSG_HDR hdr;
U8 dat[8];
} ZCAN_20_MSG;
/** CANFD-frame */
typedef struct {
ZCAN_MSG_HDR hdr;
U8 dat[64];
} ZCAN_FD_MSG;
// 错误帧
typedef struct {
ZCAN_MSG_HDR hdr;
U8 dat[8];
} ZCAN_ERR_MSG;
// 定时发送结构体
typedef struct {
U32 interval; // 定时发送周期,单位 100us
U16 repeat; // 发送次数,0等于循环发
U8 index; // 定时发送列表的帧索引号,也就是第几条定时发送报文
U8 flags; // 0-此帧禁用定时发送,1-此帧使能定时发送
ZCAN_FD_MSG msg; // CANFD帧结构体
} ZCAN_TTX;
typedef struct {
U32 size; // 实际生效的数组的长度(用来控制实际生效多少条定时发送帧结构体)
ZCAN_TTX table[8]; // 最大设置8条
} ZCAN_TTX_CFG;
// 设备信息
typedef struct {
U16 hwv; /**< hardware version */
U16 fwv; /**< firmware version */
U16 drv; /**< driver version */
U16 api; /**< API version */
U16 irq; /**< IRQ */
U8 chn; /**< channels */
U8 sn[20]; /**< serial number */
U8 id[40]; /**< card id */
U16 pad[4];
} ZCAN_DEV_INF;
/** controller status */
typedef struct {
U8 IR; /**< not used(for backward compatibility) */
U8 MOD; /**< not used */
U8 SR; /**< not used */
U8 ALC; /**< not used */
U8 ECC; /**< not used */
U8 EWL; /**< not used */
U8 RXE; /**< RX errors */
U8 TXE; /**< TX errors */
U32 PAD;
} ZCAN_STAT;
//lin begin
typedef struct _VCI_LIN_INIT_CONFIG
{
U8 linMode; // 是否作为主机,0-从机,1-主机
U8 chkSumMode; // 校验方式,1-经典校验 2-增强校验 3-自动(对应eZLINChkSumMode的模式)
U16 reserved; // 保留
U32 linBaud; // 波特率,取值1000~20000
}ZCAN_LIN_INIT_CONFIG, *PZCAN_LIN_INIT_CONFIG;
typedef struct tagZCANLINData
{
union{
struct {
U8 ID : 6; // 帧ID
U8 Parity : 2; // 帧ID校验
}unionVal;
U8 rawVal; // 受保护的ID原始值
} PID; // 受保护的ID
struct
{
U64 timeStamp; // 时间戳,单位微秒(us)
U8 dataLen; // 数据长度
U8 dir; // 传输方向,0-接收 1-发送
U8 chkSum; // 数据校验, 部分设备不支持校验数据的获取
U8 reserved[13]; // 保留
U8 data[8]; // 数据
}RxData; // 仅接收数据时有效
U8 reserved[7]; // 保留
}ZCANLINData;
typedef struct tagZCANLINErrData
{
U64 timeStamp; // 时间戳, 单位微秒(us)
union {
struct {
U8 ID : 6; // 帧ID
U8 Parity : 2; // 帧ID校验
}unionVal;
U8 rawVal; // 受保护的ID原始值
} PID; // 受保护的ID
U8 dataLen;
U8 data[8];
union
{
struct
{
U16 errStage : 4; // 错误阶段
U16 errReason : 4; // 错误原因
U16 reserved : 8; // 保留
};
U16 unionErrData;
}errData;
U8 dir; // 传输方向
U8 chkSum; // 数据校验, 部分设备不支持校验数据的获取
U8 reserved[10]; // 保留
}ZCANLINErrData;
typedef struct _VCI_LIN_MSG{
U8 chnl; // 数据通道
U8 dataType; // 数据类型, 0-LIN数据 1-LIN错误数据
union
{
ZCANLINData zcanLINData; // LIN数据
ZCANLINErrData zcanLINErrData; // LIN错误数据
U8 raw[46]; // RAW数据
} data; // 实际数据, 联合体,有效成员根据 dataType 字段而定
}ZCAN_LIN_MSG, *PZCAN_LIN_MSG;
enum eZLINChkSumMode
{
DEFAULT = 0, // 默认,启动时配置
CLASSIC_CHKSUM, // 经典校验
ENHANCE_CHKSUM, // 增强校验
AUTOMATIC, // 自动,设备自动识别校验方式(仅ZCAN_SetLINSubscribe时有效)
};
enum
{
MAX_LIN_ID_COUNT = 63,
MIN_LIN_DLC = 1,
MAX_LIN_DLC = 8,
AUTO_LIN_DLC = 255,
};
typedef struct _VCI_LIN_PUBLISH_CFG
{
U8 ID; // 受保护的ID(ID取值范围为0-63)
U8 dataLen; // dataLen范围为1-8
U8 data[8];
U8 chkSumMode; // 校验方式,0-默认,启动时配置 1-经典校验 2-增强校验(对应eZLINChkSumMode的模式)
U8 reserved[5]; // 保留
}ZCAN_LIN_PUBLISH_CFG, *PZCAN_LIN_PUBLISH_CFG;
typedef struct _VCI_LIN_SUBSCIBE_CFG
{
U8 ID; // 受保护的ID(ID取值范围为0-63)
U8 dataLen; // dataLen范围为1-8 当为255(0xff)则表示设备自动识别报文长度
U8 chkSumMode; // 校验方式,0-默认,启动时配置 1-经典校验 2-增强校验 3-自动(对应eZLINChkSumMode的模式)
U8 reserved[5]; // 保留
}ZCAN_LIN_SUBSCIBE_CFG, *PZCAN_LIN_SUBSCIBE_CFG;
// 合并接收数据数据结构,支持CAN/CANFD/LIN/错误等不同类型数据
typedef struct tagZCANDataObj
{
U8 dataType; // 数据类型, 参考eZCANDataDEF中 数据类型 部分定义
U8 chnl; // 数据通道
union{
struct{
U16 reserved : 16; // 保留
}unionVal;
U16 rawVal;
}flag; // 标志信息, 暂未使用
U8 extraData[4]; // 额外数据, 暂未使用
union
{
ZCAN_20_MSG zcanCANData; // CAN数据
ZCAN_FD_MSG zcanCANFDData; // CANFD数据
ZCAN_ERR_MSG zcanErrData; // 错误数据
ZCANLINData zcanLINData; // LIN数据
ZCANLINErrData zcanLINErrData; // LIN错误数据
U8 raw[92]; // RAW数据
} data; // 实际数据, 联合体,有效成员根据 dataType 字段而定
}ZCANDataObj;
// UDS传输协议版本
typedef U8 ZCAN_UDS_TRANS_VER;
#define ZCAN_UDS_TRANS_VER_0 0 // ISO15765-2(2004版本)
#define ZCAN_UDS_TRANS_VER_1 1 // ISO15765-2(2016版本)
// 帧类型
typedef U8 ZCAN_UDS_FRAME_TYPE;
#define ZCAN_UDS_FRAME_CAN 0 // CAN帧
#define ZCAN_UDS_FRAME_CANFD 1 // CANFD帧
#define ZCAN_UDS_FRAME_CANFD_BRS 2 // CANFD加速帧
// UDS填充模式
#define FILL_MODE_SHORT 0 // 小于8字节填充至8字节,大于8字节时按DLC就近填充
#define FILL_MODE_NONE 1 // 不填充
#define FILL_MODE_MAX 2 // 填充至最大数据长度 (不建议)
// CAN UDS请求数据
typedef struct _ZCAN_UDS_REQUEST
{
U32 req_id; // 请求事务ID,范围0~65535,本次请求的唯一标识
U8 channel; // 设备通道索引 0~255
ZCAN_UDS_FRAME_TYPE frame_type; // 帧类型
U8 reserved0[2]; // 保留
U32 src_addr; // 请求地址
U32 dst_addr; // 响应地址
U8 suppress_response; // 1:抑制响应
U8 sid; // 请求服务id
U8 reserved1[6]; // 保留
struct {
U32 timeout; // 响应超时时间(ms)。因PC定时器误差,建议设置不小于200ms
U32 enhanced_timeout; // 收到消极响应错误码为0x78后的超时时间(ms)。因PC定时器误差,建议设置不小于200ms
U8 check_any_negative_response:1; // 接收到非本次请求服务的消极响应时是否需要判定为响应错误
U8 wait_if_suppress_response:1; // 抑制响应时是否需要等待消极响应,等待时长为响应超时时间
U8 flag:6; // 保留
U8 reserved0[7]; // 保留
} session_param; // 会话层参数
struct {
ZCAN_UDS_TRANS_VER version; // 传输协议版本, VERSION_0, VERSION_1
U8 max_data_len; // 单帧最大数据长度, can:8, canfd:64
U8 local_st_min; // 本程序发送流控时用,连续帧之间的最小间隔, 0x00-0x7F(0ms~127ms), 0xF1-0xF9(100us~900us)
U8 block_size; // 流控帧的块大小
U8 fill_byte; // 无效字节的填充数据
U8 ext_frame; // 0:标准帧 1:扩展帧
U8 is_modify_ecu_st_min; // 是否忽略ECU返回流控的STmin,强制使用本程序设置的 remote_st_min
U8 remote_st_min; // 发送多帧时用, is_ignore_ecu_st_min = 1 时有效, 0x00-0x7F(0ms~127ms), 0xF1-0xF9(100us~900us)
U32 fc_timeout; // 接收流控超时时间(ms), 如发送首帧后需要等待回应流控帧
U8 fill_mode; // 数据长度填充模式, FILL_MODE_SHORT, FILL_MODE_NONE, FILL_MODE_MAX
U8 reserved0[3]; // 保留
} trans_param; // 传输层参数
U8 *data; // 数据数组(不包含SID)
U32 data_len; // 数据数组的长度
U32 reserved2; // 保留
} ZCAN_UDS_REQUEST;
// UDS错误码
typedef U8 ZCAN_UDS_ERROR;
#define ZCAN_UDS_ERROR_OK 0 // 没错误
#define ZCAN_UDS_ERROR_TIMEOUT 1 // 响应超时
#define ZCAN_UDS_ERROR_TRANSPORT 2 // 发送数据失败
#define ZCAN_UDS_ERROR_CANCEL 3 // 取消请求
#define ZCAN_UDS_ERROR_SUPPRESS_RESPONSE 4 // 抑制响应
#define ZCAN_UDS_ERROR_BUSY 5 // 忙碌中
#define ZCAN_UDS_ERROR_REQ_PARAM 6 // 请求参数错误
#define ZCAN_UDS_ERROR_OTHTER 100
typedef U8 ZCAN_UDS_RESPONSE_TYPE;
#define ZCAN_UDS_RT_NEGATIVE 0 // 消极响应
#define ZCAN_UDS_RT_POSITIVE 1 // 积极响应
// UDS响应数据
typedef struct _ZCAN_UDS_RESPONSE
{
ZCAN_UDS_ERROR status; // 响应状态
U8 reserved[6]; // 保留
ZCAN_UDS_RESPONSE_TYPE type; // 响应类型
union {
struct {
U8 sid; // 响应服务id
U32 data_len; // 数据长度(不包含SID), 数据存放在接口传入的dataBuf中
} positive;
struct {
U8 neg_code; // 固定为0x7F
U8 sid; // 请求服务id
U8 error_code; // 错误码
} negative;
U8 raw[8];
};
} ZCAN_UDS_RESPONSE;
// UDS控制类型
typedef U32 ZCAN_UDS_CTRL_CODE;
#define ZCAN_UDS_CTRL_STOP_REQ 0 // 停止UDS请求
// UDS控制请求
typedef struct _ZCAN_UDS_CTRL_REQ
{
U32 reqID; // 请求事务ID,指明要操作哪一条请求
ZCAN_UDS_CTRL_CODE cmd; // 控制类型
U8 reserved[8]; // 保留
} ZCAN_UDS_CTRL_REQ;
// UDS控制结果
typedef U32 ZCAN_UDS_CTRL_RESULT;
#define ZCAN_UDS_CTRL_RESULT_OK 0 // 成功
#define ZCAN_UDS_CTRL_RESULT_ERR 1 // 失败
// UDS控制响应数据
typedef struct _ZCAN_UDS_CTRL_RESP
{
ZCAN_UDS_CTRL_RESULT result; // 操作结果
U8 reserved[8]; // 保留
} ZCAN_UDS_CTRL_RESP;
#pragma pack(pop)
//
EXTERN_C U32 ZCAN_API VCI_OpenDevice(U32 Type, U32 Card, U32 Reserved);
EXTERN_C U32 ZCAN_API VCI_CloseDevice(U32 Type, U32 Card);
EXTERN_C U32 ZCAN_API VCI_InitCAN(U32 Type, U32 Card, U32 Port, ZCAN_INIT *pInit);
EXTERN_C U32 ZCAN_API VCI_ReadBoardInfo(U32 Type, U32 Card, ZCAN_DEV_INF *pInfo);
EXTERN_C U32 ZCAN_API VCI_ReadErrInfo(U32 Type, U32 Card, U32 Port, ZCAN_ERR_MSG *pErr);
EXTERN_C U32 ZCAN_API VCI_ReadCANStatus(U32 Type, U32 Card, U32 Port, ZCAN_STAT *pStat);
EXTERN_C U32 ZCAN_API VCI_GetReference(U32 Type, U32 Card, U32 Port, U32 Ref, void *pData);
EXTERN_C U32 ZCAN_API VCI_SetReference(U32 Type, U32 Card, U32 Port, U32 Ref, void *pData);
EXTERN_C U32 ZCAN_API VCI_GetReceiveNum(U32 Type, U32 Card, U32 Port);
EXTERN_C U32 ZCAN_API VCI_ClearBuffer(U32 Type, U32 Card, U32 Port);
EXTERN_C U32 ZCAN_API VCI_StartCAN(U32 Type, U32 Card, U32 Port);
EXTERN_C U32 ZCAN_API VCI_ResetCAN(U32 Type, U32 Card, U32 Port);
EXTERN_C U32 ZCAN_API VCI_Transmit(U32 Type, U32 Card, U32 Port, ZCAN_20_MSG *pData, U32 Count);
EXTERN_C U32 ZCAN_API VCI_TransmitFD(U32 Type, U32 Card, U32 Port, ZCAN_FD_MSG *pData, U32 Count);
EXTERN_C U32 ZCAN_API VCI_Receive(U32 Type, U32 Card, U32 Port, ZCAN_20_MSG *pData, U32 Count, U32 Time);
EXTERN_C U32 ZCAN_API VCI_ReceiveFD(U32 Type, U32 Card, U32 Port, ZCAN_FD_MSG *pData, U32 Count, U32 Time);
EXTERN_C U32 ZCAN_API VCI_Debug(U32 Debug);
// LIN
EXTERN_C U32 VCI_InitLIN(U32 Type, U32 Card, U32 LinChn, PZCAN_LIN_INIT_CONFIG pLINInitConfig);
EXTERN_C U32 VCI_StartLIN(U32 Type, U32 Card, U32 LinChn);
EXTERN_C U32 VCI_ResetLIN(U32 Type, U32 Card, U32 LinChn);
EXTERN_C U32 VCI_TransmitLIN(U32 Type, U32 Card, U32 LinChn, PZCAN_LIN_MSG pSend, U32 Len);
EXTERN_C U32 VCI_GetLINReceiveNum(U32 Type, U32 Card, U32 LinChn);
EXTERN_C U32 VCI_ClearLINBuffer(U32 Type, U32 Card, U32 LinChn);
EXTERN_C U32 VCI_ReceiveLIN(U32 Type, U32 Card, U32 LinChn, PZCAN_LIN_MSG pReceive, U32 Len,int WaitTime);
EXTERN_C U32 VCI_SetLINSubscribe(U32 Type, U32 Card, U32 LinChn, PZCAN_LIN_SUBSCIBE_CFG pSend, U32 nSubscribeCount);
EXTERN_C U32 VCI_SetLINPublish(U32 Type, U32 Card, U32 LinChn, PZCAN_LIN_PUBLISH_CFG pSend, U32 nPublishCount);
// 合并接收
EXTERN_C U32 VCI_TransmitData(unsigned Type, unsigned Card, unsigned Port, ZCANDataObj *pData, unsigned Count);
EXTERN_C U32 VCI_ReceiveData(unsigned Type, unsigned Card, unsigned Port, ZCANDataObj *pData, unsigned Count, unsigned Time);
// UDS
EXTERN_C U32 VCI_UDS_Request(unsigned Type, unsigned Card, const ZCAN_UDS_REQUEST *req, ZCAN_UDS_RESPONSE *resp, U8 *dataBuf, U32 dataBufSize);
EXTERN_C U32 VCI_UDS_Control(unsigned Type, unsigned Card, const ZCAN_UDS_CTRL_REQ *ctrl, ZCAN_UDS_CTRL_RESP *resp);