⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iar-

📁 IAR_example_EasyARM8962.zip
💻
📖 第 1 页 / 共 2 页
字号:
/****************************************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 + -