一、背景:
使用LPC1768來做CAN的收發,在此對使用LPC1769的 CAN 控制器進行收發做個總結和記錄,以備下次開發快速上手使用。
附:LPC1768/1769 除了支持最高頻率不同以外,其它基本上一致。
二、正文:
先貼一張 LPC1769 CAN 控制器的方框圖:
由上圖可見,整個 CAN 控制器一頭是 CPU,另一頭是 CAN 收發器:
CAN 收發器負責 CAN 數據與 CAN 網絡的通信。CAN 內核模塊解析和封裝要發送到 CAN 收發器以及從 CAN
收發器發過來的數據,此處 CAN 內核工作由硬件自行完成。
CPU通過 APB總線即可設置 CAN 控制器狀態,以及讀取中斷信息和中斷狀態。
一共有 3 個發送緩沖器(郵箱),這樣就可以保證,最少可以發送 3組并發的 CAN 數據;
2 個接收緩沖器(郵箱),這樣就可以在 CPU 處理 1 個郵箱的接收數據的同時,
還能用另一個郵箱接收網絡上的數據。
LPC17XX CAN 的驗收濾波器比較特殊,
它是一個獨立于 CAN 控制器的器件,也屬于一種外設,不過比較特殊的是,
它是服務于 CAN 控制器的外設,這么做的意義就在于,驗收濾波這方面,不再需要軟件來做任何事情,直接由硬件來實現查表算法,節省寶貴的 CPU資源,由于它也算是一個
獨立的外設,
CAN 驗收濾波器有 2 種工作模式:一種是一般模式;另一種被稱為“FullCAN 模式”。
1.在一般模式下,當 CAN 控制器的接收端收到一個完整的標識符時,它將通知接收驗收濾波器。驗收濾波器響應這個信號,讀出 CAN 控制器編號和標識符大小(標準標識符 ll 位或擴展標識符 29位);然后搜索 LUT,查找匹配的標識符。如果找到匹配的標識符,則通知 CAN 控制器將接收的報文放入 CAN控制器接收緩沖中;否則,放棄接收到的這一幀信息。
2.如果使能 FullcAN 模式,且 CAN 控制器報告產生的是一
個標準標識符,則驗收過濾器首先查詢 FullCAN 標準標識符表然后在 FullCAN 模式下處理接收。如果在 FullCAN 標準標識符表中沒有找到匹配的 ID,則依次查找下一個存在的表格,直到找到匹配者或查找表結束。一旦發現匹配的 ID,就將接收到的報文放入特定的報文緩沖中而不是 CAN 控制器接收緩沖中,這個特定的緩沖位于驗收濾波器的 RAM 中,而且是在 LUT的最后部分。CPU可以在任何時候讀取接收到的報文。
以上讀起來有點累:
我的理解獨立的外設 CAN,
1.本質是多個硬件比較器,接受 ID 與內部設定 ID自動比較,不通過 CPU,直接由硬件來實現查表算法,節省寶貴的CPU 資源。這是 NXP-CAN獨特優點, 實時工控系統需要由多個功能 CAN,RS485,I2C,用戶邏輯編程等。NXP-CAN 適合設計實時控制系統。
2.編程
只是設定接收濾波器工作模式,與收濾波器起始地址。
3.其它設定網上資料很多。
/*-------------------------------------------------------------------
* 函數名稱: CAN_SetACCF()
* 參 數: 波特率
* 返 回: XX
* 函數功能: 接收濾波器狀態
* 版本信息: 2010-04-30 * 修改信息:
-*-------------------------------------------------------------------
void CAN_SetACCF(const unsigned int ACCFMode)
{
switch (ACCFMode)
{
case ACCF_OFF: // 接收濾波器狀態-復位/停止
LPC_CANAF->AFMR = ACCFMode;// 不 緩 沖 區 接 收 報
文
break;
case ACCF_BYPASS: // 接收濾波器狀態-復位/停止
LPC_CANAF->AFMR = ACCFMode; // 所有接收的報文
存到接收緩沖區中
break;
// 接收濾波器狀態-運行 // 硬件接收過濾
case ACCF_ON: // ACCOFF\ACCBP\EFCAN=0 時,接收濾波
器處于工作模式
case ACCF_FULLCAN: // ,接收濾波器處于 FullCAN 工作模
式
LPC_CANAF->AFMR = ACCF_OFF;
CAN_SetACCF_Lookup();
LPC_CANAF->AFMR = ACCFMode;
break;
default: break;
}
}
/*-------------------------------------------------------------------
函數名稱: CAN_SetACCF()
* 參 數: 波特率
* 返 回: XX
* 函數功能: 接收濾波器狀態
*
*-*------------------------------------------------------------------
void CAN_SetACCF_Lookup(void)
{
unsigned int address = 0;
unsigned int ID_high, ID_low;
/* Set explicit standard Frame */
LPC_CANAF->SFF_sa = address;
ID_low = (0x125 << 16);
ID_high = 0x126;
*((volatile uint32_t *)(LPC_CANAF_RAM_BASE + address))
= ID_low | ID_high;
address += 4;
/* Set group standard Frame */
LPC_CANAF->SFF_GRP_sa = address;
ID_low = (0x125 << 16); // 下邊界
ID_high = 0x129; / 上邊界
*((volatile uint32_t *)(LPC_CANAF_RAM_BASE + address))
= ID_low | ID_high;
address += 4;
LPC_CANAF->EFF_sa = address; //標準擴展幀
LPC_CANAF->EFF_GRP_sa = address; // 擴展幀組幀
/* Set End of Table */
LPC_CANAF->ENDofTable = address; //表結束地址
}
/*--------------------------------------------------------------------------------*-
* 函數名稱: CAN_SetACCF_Lookup()
* 參 數: 波特率
* 返 回: XX
* 函數功能: 接收濾波器狀態
* 說 明: 如果一個表格的起始地址等于下一個表格的起始
地址或表格終止寄存器的數值,
* 則該表格為空,在處理中將被忽略。
* 表格的大小由其前后 2 個表格起始地址寄存器的差值決
定。
* 例如,(SFF_GRP_sa) - (SFF_sa)為獨立標準幀標識符查找表
格大小。
* 若其值為0,即 SFF_GRP_sa=SFF_sa,則獨立標準幀標識符
查找表格大小為 0,
* 在查找時此表格將被忽略。查找表結束寄存器 ENDofTable
代表查找表結束地址,
* (ENDofTable) - (EFF_GRP_sa)為擴展幀組標識符查找表大小。
完整的pdf格式文檔51黑下載地址:
LPC1768CAN硬件過過濾器2.zip
(688.05 KB, 下載次數: 19)
2018-10-18 08:36 上傳
點擊文件名下載附件
|