📄 main.cpp
字号:
//////////////////////////////////////////////////////////////
// 基于C++类库CCAN及CLUT的LPC2000 CAN演示程序
// 周立功单片机版权所有
//////////////////////////////////////////////////////////////
#include "config.h"
#include "CAN.H" // CCAN类定义
#include "LUT.h" // CLUT类定义
CCAN CanA(1,64); // 构造一个CAN通道,CAN控制器号为1,内建128帧软件接收缓冲
CCAN CanB(2,64); // 构造一个CAN通道,CAN控制器号为2,内建128帧软件接收缓冲
volatile UINT32 err;
void __irq AllCanACanBINT(void) // CAN1的发送接收VIC中断函数,表格错误或其他CAN中断入口
{
if(1 /*CAN interrupt occur*/)
{
err = CANLUTerrAd; // debug
CanA.IntEntry(); // 调用成员函数处理接收、发送中断或其他CAN中断入口
CanB.IntEntry();
VICVectAddr = 0;
}
}
//////////////////////////////////////////////////////////////
int main()
{
VICIntSelect = 0; // 设置所有中断分配为IRQ中断
// CAN1/CAN2 中断入口设定,非向量中断
VICDefVectAddr = (UINT32)AllCanACanBINT;
// 打开相应的VIC中断允许
VICIntEnable = (0x01L << 19); // for CanA and CanB
VICIntEnable = ((0x01L << 20) | (0x01L << 26)); // for CanA
VICIntEnable = ((0x01L << 21) | (0x01L << 27)); // for CanB
// 设置接收过滤器模式
CLUT::AFSetMode(1); // 接任何收数据,bypass mode
_CANBTR btr;
btr.dwValue = 0; // 500K波特律的设置
btr.Bits.BRP = 1;
btr.Bits.TSEG1 = 7;
btr.Bits.TSEG2 = 1;
btr.Bits.SJW = 0;
btr.Bits.SAM = 0;
CanA.Initial(btr); // 用500K波特率初始化CanA
btr.dwValue = 0; // 250K波特律的设置
btr.Bits.BRP = 3;
btr.Bits.TSEG1 = 7;
btr.Bits.TSEG2 = 1;
btr.Bits.SJW = 0;
btr.Bits.SAM = 1;
CanB.Initial(btr); // 用250K波特率初始化CanB
// 启动总线进入工作模式
CanA.SoftBusEnable();
CanB.SoftBusEnable();
_CANRxBUF rxbuf;
_CANTxBUF txbuf;
// CAN1 CAN2 数据中转传输
while(1)
{
if(TRUE == CanA.Receive(&rxbuf))
{
txbuf.fi.Bits.DLC=rxbuf.fs.Bits.DLC;
txbuf.fi.Bits.FF = rxbuf.fs.Bits.FF;
txbuf.fi.Bits.RTR=rxbuf.fs.Bits.RTR;
txbuf.id.dwValue=rxbuf.id.dwValue;
txbuf.da.dwValue=rxbuf.da.dwValue;
txbuf.db.dwValue=rxbuf.db.dwValue;
// 写发送缓冲并启动发送,这个demo没有任何超时机制限制
// 真正使用时应该调用IsTransCompleted函数查询是否发送成功并需要有超时限制
while(CanB.Transmit(&txbuf) == 0);
}
if(TRUE == CanB.Receive(&rxbuf))
{
txbuf.fi.Bits.DLC=rxbuf.fs.Bits.DLC;
txbuf.fi.Bits.FF = rxbuf.fs.Bits.FF;
txbuf.fi.Bits.RTR=rxbuf.fs.Bits.RTR;
txbuf.id.dwValue=rxbuf.id.dwValue;
txbuf.da.dwValue=rxbuf.da.dwValue;
txbuf.db.dwValue=rxbuf.db.dwValue;
// 写发送缓冲并启动发送,这个demo没有任何超时机制限制
// 真正使用时应该调用IsTransCompleted函数查询是否发送成功并需要有超时限制
while(CanA.Transmit(&txbuf) == 0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -