canjishou.lst
来自「这是我前一段开发CAN总线通讯时编写的CAN测试程序」· LST 代码 · 共 372 行 · 第 1/2 页
LST
372 行
169 1 *SJA_CS_Point =(*SJA_CS_Point|Value);
170 1 _nop_();
171 1 _nop_();
172 1 if(*SJA_CS_Point ==(*SJA_CS_Point|Value))
173 1 {
174 2 return 0;
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 4
175 2 }
176 1 else
177 1 {
178 2 return 1;
179 2 }
180 1
181 1 }
182 /*------------------------------------------------------------------------------------------------------
---
183 ** 函数原型: WriteSJAReg(unsigned char RegAdr,unsigned char Value)
184 ** 功能描述: 该函数用于将指定的数值写入sja1000的指定的寄存器
185 ** 参数说明: RegAdr 要读的sja1000的内部寄存器地址
186 ** Value 写入寄存器的值
187 ** 返回值: 1 写入正确
188 ** 0 写入不正确
189 适合于向内部寄存器中某存储单元写数据。写入的是一个字节
190 /*------------------------------------------------------------------------------------------------------*/
191 bit WriteSJARegByte(unsigned char RegAdr,unsigned char Value)
192 {
193 1
194 1 SJA_CS_Point = CAN_SJA_BaseAdr+RegAdr; //
195 1 *SJA_CS_Point =Value;
196 1 _nop_();
197 1 _nop_();
198 1 if(*SJA_CS_Point ==Value)
199 1 {
200 2 return 0;
201 2 }
202 1 else
203 1 {
204 2 return 1;
205 2 }
206 1
207 1 }
208
209 /*串口发送子程序
210 void Comout(unsigned char OutData)
211 {
212 EA=0;
213 SBUF = OutData; //输出字符
214 while(!TI); //空语句判断字符是否发完
215 TI = 0; //清TI
216 EA=1;
217 } */
218
219 /*----------------------------------------------------------------------------------------------------
-----
220 ** 函数原型: void SJA1000_Config_Normal(void)
221 ** 功能描述: 对SJA1000的正常模式的初始化配置
222 ** 参数说明: 无
223 ** 返回值: 无
224 /*------------------------------------------------------------------------------------------------------*/
-
225 void SJA1000_Config_Normal(void) //正常模式的初始化
226 { bit SJAReg_bz=1;
227 1 BTR0=0x01;
228 1 BTR1=0x1c; //设置为250kb波特率通信
229 1
230 1 while(SJAReg_bz)
231 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0xaa);} //测试接口
232 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_TEST;
233 1 //Comout(*SJA_CS_Point);
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 5
234 1 SJAReg_bz=1;
235 1 while(SJAReg_bz)
236 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0x55);}
237 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_TEST;
238 1 //Comout(*SJA_CS_Point);
239 1 SJAReg_bz=1;
240 1 while(SJAReg_bz)
241 1 {SJAReg_bz=SJAEntryResetMode();} //进入复位模式
242 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_MOD;
243 1 //Comout(*SJA_CS_Point);
244 1 WriteSJARegByte(REG_CAN_CDR,0xc8); //配置时钟分频寄存器,选择PeliCAN模式
245 1 SJAReg_bz=1;
246 1 while(SJAReg_bz)
247 1 {SJAReg_bz=WriteSJAReg(REG_CAN_MOD,0x01);} //配置模式寄存器,选择双滤波、正常模式
248 1 WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器
249 1 SJAReg_bz=1;
250 1 while(SJAReg_bz)
251 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR0,BTR0);} //配置总线定时器0
252 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_BTR0;
253 1 // Comout(*SJA_CS_Point);
254 1 SJAReg_bz=1;
255 1 while(SJAReg_bz)
256 1 {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR1,BTR1);} //配置总线定时器1
257 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_BTR1;
258 1 // Comout(*SJA_CS_Point);
259 1 WriteSJARegByte(REG_CAN_OCR,0x1a); //配置输出管脚
260 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_OCR;
261 1 // Comout(*SJA_CS_Point);
262 1 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_TXERR; //清发送错误计数寄存器.
263 1 *SJA_CS_Point = 0;
264 1 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_ECC; // 错误代码捕捉寄存器
265 1 TIME_counter = *SJA_CS_Point;
266 1 TIME_counter=0; //清除错误代码捕捉寄存器
267 1 SJAReg_bz=1;
268 1 while(SJAReg_bz)
269 1 {SJAReg_bz=SJAQuitResetMode();} //退出复位模式,进入工作模式
270 1 //SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_MOD;
271 1 // Comout(*SJA_CS_Point);
272 1 }
273 /*------------------------------------------------------------------------------------------------------*/
274
275 /*------------------------------------------------------------------------------------------------------*/
276
277
278 main()
279 {
280 1
281 1 //CKCON=0x04;
282 1 IP=1;
283 1 IPH=1;
284 1 TMOD=0x21; // 定时器T0为方式1,T1为方式2
285 1 TH0=0x00;
286 1 TL0=0x00; //定时器0设置,暂时先开开,可能用不上
287 1 TR0=1;
288 1 ET0=1;
289 1 TH1=0x00;
290 1 TL1=0x00; //定时器1设置,暂时先开开,可能用不上
291 1 TR1=1;
292 1 ET1=1;
293 1 RCLK=1;
294 1 TCLK=1; //定时器2用作波特率发生器 T2CON中的值
295 1 RCAP2H=0xff;
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 6
296 1 //RCAP2L=0xB8; //初步设定波特率为9600
297 1 RCAP2L=0xDC; //初步设定波特率为19200
298 1 //RCAP2L=0xEE; //jiabei
299 1
300 1 SCON=0x50; //串口方式为模式1,无校验,定时器2产生波特率
301 1 TR2=1; //开定时器2
302 1 //ET2=1; //使能定时器2
303 1 IT0=1; // 负边缘触发
304 1 //EX0=1; //外部中断使能
305 1 ES=1; //使能串口
306 1 // EA=1;
307 1 CS_SJA1000=0;//开片选信号
308 1 _nop_();
309 1 _nop_();
310 1 _nop_();
311 1 _nop_();
312 1 _nop_();
313 1 _nop_();
314 1 // SJA_CS_Point=CAN_SJA_BaseAdr; //确定基址指针的值
315 1 SJA1000_HardwareRst();
316 1 SJA1000_Config_Normal(); //调用SJA1000初始化配置函数
317 1 //WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000jieshou中断
318 1 EX0=1; //打开INT0中断
319 1 EA=1;
320 1
321 1 while (1)
322 1 {
323 2
324 2 //使能MCU总中断
325 2 /*if( CAN_INT_bz==1)
326 2 {
327 2 unsigned char j;
328 2 //EA=0;
329 2 CAN_INT_bz=0;
330 2 LED0=!LED0;
331 2 for(j=0;j<13;j++)
332 2 {
333 2 Comout(Rev_CAN_data[j]);
334 2 Rev_CAN_data[j]=0;
335 2 }
336 2 //EA=1;
337 2 }*/
338 2 if(counter>=1)
339 2 {
340 3 counter=0;
341 3 Rev_COM_data[7]++;
342 3 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_SR;
343 3 if((*SJA_CS_Point&0x04) == TBS_BIT)
344 3 { unsigned char j;
345 4 for(j=0;j<13;j++) //开始将接收到的TempData个字节的数据存到CPU的数
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?