CAN學習小結_看起來做個畢業設計不錯

 

最近心血來潮,學了CAN總線,據說是最有前途的現場總線          之一。EDN助學—CAN學習小組的老師們的無私奉獻、http://group.ednchina.com/684/

 

大家經常採用RS232,RS485通訊方式,是因爲它們簡單!但是當你學會了CAN總線後,就知道CAN
總線比它們更簡單!你會在以後的設計中毫不猶豫的採用CAN總線作爲通訊方式!

採用獨立can控制器飛利浦的SJA1000 can收發器採用PCA82C250T - (CAN controller interface )。微控制器採用8051(SJA1000作爲51的外部ram使用)

 

爲了看懂程序必須先看寄存器,sja1000寄存器那個複雜,看了老長時間纔看出個大概,不過還好,sja1000作爲51 的外部ram。直接像訪問外部ram一樣對寄存器進行操作就OK'

 

//CAN 初始化函數
void Init_CAN(void)
{
unsigned char bdata temp; //建立存儲在bdata 中的臨時變量temp
do
{
MODR=0x09; temp=MODR; //模式寄存器-設置復位模式而且單驗收濾波模式
}
while(!(temp&0x01)); //判斷
CDR=0x88; //時鐘分頻寄存器-設置PeliCAN 模式,Clock off 有效
BTR0=0x31; //總線時序寄存器-波特率爲10kbps
BTR1=0x1c;
IER=0x01; //中斷使能寄存器-接收中斷使能
OCR=0xaa; //輸出控制寄存器-借籤...
CMR=0x04; //命令寄存器-釋放RXFIF0
ACR0='C'; //接收代碼寄存器-本節點地址位CAN0
ACR1='A';
ACR2='N';
ACR3=0x00;
AMR0=0x00; //接收屏蔽寄存器-無任何屏蔽
AMR1=0x00;
AMR2=0x00;
AMR3=0x03; //最後兩位爲無用位,必須設置爲邏輯1
/*根據想要設置的模式而進行設置,這裏設置了自檢測模式*/
do
{
MODR=0x08; temp=MODR; //模式寄存器-推出復位模式,保持單驗收濾波模式
}
while(temp&0x01); //判斷...
}

******************************************************************************************

86
節點發送函數:
#include "reg52.h"
#include "sja1000.h"
unsigned char Txd_data;
//CAN 節點發送函數
void CAN_TXD(void)
{
unsigned char bdata temp;
do
{
temp=SR; //判斷報文接收完畢?
}
while(temp&0x10); //SR.4=0 發送閒置,SR.4=1 發送狀態中
do
{
temp=SR; //判斷最後報文請求?
}
while(!(temp&0x08)); //SR.3=0 沒有餘報文請求,SR.3=1 還存在報文請求
do
{
temp=SR; //判斷TXFIFO 是否鎖定?
}
while(!(temp&0x04)); //SR.2=0 鎖定,SR.2=1 開放
TBSR0=0x88; //ff=1 SFF 格式,DLC.3=1 數據長度8
TBSR1='C'; //目標節點地址CAN0
TBSR2='A';
TBSR3='N';
TBSR4=0x00;
TBSR5=Txd_data; //數據
TBSR6=0x00;
TBSR7=0x00;
TBSR8=0x00;
TBSR9=0x00;
TBSR10=0x00;
TBSR11=0x00;
TBSR12=0x00;
CMR=0x01; //命令寄存器-發送請求
}

 

*********************************************************************************

#include"reg52.h"
#include "sja1000.h"
unsigned char bdata temp;
unsigned char RX_buffer[13];
//節點接收函數
void CAN_RXD(void)
{
temp = IR;
if( temp & 0x01) //判斷是否接收中斷
{
RX_buffer[0] = RBSR; //讀取RXFIFO
RX_buffer[1] = RBSR1;
RX_buffer[2] = RBSR2;
RX_buffer[3] = RBSR3;
RX_buffer[4] = RBSR4;
RX_buffer[5] = RBSR5;
RX_buffer[6] = RBSR6;
RX_buffer[7] = RBSR7;
RX_buffer[8] = RBSR8;
RX_buffer[9] = RBSR9;
RX_buffer[10] = RBSR10;
RX_buffer[11] = RBSR11;
RX_buffer[12] = RBSR12;
CMR = 0X04; //釋放RXFIFO 中的空間
temp = ALC; //釋放仲裁隨時捕捉寄存器
temp = ECC; //釋放錯誤代碼捕捉寄存器
}
}
//單片機外部中斷1
void Ir_EX1( void ) interrupt 2
{
void CAN_RXD(void); //調用接收函數
}

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/*CAN 總線SJA1000寄存器地址定義(用的是PeliCAN 模式,擴展幀EFF 模式)*/
#define uchar unsigned char
uchar xdata MODR _at_ 0xFE00; // 模式寄存器
uchar xdata CMR _at_ 0xFE01; // 命令寄存器
uchar xdata SR _at_ 0xFE02; // 狀態寄存器
uchar xdata IR _at_ 0xFE03; // 中斷寄存器
uchar xdata IER _at_ 0xFE04; // 中斷使能寄存器
uchar xdata BTR0 _at_ 0xFE06; // 總線定時寄存器0 ;總線波特率的選擇
uchar xdata BTR1 _at_ 0xFE07; // 總線定時寄存器1 ;總線波特率的選擇
uchar xdata OCR _at_ 0xFE08; // 輸出控制寄存器
uchar xdata ACR _at_ 0xFE10;//16;
uchar xdata ACR1 _at_ 0xFE11;//17;
uchar xdata ACR2 _at_ 0xFE12;//18;
uchar xdata ACR3 _at_ 0xFE13;//19; // 接收代碼(0x16_0x19);接收過濾位選擇*復位模式
uchar xdata AMR _at_ 0xFE14;//20;
uchar xdata AMR1 _at_ 0xFE15;//21;
uchar xdata AMR2 _at_ 0xFE16;//22;
uchar xdata AMR3 _at_ 0xFE17;//23; // 掩碼(0x20_0x23); 接收過濾的選擇*復位模式
uchar xdata CDR _at_ 0xFE1F;//31; // 時鐘分頻器
uchar xdata ALC _at_ 0xFE0B;//11; // 仲裁丟失捕捉寄存器
uchar xdata ECC _at_ 0xFE0C;//12; // 誤碼捕捉寄存器

uchar xdata TBSR _at_ 0xFE10;//16; //TX 幀信息(標準幀、擴展幀)寄存器
uchar xdata TBSR1 _at_ 0xFE11;//17; //TX 幀信息(標準幀數據1、擴展幀識別碼1)寄存器
uchar xdata TBSR2 _at_ 0xFE12;//18; //TX 幀信息(標準幀數據1、擴展幀識別碼2)寄存器
uchar xdata TBSR3 _at_ 0xFE13;//19; //TX 幀信息(標準幀數據1、擴展幀識別碼3)寄存器
uchar xdata TBSR4 _at_ 0xFE14;//20; //TX 幀信息(標準幀數據2、擴展幀識別碼4)寄存器
uchar xdata TBSR5 _at_ 0xFE15;//21; //TX 幀信息(標準幀數據3、擴展幀數據1)寄存器
uchar xdata TBSR6 _at_ 0xFE16;//22; //TX 幀信息(標準幀數據4、擴展幀數據2)寄存器
uchar xdata TBSR7 _at_ 0xFE17;//23; //TX 幀信息(標準幀數據5、擴展幀數據3)寄存器
uchar xdata TBSR8 _at_ 0xFE18;//24; //TX 幀信息(標準幀數據6、擴展幀數據4)寄存器
uchar xdata TBSR9 _at_ 0xFE19;//25; //TX 幀信息(標準幀數據7、擴展幀數據5)寄存器
uchar xdata TBSR10 _at_ 0xFE1A;//26; //TX 幀信息(標準幀數據8、擴展幀數據6)寄存器
uchar xdata TBSR11 _at_ 0xFE1B;//27; //TX 幀信息(擴展幀數據7)寄存器
uchar xdata TBSR12 _at_ 0xFE1C;//28; //TX 幀信息(擴展幀數據8)寄存器


uchar xdata RBSR _at_ 0xFE10;//16; //RX 幀信息(標準幀、擴展幀)寄存器
uchar xdata RBSR1 _at_ 0xFE11;//17; //RX 識別碼(標準幀、擴展幀)寄存器1
uchar xdata RBSR2 _at_ 0xFE12;//18; //RX 幀信息(標準幀、擴展幀)識別碼2寄存器
uchar xdata RBSR3 _at_ 0xFE13;//19; //RX 幀信息(標準幀數據1、擴展幀識別碼3)寄存器
uchar xdata RBSR4 _at_ 0xFE14;//20; //RX 幀信息(標準幀數據2、擴展幀識別碼4)寄存器
uchar xdata RBSR5 _at_ 0xFE15;//21; //RX 幀信息(標準幀數據3、擴展幀數據1)寄存器
uchar xdata RBSR6 _at_ 0xFE16;//22; //RX 幀信息(標準幀數據4、擴展幀數據2)寄存器
uchar xdata RBSR7 _at_ 0xFE17;//23; //RX 幀信息(標準幀數據5、擴展幀數據3)寄存器
uchar xdata RBSR8 _at_ 0xFE18;//24; //RX 幀信息(標準幀數據6、擴展幀數據4)寄存器
uchar xdata RBSR9 _at_ 0xFE19;//25; //RX 幀信息(標準幀數據7、擴展幀數據5)寄存器
uchar xdata RBSR10 _at_ 0xFE1A;//26; //RX 幀信息(標準幀數據8、擴展幀數據6)寄存器
uchar xdata RBSR11 _at_ 0xFE1B;//27; //RX 幀信息(擴展幀數據7)寄存器
uchar xdata RBSR12 _at_ 0xFE1C;//28; //RX 幀信息(擴展幀數據8)寄存器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章