📄 can_com.lst
字号:
C51 COMPILER V7.06 CAN_COM 12/02/2007 20:25:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CAN_COM
OBJECT MODULE PLACED IN E:\制作和~1\总线开发\实验程序\CAN_LAB\CAN_EASY\CAN_COM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\制作和~1\总线开发\实验程序\CAN_LAB\CAN_EASY\CAN_COM.C DB SB OE
stmt level source
1
2
3 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4 //描述:
5 // CAN收发程序 &
6 // CAN主要参数: PeliCAN模式,扩展帧EFF模式 &
7 // 29位标示码结构:
8 // 发送数据结构:0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88
9 // 接收数据结构: 每次读取8个字节的数据
10 // 本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据
11 // 目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收
12
13 //提示:如果CAN通讯不正常,会进入一个死循环,显示也不正常
14
15 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
16 //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! &
17 //【声明】 作者: PIAE小组 &
18
19 #include <reg52.h>
20 #include <intrins.h>
21 #include <can_def.h>
22
23 void CAN_RXD( void ) interrupt 2
24 {//接收数据函数,在中断服务程序中调用
25 1
26 1 uchar data Judge;
27 1 EA = 0;//关CPU中断
28 1 IE0 = 0;
29 1
30 1 Judge = IR;
31 1 if( Judge & 0x01)
32 1 {//IR.0 = 1 接收中断
33 2 RX_buffer[0] = RBSR;
34 2 RX_buffer[1] = RBSR1;
35 2 RX_buffer[2] = RBSR2;
36 2 RX_buffer[3] = RBSR3;
37 2 RX_buffer[4] = RBSR4;
38 2 RX_buffer[5] = RBSR5;
39 2 RX_buffer[6] = RBSR6;
40 2 RX_buffer[7] = RBSR7;
41 2 RX_buffer[8] = RBSR8;
42 2 RX_buffer[9] = RBSR9;
43 2 RX_buffer[10] = RBSR10;
44 2 RX_buffer[11] = RBSR11;
45 2 RX_buffer[12] = RBSR12;
46 2 RXD_flag = 1;//置有接收标志
47 2 CMR = 0X04;
48 2 Judge = ALC;//释放仲裁随时捕捉寄存器
49 2 Judge = ECC;//释放错误代码捕捉寄存器
50 2 }
51 1 IER = 0x01;// .0=1--接收中断使能;
52 1 EA = 1;//打开CPU中断
53 1 }
54
55 void main(void)
C51 COMPILER V7.06 CAN_COM 12/02/2007 20:25:42 PAGE 2
56 {
57 1 //CPU初始化
58 1 EA = 1;
59 1 EX1 = 1;
60 1 IT1 = 0;
61 1 //CPU初始化
62 1
63 1 CAN_init( ); //SJA1000初始化
64 1 _nop_();
65 1 _nop_();
66 1 while(1)
67 1 {
68 2 _nop_();
69 2 _nop_();
70 2 Rxd_deal();//接收处理程序
71 2 Txd_deal();//发送处理程序
72 2
73 2 }
74 1
75 1 }
76
77
78 //*********************处理函数********************************
79
80
81 void Rxd_deal(void)
82 {//////// 接收处理程序//////////////
83 1 //uchar data Order;
84 1 if( RXD_flag )
85 1 {
86 2 EA = 0;//关闭CPU中断
87 2 RXD_flag = 0;
88 2 TXD_flag = 1;//要求发送处理
89 2 EA = 1;//打开CPU中断
90 2 }
91 1 }//////// 接收处理程序//////////////
92
93 void Txd_deal(void)
94 {//发送处理函数,主要是准备数据,并且调用发送函数
95 1 if( TXD_flag == 1 )
96 1 {
97 2 _nop_();
98 2 TXD_flag = 0;
99 2 TX_buffer[5] = 0x00;//
100 2 CAN_TXD();
101 2 _nop_();
102 2 _nop_();
103 2 }
104 1 }
105
106 //*********************处理函数********************************
107
108
109 //*********************CAN子函数***********************
110
111 void CAN_init( void )
112 {//SJA1000 的初始化
113 1 uchar bdata Judge;
114 1 uchar ACRR[4];
115 1 uchar AMRR[4];
116 1 ACRR[0] = 0x11;
117 1 ACRR[1] = 0x22;
C51 COMPILER V7.06 CAN_COM 12/02/2007 20:25:42 PAGE 3
118 1 ACRR[2] = 0x33;
119 1 ACRR[3] = 0x44;//接收代码寄存器?
120 1 AMRR[0] = 0xff;
121 1 AMRR[1] = 0Xff;
122 1 AMRR[2] = 0xff;
123 1 AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
124 1 do
125 1 {// .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
126 2 //防止未进入复位模式,重复写入
127 2 MODR = 0x09;
128 2 Judge = MODR ;
129 2 }
130 1 while( !(Judge & 0x01) );
131 1 CDR = 0x88;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
132 1 BTR0 = 0x31;
133 1 BTR1 = 0x1c;//总线波特率设定
134 1 IER = 0x01;// .0=1--接收中断使能; .1=0--关闭发送中断使能
135 1 OCR = 0xaa;// 配置输出控制寄存器
136 1 CMR = 0x04;//释放接收缓冲器
137 1
138 1
139 1
140 1 ACR = ACRR[0];
141 1 ACR1 = ACRR[1];
142 1 ACR2 = ACRR[2];
143 1 ACR3 = ACRR[3];//初始化标示码
144 1
145 1 AMR = AMRR[0];
146 1 AMR1 = AMRR[1];
147 1 AMR2 = AMRR[2];
148 1 AMR3 = AMRR[3];//初始化掩码
149 1 do
150 1 {//确保退出复位模式
151 2 MODR = 0x08;
152 2 Judge = MODR ;
153 2 }
154 1 while( Judge & 0x01 );
155 1
156 1
157 1 }//SJA1000 的初始化
158
159
160 void CAN_TXD( void )
161 {
162 1 uchar data Judge;
163 1 uchar data TX_buffer[ N_can ] ;
164 1
165 1 //初始化标示码头信息
166 1 TX_buffer[0] = 0x88;//.7=0扩展帧;.6=0数据帧; .3=1数据长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -