?? can_com.c
字號:
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//描述:
// CAN收發(fā)程序 &
// CAN主要參數: PeliCAN模式,擴展幀EFF模式 &
// 29位標示碼結構:
// 發(fā)送數據結構:0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88
// 接收數據結構: 每次讀取8個字節(jié)的數據
// 本節(jié)點的地址: 0x11,0x22,0x33,0x00;可以接收全部節(jié)點的數據
// 目的節(jié)點地址:0x01,0x02,0x03,0x00;可以被能接收全部節(jié)點數據的節(jié)點接收
//提示:如果CAN通訊不正常,會進入一個死循環(huán),顯示也不正常
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! &
//【聲明】 作者: PIAE小組 &
#include <reg52.h>
#include <intrins.h>
#include <can_def.h>
void CAN_RXD( void ) interrupt 2
{//接收數據函數,在中斷服務程序中調用
uchar data Judge;
EA = 0;//關CPU中斷
IE0 = 0;
Judge = IR;
if( Judge & 0x01)
{//IR.0 = 1 接收中斷
RX_buffer[0] = RBSR;
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;
RXD_flag = 1;//置有接收標志
CMR = 0X04;
Judge = ALC;//釋放仲裁隨時捕捉寄存器
Judge = ECC;//釋放錯誤代碼捕捉寄存器
}
IER = 0x01;// .0=1--接收中斷使能;
EA = 1;//打開CPU中斷
}
void main(void)
{
//CPU初始化
EA = 1;
EX1 = 1;
IT1 = 0;
//CPU初始化
CAN_init( ); //SJA1000初始化
_nop_();
_nop_();
while(1)
{
_nop_();
_nop_();
Rxd_deal();//接收處理程序
Txd_deal();//發(fā)送處理程序
}
}
//*********************處理函數********************************
void Rxd_deal(void)
{//////// 接收處理程序//////////////
//uchar data Order;
if( RXD_flag )
{
EA = 0;//關閉CPU中斷
RXD_flag = 0;
TXD_flag = 1;//要求發(fā)送處理
EA = 1;//打開CPU中斷
}
}//////// 接收處理程序//////////////
void Txd_deal(void)
{//發(fā)送處理函數,主要是準備數據,并且調用發(fā)送函數
if( TXD_flag == 1 )
{
_nop_();
TXD_flag = 0;
CAN_TXD();
_nop_();
_nop_();
}
}
//*********************處理函數********************************
//*********************CAN子函數***********************
void CAN_init( void )
{//SJA1000 的初始化
uchar bdata Judge;
uchar ACRR[4];
uchar AMRR[4];
ACRR[0] = 0x11;
ACRR[1] = 0x22;
ACRR[2] = 0x33;
ACRR[3] = 0x44;//接收代碼寄存器?
AMRR[0] = 0xff;
AMRR[1] = 0Xff;
AMRR[2] = 0xff;
AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主機發(fā)送的信息
do
{// .0=1---reset MODRe,進入復位模式,以便設置相應的寄存器
//防止未進入復位模式,重復寫入
MODR = 0x09;
Judge = MODR ;
}
while( !(Judge & 0x01) );
CDR = 0x88;// CDR.3=1--時鐘關閉, .7=0---basic CAN, .7=1---Peli CAN
BTR0 = 0x31;
BTR1 = 0x1c;//總線波特率設定
IER = 0x01;// .0=1--接收中斷使能; .1=0--關閉發(fā)送中斷使能
OCR = 0xaa;// 配置輸出控制寄存器
CMR = 0x04;//釋放接收緩沖器
ACR = ACRR[0];
ACR1 = ACRR[1];
ACR2 = ACRR[2];
ACR3 = ACRR[3];//初始化標示碼
AMR = AMRR[0];
AMR1 = AMRR[1];
AMR2 = AMRR[2];
AMR3 = AMRR[3];//初始化掩碼
do
{//確保退出復位模式
MODR = 0x08;
Judge = MODR ;
}
while( Judge & 0x01 );
}//SJA1000 的初始化
void CAN_TXD( void )
{
uchar data Judge;
uchar data TX_buffer[ N_can ] ;
//初始化標示碼頭信息
TX_buffer[0] = 0x88;//.7=0擴展幀;.6=0數據幀; .3=1數據長度
TX_buffer[1] = 0x01;//本節(jié)點地址
TX_buffer[2] = 0x02;//
TX_buffer[3] = 0x03;//
TX_buffer[4] = 0x00;//
//初始化標示碼頭信息
//初始化發(fā)送數據單元
TX_buffer[5] = 0x11;
TX_buffer[6] = 0x22;
TX_buffer[7] = 0x33;
TX_buffer[8] = 0x44;//
TX_buffer[9] = 0x55;//
TX_buffer[10] = 0x66;//
TX_buffer[11] = 0x77;//
TX_buffer[12] = 0x88;//
//初始化數據信息
EA = 0; //關中斷
do
{
Judge = SR;
LED_RED = 0;//
}
while( Judge & 0x10 ); //SR.4=1 正在接收,等待
do
{
Judge = SR;
LED_RED = 0;//
}
while(!(Judge & 0x08)); //SR.3=0,發(fā)送請求未處理完,等待
{
Judge = SR;
LED_RED = 0;//
}
do
{
Judge = SR;
LED_RED = 0;//
}
while(!(Judge & 0x04)); //SR.2=0,發(fā)送緩沖器被鎖。等待
LED_RED = 1;
LED_GRE = 0;//如果初始化成功,綠燈亮,紅燈滅;否則,綠燈滅,紅燈亮
TBSR = TX_buffer[0];
TBSR1 = TX_buffer[1];
TBSR2 = TX_buffer[2];
TBSR3 = TX_buffer[3];
TBSR4 = TX_buffer[4];
TBSR5 = TX_buffer[5];
TBSR6 = TX_buffer[6];
TBSR7 = TX_buffer[7];
TBSR8 = TX_buffer[8];
TBSR9 = TX_buffer[9];
TBSR10 = TX_buffer[10];
TBSR11 = TX_buffer[11];
TBSR12 = TX_buffer[12];
CMR = 0x01;//置位發(fā)送請求
EA = 1;
}
//*********************CAN子函數*************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -