/****************************************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 "../Common/inc/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 canNode0Handler (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 *********************************************************************************************************/