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

📄 can_recsend_test.c

📁 LPC11C14 CAN 代码
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name:               CAN_RecSend_Test.c
** Last modified Date:      2010.02.25
** Last Version:            1.0
** Description:             CAN 通信程序
**
**--------------------------------------------------------------------------------------------------------
** Created By:              张展威
** Created date:            2010.02.25
** Version:                 1.0
** Descriptions:            Designed for LPC1114
**--------------------------------------------------------------------------------------------------------
** Modified by:				梁宝琼
** Modified date:			2010.06.01
** Version:				    1.1
** Description:			    Designed for LPC11C14
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
#include "LPC11xx.h"                                                    /* LPC11xx Peripheral Registers */
#include "can_reg_cfg.h"
#include "dataType.h"
#include "can.h"
#include "zlg_can.h"

/*********************************************************************************************************
  CAN 模块相关
*********************************************************************************************************/
CANNODEINFO *GptCanNode0;                                               /* 定义指向CAN0的节点指针       */
const CANFRAME GtCanFramTest = {                                        /* 测试CAN通信时发送的数据帧    */
    XTD_DATA,                                                           /* 扩展帧                       */
    8,                                                                  /* 数据域长度为8                */
    0x123,                                                              /* 报文ID为0x123                */
    {0x55,0xAA,0x55,0xAA,0x03,0x02,0x01,0x00}                           /* 数据域内容                   */
};


CANFRAME GtCanFrameReBuf[CAN_BUF_RE_LENGTH] = {0};                      /* CAN通信接收缓冲区            */
CANFRAME GtCanFrameTxBuf[CAN_BUF_TX_LENGTH] = {0};                      /* CAN通信发送缓冲区            */

CANCIRBUF GtCanReCirBuf = {                                             /* 定义接收循环队列             */
    0,                                                                  /* 缓存写指针(索引)           */
    0,                                                                  /* 缓存读指针(索引)           */
    false,                                                              /* 标记队列未满                 */
    CAN_BUF_RE_LENGTH,                                                  /* 记录缓存深度                 */
    GtCanFrameReBuf                                                     /* 指向数据场缓冲区             */
};

CANCIRBUF GtCanTxCirBuf = {                                             /* 定义发送循环队列             */
    0,                                                                  /* 缓存Buffer[]写下标           */
    0,                                                                  /* 缓存Buffer[]读下标           */
    false,                                                              /* 标记队列未满                 */
    CAN_BUF_TX_LENGTH,                                                  /* 记录缓存深度                 */
    GtCanFrameTxBuf                                                     /* 指向数据场缓冲区             */
};

/*********************************************************************************************************
  全局变量
*********************************************************************************************************/
unsigned long    GulSysClock     =  12000000UL;                         /* 记录处理器时钟频率           */

void SysCtlDelay(unsigned long ulCount);                                /* 延时函数                     */
void intMasterEnable(void);                                             /* 打开总中断                   */

/*********************************************************************************************************
  CAN节点0的中断服务函数
*********************************************************************************************************/
void CAN_IRQHandler (void)
{
    canHandler(GptCanNode0);
}

/*********************************************************************************************************
  CAN节点0的发送函数
*********************************************************************************************************/
unsigned char canDataSend(CANFRAME *ptCanFrame)
{
    /* 
	 *  将收到数据填充至发送缓冲区 
	 */
    if (canCirBufWrite(&GtCanTxCirBuf, ptCanFrame) != CAN_OK) {
        return CAN_ERROR;                                               /* 缓存已满                     */
        
    }
    if (canCirBufSend(GptCanNode0, &GtCanTxCirBuf) == BUSY) {
        
		/* 
		 *  上一帧数据尚未发送完,本帧报文将在发送中断程序中自动完成发送
		 */
        GptCanNode0->ucNodeState |= CAN_SEND_FAIL;
        return BUSY;
    }
    return CAN_OK;                                                      /* 即时发送                     */
}

/*********************************************************************************************************
** Function name:           main
** Descriptions:            该范例程序演示了通过USBCAN,开发板TinyM0-CAN与PC机进行CAN通信,波特率为500Kbps。
**                          注:此例程是基于LPC11C14上CAN寄存器操作。用户也可选择通过调用LPC11C14片上
**                              CAN API函数,实现CAN数据通信,详细见例程CAN_RecSend_API。
**                          
** input parameters:        无
** output parameters:       无
** Returned value:          无
** Created By:              张展威
** Created date:            2008.09.03
**--------------------------------------------------------------------------------------------------------
** Modified by:				梁宝琼 
** Modified date:			2010.06.01
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int main(void)
{
    /* 
	 *  定义并初始化表示CAN节点的结构体变量	
	 */
    CANNODEINFO  tCanNode0 = CANNODE(LPC_CAN_BASE,                      /* CAN寄存器基址                */
	                                 CANBAUD_500K,                      /* CAN波特率                    */
									 RE_DATA_SN,                        /* 按位选择接收数据针报文对象   */
	                                 RE_REMOTE_SN,	                    /* 按位选择接收远程针报文对象   */
									 TX_MSG_SN,		                    /* 发送报文对象编号             */
									 &GtCanReCirBuf,	                /* 指向本节点的接收缓冲区       */
									 0,
									 0);
    CANFRAME     tCanFrame;                                             /* 定义表示CAN帧结构体变量      */
   
    SystemInit();	                                                    /* 系统时钟初始化               */

    GptCanNode0 = &tCanNode0;                                           /* 指向结构体变量               */
    
    /*
	 *  接收所有类型及格式的CAN报文(这里的0x123被忽略)  
	 */
    canApplyInit(GptCanNode0, 0x123, UNMASK, STD_ID_FILTER|EXT_ID_FILTER);
                                                                        /* 初始化CAN控制器,设置波特率等 */
    intMasterEnable();                                                  /* 使能中断总开关               */

    while (1) {
        while (canCirBufRead(GptCanNode0->ptCanReCirBuf, &tCanFrame) == CAN_OK) {
                                                                        /* 读空接收缓存中的数据         */
            canDataSend((CANFRAME *)&tCanFrame);                        /* 发送收到的数据               */
        }
        
        /* 
		 *  总线接入状态判断	 
		 */
        if ((GptCanNode0->ucNodeState & CAN_BUS_OFF) && (GptCanNode0->ulBofTimer > 125)) {
                                                                        /* CAN控制器脱离总线            */
            canNodeBusOn(GptCanNode0);                                  /* 2.5秒后节点重新上线          */
            GptCanNode0->ucNodeState &= ~CAN_BUS_OFF;                   /* 清除离线标志                 */
        }
        
        SysCtlDelay(20 * (GulSysClock / 3000));                         /* 延时约20ms                   */
        if(GptCanNode0->ulBofTimer < 65535) {
            GptCanNode0->ulBofTimer++;
        }
        
        /* 
		 *  发送成功	
		 */
        if (GptCanNode0->ucNodeState & CAN_FRAM_SEND) {                 /* 发送完成                     */
            GptCanNode0->ucNodeState &= ~CAN_FRAM_SEND;                 /* 清除发送完成标志             */
        }
        
        /* 
		 *  传输失败	
		 */
        if (GptCanNode0->ucNodeState & CAN_SEND_FAIL) {                 /* 发送失败                     */
            GptCanNode0->ucNodeState &= ~CAN_SEND_FAIL;                 /* 清除发送失败标志             */
        }
    }                                                                   /* End while (1)                */
}

#if defined(ewarm) || defined(DOXYGEN)
void SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
    "    bne.n   SysCtlDelay\n"
    "    bx      lr");
}
#endif

#if defined(codered) || defined(gcc) || defined(sourcerygxx)
void __attribute__((naked))	SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
    "    bne     SysCtlDelay\n"
    "    bx      lr");
}
#endif

#if defined(rvmdk) || defined(__ARMCC_VERSION)
__asm void SysCtlDelay(unsigned long ulCount)
{
    subs    r0, #1;
    bne     SysCtlDelay;
    bx      lr;
}

__asm void intMasterEnable() {
    CPSIE   I                                                           /* 打开总中断                   */
    BX      LR
}
#endif

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -