?? main.cpp
字號(hào):
//////////////////////////////////////////////////////////////
// 基于C++類庫(kù)CCAN及CLUT的LPC2000 CAN演示程序
// 周立功單片機(jī)版權(quán)所有
//////////////////////////////////////////////////////////////
#include "config.h"
#include "CAN.H" // CCAN類定義
#include "LUT.h" // CLUT類定義
///////////////////////////////////////////////////////////////////////////////
CCAN Can1(1,32); // 構(gòu)造一個(gè)CAN通道,CAN控制器號(hào)為1,內(nèi)建32幀軟件接收緩沖
CCAN Can2(2,64); // 構(gòu)造一個(gè)CAN通道,CAN控制器號(hào)為2,內(nèi)建64幀軟件接收緩沖
///////////////////////////////////////////////////////////////////////////////
volatile UINT32 err;
void __irq CAN1TxRxINT(void) // CAN1的發(fā)送接收VIC中斷函數(shù)
{
Can1.IntEntry();
VICVectAddr = 0;
}
void __irq CAN2TxRxINT(void) // CAN2的發(fā)送接收VIC中斷函數(shù)
{
Can2.IntEntry();
VICVectAddr = 0;
}
void __irq LUTINTorOther(void) // 表格錯(cuò)誤或其他CAN中斷入口
{
err = CANLUTerrAd; // debug
Can1.IntEntry();
Can2.IntEntry();
VICVectAddr = 0;
}
////////////////////////////////////////////////////////////////
// LPC ARM CAN 測(cè)試程序
// 在2119/2194/2229簡(jiǎn)單測(cè)試通過(guò)
int main()
{
VICIntSelect = 0; // 設(shè)置所有中斷分配為IRQ中斷
// CAN1 中斷入口設(shè)定
VICVectCntl10 = 0x20 | 20;
VICVectAddr10 = (UINT32)CAN1TxRxINT;
VICVectCntl11 = 0x20 | 26;
VICVectAddr11 = (UINT32)CAN1TxRxINT;
// CAN2 中斷入口設(shè)定
VICVectCntl12 = 0x20 | 21;
VICVectAddr12 = (UINT32)CAN2TxRxINT;
VICVectCntl13 = 0x20 | 27;
VICVectAddr13 = (UINT32)CAN2TxRxINT;
// 19共享中斷入口設(shè)定
VICVectCntl14 = 0x20 | 19;
VICVectAddr14 = (UINT32)LUTINTorOther;
// 打開(kāi)相應(yīng)的VIC中斷允許
VICIntEnable = (0x01L << 19);
VICIntEnable = ((0x01L << 20) | (0x01L << 26));
VICIntEnable = ((0x01L << 21) | (0x01L << 27));
CLUT::AFSetMode(1); // bypass
_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,也可以用不同的波特律進(jìn)行CAN的初始化
Can1.Initial(btr);
Can2.Initial(btr);
// 啟動(dòng)總線進(jìn)入工作模式
Can1.SoftBusEnable();
Can2.SoftBusEnable();
_CANRxBUF rxbuf;
_CANTxBUF txbuf;
// CAN1 CAN2 數(shù)據(jù)中轉(zhuǎn)傳輸
while(1)
{
if(TRUE == Can1.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;
// 寫(xiě)發(fā)送緩沖并啟動(dòng)發(fā)送,這個(gè)demo沒(méi)有任何超時(shí)機(jī)制限制
// 真正使用時(shí)應(yīng)該調(diào)用IsTransCompleted函數(shù)查詢是否發(fā)送成功并需要有超時(shí)限制
while(Can2.Transmit(&txbuf) == 0);
}
if(TRUE == Can2.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;
// 寫(xiě)發(fā)送緩沖并啟動(dòng)發(fā)送,這個(gè)demo沒(méi)有任何超時(shí)機(jī)制限制
// 真正使用時(shí)應(yīng)該調(diào)用IsTransCompleted函數(shù)查詢是否發(fā)送成功并需要有超時(shí)限制
while(Can1.Transmit(&txbuf) == 0);
}
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -