?? main.cpp
字號:
//////////////////////////////////////////////////////////////
// 基于C++類庫CCAN及CLUT的LPC2000 CAN演示程序
// 周立功單片機版權所有
//////////////////////////////////////////////////////////////
#include "config.h"
#include "CAN.H" // CCAN類定義
#include "LUT.h" // CLUT類定義
CCAN Can1(1,32); // 構造一個CAN通道,CAN控制器號為1,內建32幀軟件接收緩沖
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); // 接任何收數據,bypass mode
_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();
_CANRxBUF rxbuf;
_CANTxBUF txbuf;
txbuf.fi.Bits.DLC = 8;
txbuf.fi.Bits.FF = 0;
txbuf.fi.Bits.RTR =0;
txbuf.id.dwValue=0;
txbuf.da.dwValue=0x01234567;
txbuf.db.dwValue=0x89abcdef;
//將接受的數據返回,ID增加0x100
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 + 0x100; //簡單的ID加0x100回送數據
txbuf.da.dwValue=rxbuf.da.dwValue;
txbuf.db.dwValue=rxbuf.db.dwValue;
// 寫發送緩沖并啟動發送,這個demo沒有任何超時機制限制
// 真正使用時應該調用IsTransCompleted函數查詢是否發送成功并需要有超時限制
while(Can1.Transmit(&txbuf) == 0);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -