?? can_com.lst
字號:
C51 COMPILER V7.06 CAN_COM 04/13/2008 20:32:50 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CAN_COM
OBJECT MODULE PLACED IN D:\VW\MY_PRO~1\CAB_BU~1\CAN_LAB\CAN_EASY\CAN_COM.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE D:\VW\MY_PRO~1\CAB_BU~1\CAN_LAB\CAN_EASY\CAN_COM.C DB SB OE
stmt level source
1
2 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3 //描述:
4 // CAN收發程序 &
5 // CAN主要參數: PeliCAN模式,擴展幀EFF模式 &
6 // 29位標示碼結構:
7 // 發送數據結構:0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88
8 // 接收數據結構: 每次讀取8個字節的數據
9 // 本節點的地址: 0x11,0x22,0x33,0x00;可以接收全部節點的數據
10 // 目的節點地址:0x01,0x02,0x03,0x00;可以被能接收全部節點數據的節點接收
11
12 //提示:如果CAN通訊不正常,會進入一個死循環,顯示也不正常
13
14 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
15 //【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! &
16 //【聲明】 作者: PIAE小組 &
17
18 #include <reg52.h>
19 #include <intrins.h>
20 #include <can_def.h>
21
22 void CAN_RXD( void ) interrupt 2
23 {//接收數據函數,在中斷服務程序中調用
24 1
25 1 uchar data Judge;
26 1 EA = 0;//關CPU中斷
27 1 IE0 = 0;
28 1
29 1 Judge = IR;
30 1 if( Judge & 0x01)
31 1 {//IR.0 = 1 接收中斷
32 2 RX_buffer[0] = RBSR;
33 2 RX_buffer[1] = RBSR1;
34 2 RX_buffer[2] = RBSR2;
35 2 RX_buffer[3] = RBSR3;
36 2 RX_buffer[4] = RBSR4;
37 2 RX_buffer[5] = RBSR5;
38 2 RX_buffer[6] = RBSR6;
39 2 RX_buffer[7] = RBSR7;
40 2 RX_buffer[8] = RBSR8;
41 2 RX_buffer[9] = RBSR9;
42 2 RX_buffer[10] = RBSR10;
43 2 RX_buffer[11] = RBSR11;
44 2 RX_buffer[12] = RBSR12;
45 2 RXD_flag = 1;//置有接收標志
46 2 CMR = 0X04;
47 2 Judge = ALC;//釋放仲裁隨時捕捉寄存器
48 2 Judge = ECC;//釋放錯誤代碼捕捉寄存器
49 2 }
50 1 IER = 0x01;// .0=1--接收中斷使能;
51 1 EA = 1;//打開CPU中斷
52 1 }
53
54 void main(void)
55 {
C51 COMPILER V7.06 CAN_COM 04/13/2008 20:32:50 PAGE 2
56 1 //CPU初始化
57 1 EA = 1;
58 1 EX1 = 1;
59 1 IT1 = 0;
60 1 //CPU初始化
61 1
62 1 CAN_init( ); //SJA1000初始化
63 1 _nop_();
64 1 _nop_();
65 1 while(1)
66 1 {
67 2 _nop_();
68 2 _nop_();
69 2 Rxd_deal();//接收處理程序
70 2 Txd_deal();//發送處理程序
71 2 }
72 1
73 1 }
74
75
76 //*********************處理函數********************************
77
78 void Rxd_deal(void)
79 {//////// 接收處理程序//////////////
80 1 //uchar data Order;
81 1 if( RXD_flag )
82 1 {
83 2 EA = 0;//關閉CPU中斷
84 2 RXD_flag = 0;
85 2 TXD_flag = 1;//要求發送處理
86 2 EA = 1;//打開CPU中斷
87 2 }
88 1 }//////// 接收處理程序//////////////
89
90 void Txd_deal(void)
91 {//發送處理函數,主要是準備數據,并且調用發送函數
92 1 if( TXD_flag == 1 )
93 1 {
94 2 _nop_();
95 2 TXD_flag = 0;
96 2 CAN_TXD();
97 2 _nop_();
98 2 _nop_();
99 2 }
100 1 }
101
102 //*********************處理函數********************************
103
104
105 //*********************CAN子函數***********************
106
107 void CAN_init( void )
108 {//SJA1000 的初始化
109 1 uchar bdata Judge;
110 1 uchar ACRR[4];
111 1 uchar AMRR[4];
112 1 ACRR[0] = 0x11;
113 1 ACRR[1] = 0x22;
114 1 ACRR[2] = 0x33;
115 1 ACRR[3] = 0x44;//接收代碼寄存器?
116 1 AMRR[0] = 0xff;
117 1 AMRR[1] = 0Xff;
C51 COMPILER V7.06 CAN_COM 04/13/2008 20:32:50 PAGE 3
118 1 AMRR[2] = 0xff;
119 1 AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主機發送的信息
120 1 do
121 1 {// .0=1---reset MODRe,進入復位模式,以便設置相應的寄存器
122 2 //防止未進入復位模式,重復寫入
123 2 MODR = 0x09;
124 2 Judge = MODR ;
125 2 }
126 1 while( !(Judge & 0x01) );
127 1 CDR = 0x88;// CDR.3=1--時鐘關閉, .7=0---basic CAN, .7=1---Peli CAN
128 1 BTR0 = 0x31;
129 1 BTR1 = 0x1c;//總線波特率設定
130 1 IER = 0x01;// .0=1--接收中斷使能; .1=0--關閉發送中斷使能
131 1 OCR = 0xaa;// 配置輸出控制寄存器
132 1 CMR = 0x04;//釋放接收緩沖器
133 1
134 1 ACR = ACRR[0];
135 1 ACR1 = ACRR[1];
136 1 ACR2 = ACRR[2];
137 1 ACR3 = ACRR[3];//初始化標示碼
138 1
139 1 AMR = AMRR[0];
140 1 AMR1 = AMRR[1];
141 1 AMR2 = AMRR[2];
142 1 AMR3 = AMRR[3];//初始化掩碼
143 1 do
144 1 {//確保退出復位模式
145 2 MODR = 0x08;
146 2 Judge = MODR ;
147 2 }
148 1 while( Judge & 0x01 );
149 1
150 1
151 1 }//SJA1000 的初始化
152
153
154 void CAN_TXD( void )
155 {
156 1 uchar data Judge;
157 1 uchar data TX_buffer[ N_can ] ;
158 1
159 1 //初始化標示碼頭信息
160 1 TX_buffer[0] = 0x88;//.7=0擴展幀;.6=0數據幀; .3=1數據長度
161 1 TX_buffer[1] = 0x01;//本節點地址
162 1 TX_buffer[2] = 0x02;//
163 1 TX_buffer[3] = 0x03;//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -