📄 zlg_can.c
字号:
/*********************************************************************************************************
** Function name: canCirBufWrite
** Descriptions: 往循环队列写一帧数据
** input parameters: ptCanBuf 指向循环队列的指针
** output parameters: ptFrame 数据输出指针
** Returned value: CAN_OK 操作成功
** CAN_ERROR 操作失败
** Created By: 张展威
** Created date: 2008.09.02
**--------------------------------------------------------------------------------------------------------
** Modified by: 张展威
** Modified date: 2009.04.29
** Descriptions: 将帧类型格式的保存放到最后来操作,防止误读
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
INT8U canCirBufWrite(CANCIRBUF *ptCanCirBuf, CANFRAME *ptCanFrame)
{
CANFRAME *ptCanFrameObject;
INT8U i = 0;
ptCanFrameObject = canCirBufMalloc(ptCanCirBuf); /* 从缓冲区申请一帧报文的存储 */
/* 空间 */
if (ptCanFrameObject == (CANFRAME *)0) { /* 缓冲区未满,申请成功 */
return CAN_ERROR;
}
ptCanFrameObject->ucDLC = ptCanFrame->ucDLC; /* 报文数据场长度 */
ptCanFrameObject->ulID = ptCanFrame->ulID; /* 报文ID(标志字符) */
for (i= 0; i < 8; i++) {
ptCanFrameObject->ucDatBuf[i] = ptCanFrame->ucDatBuf[i]; /* 读出数据场内容 */
}
ptCanFrameObject->ucTtypeFormat = ptCanFrame->ucTtypeFormat; /* 写报文类型,使这帧报文有效 */
return CAN_OK; /* 返回操作成功 */
}
/*********************************************************************************************************
** Function name: canNodeCreate
** Descriptions: 初始化一个包含CAN节点信息的结构体变量
** input parameters: ptCanNode:指向节点结构的指针
** ulBaseAddr:节点对应的CAN控制器基址
** ulBaudIn:节点通信波特率(波特率表的索引)
** ulDaReObjMsk:按位选通用于接收数据帧的报文对象
** ulRmReObjMsk:按位选通用于接收远程帧的报文对象
** ulTxMsgObjNr:发送的报文编号
** ptRecvList:指向本节点的接收"缓存"(链表结构)
** pfCanHandlerCallBack:指向canHandler()回调函数的指针
** output parameters: *ptCanNode被初始化
** Returned value: 无
** Created By: 张展威
** Created date: 2009.10.23
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canNodeCreate(CANNODEINFO *ptCanNode, unsigned long ulBaseAddr, unsigned char ucBaudIndex,
unsigned long ulDaReObjMsk, unsigned long ulRmReObjMsk, unsigned long ulTxMsgObjNr,
CANCIRBUF *ptReCirBuf, void (*pfCanHandlerCallBack)(unsigned long ulMessage, long lParam1, long lParam2),
void (*pfIsrHandler)(void))
{
if (ptCanNode == 0) { /* 检查节点的有效性 */
return;
}
// 软件环境初始化
ptCanNode->ulBaseAddr = ulBaseAddr; /* CAN控制器基地址 */
ptCanNode->ucNodeState = CAN_NO_ERROR;
ptCanNode->ucBaudIndex = ucBaudIndex; /* CAN控制器波特率索引 */
ptCanNode->ulBofTimer = 0;
ptCanNode->ulDaReObjMsk = ulDaReObjMsk; /* 接收数据帧报文对象 */
ptCanNode->ulRmReObjMsk = ulRmReObjMsk;
ptCanNode->ulTxMsgObjNr = ulTxMsgObjNr; /* 发送报文对象 */
ptCanNode->ptCanReCirBuf = ptReCirBuf; /* 指向接收数据链表 */
ptCanNode->ptCanTxCirBuf = 0; /* 清空发送数据链表 */
ptCanNode->pfCanHandlerCallBack = pfCanHandlerCallBack; /* 初始化回调函数 */
ptCanNode->pfIsrHandler = pfIsrHandler; /* 中断服务函数 */
}
/*********************************************************************************************************
** Function name: canNodeCallBackSet
** Descriptions: 设置节点回调函数
** input parameters: ptCanNode 指向节点结构的指针
** pfCanHandlerCallBack 指向回调函数的函数指针
** output parameters: 无
** Returned value: 无
** Created By: 张展威
** Created date: 2009.05.22
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canNodeCallBackSet(CANNODEINFO *ptCanNode, void (*pfCanHandlerCallBack)(unsigned long ulMessage, long lParam1, long lParam2))
{
if (ptCanNode == 0) { /* 检查节点的有效性 */
return;
}
ptCanNode->pfCanHandlerCallBack = pfCanHandlerCallBack;
}
/*********************************************************************************************************
** Function name: canFrameSend
** Descriptions: 发送一帧CAN报文至总线
** input parameters: pCAN 指向发送报文结构体指针
** pFrame 数据块指针
** output parameters: 无
** Returned value: 无
** Created By: 曾维勇
** Created date: 2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
**--------------------------------------------------------------------------------------------------------
** Modified by: 张展威
** Modified date: 2008.11.07
** Descriptions: 增加远程帧发送功能
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canFrameSend(CANNODEINFO *ptCanNode, CANFRAME *ptCANFrame)
{
CAN_MSG_OBJ tMsgObjectTx;
unsigned char ucEnable = 0;
if (ptCanNode == 0) { /* 检查节点的有效性 */
return;
}
ucEnable = __ENTER_CIRTICAL(); /* 进入临界区 */
tMsgObjectTx.ulMsgID = ptCANFrame->ulID; /* 取得报文标识符 */
if ((ptCANFrame->ucTtypeFormat & XTD_MASK) != 0){
tMsgObjectTx.ulFlags = MSG_OBJ_EXTENDED_ID; /* 扩展格式帧 */
} else {
tMsgObjectTx.ulFlags = MSG_OBJ_NO_FLAGS; /* 标准格式帧 */
}
tMsgObjectTx.ulFlags |= MSG_OBJ_TX_INT_ENABLE; /* 标记发送中断使能 */
tMsgObjectTx.ulMsgLen = (unsigned long)ptCANFrame->ucDLC; /* 标记数据域长度 */
tMsgObjectTx.pucMsgData = ptCANFrame->ucDatBuf; /* 传递数据存放指针 */
CANRetrySet(ptCanNode->ulBaseAddr, true); /* 启动发送失败重发 */
if ((ptCANFrame->ucTtypeFormat & RMRQS_MASK) != 0) {
CANMessageSet(ptCanNode->ulBaseAddr, /* CAN控制器基址 */
ptCanNode->ulTxMsgObjNr, /* 发送报文对象编号 */
&tMsgObjectTx, MSG_OBJ_TYPE_TX_REMOTE); /* 配置远程帧发送报文对象 */
} else {
CANMessageSet(ptCanNode->ulBaseAddr, /* CAN控制器基址 */
ptCanNode->ulTxMsgObjNr, /* 发送报文对象编号 */
&tMsgObjectTx, MSG_OBJ_TYPE_TX); /* 配置数据帧发送报文对象 */
}
__EXIT_CIRTICAL(ucEnable); /* 退出临界区 */
}
/*********************************************************************************************************
** Function name: canReMsgObjSet
** Descriptions: 设置接收数据帧及远程帧的报文对象,若选通多个报文对象则将报文对象串连成FIFO缓冲器
** input parameters: ulBaseAddr CAN模块基址
** ulMsgObjMask 按位选通要设置的报文对象
** ulFrameID 接收帧ID
** ulFrameIDMsk 接收帧屏蔽码
** ucFramType STD_ID_FILTER 过滤接收标准格式的报文
** EXT_ID_FILTER 过滤接收扩展格式的报文
** STD_EXT_FILTER 过滤接收标准及扩展格式的报文,不使用ID掩码
** ucMsgType MSG_OBJ_TYPE_RX 接收报文对象
** MSG_OBJ_TYPE_RX_REMOTE 接收远程帧报文对象
** output parameters: 无
** Returned value: 无
** Created By: 张展威
** Created date: 2008.08.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canReMsgObjSet(CANNODEINFO *ptCanNode, unsigned long ulMsgObjMask, unsigned long ulFrameID,
unsigned long ulFrameIDMsk, unsigned char ucFramType, unsigned char ucMsgType)
{
CAN_MSG_OBJ tMsgObj;
//unsigned long ulBaseAddr;
LPC_CAN_TypeDef *ptCanBase;
unsigned char ucDataBuf[8];
unsigned short usCmdMaskReg;
unsigned short usMaskReg[2];
unsigned short usArbReg[2];
unsigned short usMsgCtrl;
tBoolean bUseExtendedID = false;
tBoolean bEob = false;
int i;
if (ptCanNode == 0) { /* 检查节点的有效性 */
return;
}
ptCanBase = (LPC_CAN_TypeDef *)(ptCanNode->ulBaseAddr);
if (ulMsgObjMask == 0) {
return; /* 没有选定报文对象 */
}
if (ucMsgType == MSG_OBJ_TYPE_RX) { /* 数据帧接收报文对象 */
ptCanNode->ulDaReObjMsk |= ulMsgObjMask; /* 按位标记接收报文对象 */
} else if (ucMsgType == MSG_OBJ_TYPE_RX_REMOTE){ /* 远程帧报文接收对象 */
ptCanNode->ulRmReObjMsk |= ulMsgObjMask; /* 按位标记"发送"报文对象 */
} else {
return; /* 参数非法,直接退出此函数 */
}
tMsgObj.ulMsgID = ulFrameID; /* 报文滤波ID */
tMsgObj.ulMsgIDMask = ulFrameIDMsk; /* ID掩码*/ /* 接收报文对象处理 */
switch (ucFramType) { /* 帧类型处理 */
case STD_ID_FILTER: { /* 标准帧 */
tMsgObj.ulFlags = (MSG_OBJ_RX_INT_ENABLE | /* 允许接收中断 */
MSG_OBJ_USE_ID_FILTER | /* 使用报文ID滤波 */
MSG_OBJ_USE_EXT_FILTER | /* Xtd参与滤波 */
MSG_OBJ_USE_DIR_FILTER); /* Dir参与滤波 */
bUseExtendedID = false; /* 不是扩展帧 */
break;
}
case EXT_ID_FILTER: { /* 扩展帧 */
tMsgObj.ulFlags = (MSG_OBJ_RX_INT_ENABLE | /* 允许接收中断 */
MSG_OBJ_EXTENDED_ID | /* 扩展ID */
MSG_OBJ_USE_ID_FILTER | /* 使用报文ID滤波 */
MSG_OBJ_USE_EXT_FILTER | /* Xtd参与滤波 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -