📄 main.cpp
字号:
//////////////////////////////////////////////////////////////
// 基于C++类库CCAN及CLUT的LPC2000 CAN演示程序
// 周立功单片机版权所有
//////////////////////////////////////////////////////////////
#include "config.h"
#include "CAN.H" // CCAN类定义
#include "LUT.h" // CLUT类定义
/////////////////////////////////////////////////////////////////////////////////
class CMyCAN : public CCAN // 从CCAN基类派生出CMyCAN,目的是实现虚拟函数的重载,改写原有的中断处理
{
public:
CMyCAN(UINT32 index,UINT32 RxBufZise) : CCAN(index,RxBufZise)
{
// 直接使用构造函数,在此可以不用做任何处理;
// 注意带参数的构造方法!!!
}
protected:
virtual void OnRI(_CANICR icr) // 虚拟函数重载,写自己的实时接收实现代码,当接收中断发生时此函数会被自动调用
{
// 获得接收缓冲区指针
_CANRxBUF *rxbuf = (_CANRxBUF *)®RFS; //(m_RegBase + RFS_OFFSET);
_CANTxBUF txbuf;
// 准备实时返回一个远程帧
txbuf.id.dwValue = rxbuf->id.dwValue;
txbuf.fi.Bits.DLC=rxbuf->fs.Bits.DLC;
txbuf.fi.Bits.FF = rxbuf->fs.Bits.FF;
txbuf.fi.Bits.RTR=1;
// 写发送缓冲并启动发送,这个demo没有任何超时机制限制
// 真正使用时应该调用IsTransCompleted函数查询是否发送成功并需要有超时限制
while(Transmit(&txbuf) == 0);
_CANCMR cmr;
cmr.dwValue = 0;
cmr.Bits.RRB = 1;
REGCMR = cmr.dwValue; // 执行一次释放接收缓冲区命令,这是必要的的!!!
UNREFERENCED_PARAMETER(icr); // 仅仅用于防止一个编译警告的出现
}
// 所有virtual函数都可以被重载,使得使用CCAN类的用户可以不需要更改基类代码就
// 改写或重写所有中断的处理;
};
/////////////////////////////////////////////////////////////////////////////////
CMyCAN Can1(1,0); // 使用自己的实现类构造一个CAN通道,CAN控制器号为1,不需要内建软件接收缓冲
volatile UINT32 err;
void __irq CAN1TxRxINT(void) // CAN1的发送接收VIC中断函数
{
Can1.IntEntry(); // 调用成员函数处理接收、发送中断
VICVectAddr = 0;
}
void __irq LUTINTorOther(void) // 表格错误或其他CAN中断入口
{
err = CANLUTerrAd; // debug
Can1.IntEntry(); // 调用成员函数处理CAN的其他中断
VICVectAddr = 0;
}
//////////////////////////////////////////////////////////////
int main()
{
VICIntSelect = 0; // 设置所有中断分配为IRQ中断
// CAN1 中断入口设定
VICVectCntl10 = 0x20 | 20;
VICVectAddr10 = (UINT32)CAN1TxRxINT;
VICVectCntl11 = 0x20 | 26;
VICVectAddr11 = (UINT32)CAN1TxRxINT;
// 19共享中断入口设定
VICVectCntl14 = 0x20 | 19;
VICVectAddr14 = (UINT32)LUTINTorOther;
// 打开相应的VIC中断允许
VICIntEnable = (0x01L << 19);
VICIntEnable = ((0x01L << 20) | (0x01L << 26));
// 设置接收过滤器模式
CLUT::AFSetMode(1); // 接任何数据
_CANBTR btr;
btr.dwValue = 0; // 1000K波特律的设置
btr.Bits.BRP = 0;
btr.Bits.TSEG1 = 7;
btr.Bits.TSEG2 = 1;
btr.Bits.SJW = 0;
btr.Bits.SAM = 0;
// 用波特率初始化CAN
Can1.Initial(btr);
// 启动总线进入工作模式
Can1.SoftBusEnable();
//循环
while(1)
{
// ...
// 事务处理...
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -