📄 iar-
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: CANRcv_snd.c
** Last modified Date: 2007.01.18
** Last Version: 1.0
** Description: CAN 通信程序
**
**--------------------------------------------------------------------------------------------------------
** Created By: 曾维勇
** Created date: 2007.09.16
** Version: 1.0
** Descriptions: The original version 初始版本
**
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
** Version: 1.1
** Description: The second version 第二版
**
**--------------------------------------------------------------------------------------------------------
** Modified by: Kang qinhua
** Modified date: 2008.01.13
** Version: v1.2
** Description:
**
*********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
声明全局变量
*********************************************************************************************************/
extern tCANFrameBuff *pReceFrameBuff; /* 指向帧接收缓冲区的指针 */
extern tCANFrameBuff *pSendFrameBuff; /* 指向帧发送缓冲区的指针 */
extern tCANNodeInfo *pCAN_Node_Info; /* 指向CAN节点数据信息的指针 */
/*********************************************************************************************************
This structure holds the static defitions used to configure the CAN
controller bit clock in the proper state given a requested setting.
*********************************************************************************************************/
tCANBitClkParms CANBitClkSettings[] =
{
/*
* OSC = 8MHz
*/
#if 0
{5, 2, 2, 1}, /* CANBAUD_1M */
{5, 2, 2, 2}, /* CANBAUD_500K */
{5, 2, 2, 4}, /* CANBAUD_250K */
{9, 6, 4, 4}, /* CANBAUD_125K */
{5, 2, 2, 10}, /* CANBAUD_100k */
{5, 2, 2, 20}, /* CANBAUD_50k */
{9, 6, 4, 20}, /* CANBAUD_25k */
{5, 2, 2, 50}, /* CANBAUD_20k */
{5, 2, 2, 100}, /* CANBAUD_10k */
{9, 6, 2, 100}, /* CANBAUD_5k */
{9, 6, 2, 200}, /* CANBAUD_2k5 */
#endif
/*
* OSC = 6MHz
*/
{6, 1, 2, 1}, /* CANBAUD_1M */
{11, 4, 2, 1}, /* CANBAUD_500K */
{11, 4, 2, 2}, /* CANBAUD_250K */
{11, 4, 2, 4}, /* CANBAUD_125K */
{11, 4, 2, 5}, /* CANBAUD_100k */
{11, 4, 2, 10}, /* CANBAUD_50k */
{11, 4, 2, 20}, /* CANBAUD_25k */
{11, 4, 2, 25}, /* CANBAUD_20k */
{11, 4, 2, 50}, /* CANBAUD_10k */
{11, 4, 2, 100}, /* CANBAUD_5k */
{11, 4, 2, 200}, /* CANBAUD_2k5 */
};
/*********************************************************************************************************
** Function name: CreateCAN
** Descriptions: 创建一个节点信息结构体
** input parameters: *pCAN 指向节点结构的空指针
** ulChannelNr 节点通道号
** ulBaud 节点通信波特率
** ulRxMsgObj 节点接收数据MO
** ulTxMsgObj 节点发送数据MO
** *pReceBuff 节点接收数据缓冲区
** *pSendBuff 节点发送数据缓冲区
** output parameters: 无
** Returned value: 无
** Created By: 曾维勇
** Created date: 2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void CreateCAN (void *pCAN,unsigned long ulChannelNr, unsigned char ulBaud, unsigned long ulRxMsgObj,
unsigned long ulTxMsgObj, tCANFrameBuff *pReceBuff, tCANFrameBuff *pSendBuff)
{
tCANNodeInfo *pCAN_Info;
pCAN_Info = (tCANNodeInfo *)pCAN;
pCAN_Info->ulChNr = ulChannelNr;
pCAN_Info->ucBADVal = ulBaud;
pCAN_Info->ulRxMsgObjNr = ulRxMsgObj;
pCAN_Info->ulTxMsgObjNr = ulTxMsgObj;
pCAN_Info->pReceFrameBuff = pReceBuff;
pCAN_Info->pSendFrameBuff = pSendBuff;
return;
}
/*********************************************************************************************************
** Function name: CAN_ucWriteBuffer
** Descriptions: 写帧接收缓冲区
** input parameters: *pBuf 指向接收缓冲区的指针
** *pWrite 写数据块指针
** output parameters: 无
** Returned value: FULL, 缓冲区已满
** NOT_FULL 缓冲区未满
** Created By: 曾维勇
** Created date: 2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned char CAN_ucWriteBuffer (void *pBuf, void *pWrite)
{
tCANFrameBuff *pRecBuf;
tCANFrame *pWriteBuf;
pRecBuf = (tCANFrameBuff *)pBuf;
pWriteBuf = (tCANFrame *)pWrite;
if (pRecBuf->ucBufEmpty == FULL) { /* 接收缓冲区已满 */
return FULL;
}
pRecBuf->ucSize ++;
pRecBuf->ucBufFull = NOT_FULL;
pRecBuf->Buffer[pRecBuf->ucWrite] = *pWriteBuf; /* 向接收缓冲区写数据 */
pRecBuf->ucWrite = (pRecBuf->ucWrite + 1) % CAN_MAX_Buffer;
if (pRecBuf->ucSize == CAN_MAX_Buffer) { /* 接收缓冲区已满 */
pRecBuf->ucBufFull = FULL;
pRecBuf->ucBufEmpty = NOT_EMPTY;
return FULL;
}
return NOT_FULL;
}
/*********************************************************************************************************
** Function name: CAN_ucReadBuffer
** Descriptions: 读数据缓冲区
** input parameters: *pBuf 指向数据缓冲区指针
** *pRead 读数据块指针
** output parameters: 无
** Returned value: EMPTY , 缓冲区为空
** NOT_EMPTY, 缓冲区非空
** Created By: 曾维勇
** Created date: 2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned char CAN_ucReadBuffer (void *pBuf, void *pRead)
{
tCANFrameBuff *pRecBuf;
tCANFrame *pReadBuf;
pRecBuf = (tCANFrameBuff *)pBuf;
pReadBuf = (tCANFrame *)pRead;
if (pRecBuf->ucSize == 0 ) {
pRecBuf->ucBufEmpty = EMPTY;
pRecBuf->ucBufFull = NOT_FULL;
return EMPTY;
}
pRecBuf->ucSize --;
*pReadBuf = pRecBuf->Buffer[pRecBuf->ucRead];
pRecBuf->ucRead = (pRecBuf->ucRead + 1) % CAN_MAX_Buffer;
return NOT_EMPTY;
}
/*********************************************************************************************************
** Function name: SendCANFrame
** 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
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void SendCANFrame(void *pCAN, void *pFrame)
{
tCANMsgObject MsgObjectTx;
tCANNodeInfo *pCAN_Info;
tCANFrame *pCANFrame;
pCAN_Info = (tCANNodeInfo *)pCAN;
pCANFrame = (tCANFrame *)pFrame;
MsgObjectTx.ulMsgID = pCANFrame->ulID;
if (pCANFrame->ucXID) {
MsgObjectTx.ulFlags = MSG_OBJ_EXTENDED_ID;
} else {
MsgObjectTx.ulFlags = MSG_OBJ_NO_FLAGS;
}
MsgObjectTx.ulFlags |= MSG_OBJ_TX_INT_ENABLE;
MsgObjectTx.ulMsgLen = (unsigned long)pCANFrame->ucDLC;
MsgObjectTx.pucMsgData = pCANFrame->ucDatBuf;
/*
* 启动发送失败重发
*/
CANRetrySet(pCAN_Info->ulChNr, pCAN_Info->ulTxMsgObjNr);
CANMessageSet(pCAN_Info->ulChNr, pCAN_Info->ulTxMsgObjNr, &MsgObjectTx, MSG_OBJ_TYPE_TX);
return;
}
/*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -