📄 can_recsend_test.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 + -