📄 can_gps.lst
字号:
237 1 {
238 2 return 1;
239 2 }
240 1
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 5
241 1 return 0;
242 1 }
243
244
245 /************************************************************************
246 ;*函数原型: BCAN_SET_OBJECT *
247 *参数说明: *
248 * BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
249 * BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
250 ;*返回值: *
251 ;* 0 ;通信对象设置成功 *
252 ;* 1 ;通信对象设置失败 *
253 ;* *
254 ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
255 ;* 允许接收的报文,是由AMR和ACR共同决定的. *
256 ;* 满足以下条件的ID号的报文才可以被接收 *
257 ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
258 ;* 该子程序只能用于复位模式 *
- *
259 ;************************************************************************/
260 bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
261 {
262 1 SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
263 1 *SJA_BCANAdr=BCAN_ACR; //写入参数
264 1 if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
265 1 {
266 2 return 1;
267 2 }
268 1 SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
269 1 *SJA_BCANAdr=BCAN_AMR; //写入参数
270 1 if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
271 1 {
272 2 return 1;
273 2 }
274 1
275 1 return 0;
276 1 }
277
278 /************************************************************************
279 ;*函数原型: bit BCAN_SET_OUTCLK (unsigned char Out_Control, *
280 unsigned char Clock_Out); *
281 ;*参数说明: *
282 * Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
283 * Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
284 * *
285 ;*返回值: *
286 ;* 0 ;设置成功 *
287 ;* 1 ;设置失败 *
288 ;* *
289 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
- *
290 ;************************************************************************/
291 bit BCAN_SET_OUTCLK (unsigned char Out_Control,
292 unsigned char Clock_Out)
293 {
294 1 SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
295 1 *SJA_BCANAdr=Out_Control; //写入参数
296 1 if(*SJA_BCANAdr != Out_Control) //校验写入值
297 1 {
298 2 return 1;
299 2 }
300 1 SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 6
301 1 *SJA_BCANAdr=Clock_Out; //写入参数
302 1 return 0;
303 1 }
304 /************************************************************************
305 *函数原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
306 *参数说明: 特定帧各式的数据? *
307 *返回值: *
308 * 0 ; 表示将数据成功的送至发送缓冲区 *
309 * 1 ; 表示上一次的数据正在发送, *
310 * ; 表示发送缓冲区被锁定,不能写入数据 *
311 * ; 表示写入数据错误 *
312 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
313 * SJA1000发送。 *
314 * 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
315 * 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
316 * *
317 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
318 * 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
319 ************************************************************************/
320 bit BCAN_DATA_WRITE(unsigned char data *SendDataBuf)
321 {
322 1 unsigned char TempCount;
323 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
324 1 if((*SJA_BCANAdr&0x08) == 0) //判断上次发送是否完成
325 1 {
326 2 return 1;
327 2 }
328 1
329 1 if((*SJA_BCANAdr&0x04)==0) //判断发送缓冲区是否锁定
330 1 {
331 2 return 1;
332 2 }
333 1
334 1 SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区1
335 1 if((SendDataBuf[1]&0x10)==0) //判断RTR,从而得出是数据帧还是远程帧
336 1 {
337 2 TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
338 2 }
339 1
340 1 else
341 1 {
342 2 TempCount =2; //远程帧
343 2 }
344 1
345 1 memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
346 1 return 0;
347 1 }
348
349 /************************************************************************
350 *函数原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
351 *参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
352 *返回值: 0;接收成功 *
353 * 1;接收失败 *
354 *说明:CAN控制器接收数据,仅限于接收数据 *
355 ************************************************************************/
356 bit BCAN_DATA_RECEIVE(uchar data *RvcDataBuf)
357 {
358 1 uchar TempCount;
359 1 RvcDataBuf++;
360 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
361 1 if((*SJA_BCANAdr&0x01)==0) //判断报文是否有效
362 1 {
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 7
363 2 return 1;
364 2 }
365 1
366 1 SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区2
367 1 if((*SJA_BCANAdr&0x10)==0) //如果是数据帧
368 1 {
369 2 TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
370 2 }
371 1
372 1 else
373 1 {
374 2 TempCount=2;
375 2 }
376 1 SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
377 1 SystemBuf[0]=*SJA_BCANAdr;
378 1 SJA_BCANAdr = REG_RxBuffer2;
379 1 SystemBuf[1]=*SJA_BCANAdr;
380 1 SJA_BCANAdr = REG_RxBuffer3;
381 1 SystemBuf[2]=*SJA_BCANAdr;
382 1 SJA_BCANAdr = REG_RxBuffer4;
383 1 SystemBuf[3]=*SJA_BCANAdr;
384 1 SJA_BCANAdr = REG_RxBuffer5;
385 1 SystemBuf[4]=*SJA_BCANAdr;
386 1 SJA_BCANAdr = REG_RxBuffer6;
387 1 SystemBuf[5]=*SJA_BCANAdr;
388 1 SJA_BCANAdr = REG_RxBuffer7;
389 1 SystemBuf[6]=*SJA_BCANAdr;
390 1 SJA_BCANAdr = REG_RxBuffer8;
391 1 SystemBuf[7]=*SJA_BCANAdr;
392 1 SJA_BCANAdr = REG_RxBuffer9;
393 1 SystemBuf[8]=*SJA_BCANAdr;
394 1 SJA_BCANAdr = REG_RxBuffer10;
395 1 SystemBuf[9]=*SJA_BCANAdr;
396 1 //memcpy(RvcDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文???????????????????
397 1 return 0;
398 1 }
399 /************************************************************************
400 *函数原型: bit BCAN_CMD_PRG(unsigned char cmd) *
401 *参数说明: cmd:sja1000运行的命令字 *
402 * 01:发送请求 *
403 * 02:中止发送 *
404 * 04:释放接收缓冲区 *
405 * 08:清除超载状态 *
406 * 0x10:进入睡眠状态 *
407 * *
408 *返回值: *
409 * 0 ; 表示命令执行成功 *
410 * 1 ; 表示命令执行失败 *
411 * *
412 *说明: 执行sja1000命令 *
413 ************************************************************************/
414 bit BCAN_CMD_PRG(unsigned char cmd)
415 {
416 1 SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
417 1 *SJA_BCANAdr=cmd; //启动命令字
418 1 switch(cmd)
419 1 {
420 2 case TR_CMD: //发送请求命令
421 2 return 0;
422 2 break;
423 2 case AT_CMD: //中止发送命令
424 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
C51 COMPILER V8.05a CAN_GPS 06/20/2008 15:11:44 PAGE 8
425 2 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
426 2 {
427 3 return 0;
428 3 }
429 2 else
430 2 {
431 3 return 1;
432 3 }
433 2 break;
434 2 case RRB_CMD: //释放接收缓冲区
435 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
436 2 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
437 2 {
438 3 return 1;
439 3 }
440 2 else
441 2 {
442 3 return 0;
443 3 }
444 2 break;
445 2
446 2 case COS_CMD: //清除超载状态
447 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
448 2 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
449 2 {
450 3 return 0;
451 3 }
452 2 else
453 2 {
454 3 return 1;
455 3 }
456 2 break;
457 2
458 2 case GTS_CMD: //进入睡眠状态命令
459 2 return 0;
460 2 break;
461 2 default:
462 2 return 1;
463 2 break;
464 2 }
465 1
466 1 }
467 /************************************************************************
468 *函数原型: void InitialCAN() *
469 *参数说明: *
470 * *
471 *返回值: *
472 *说明: 初始化Can总线 *
473 ************************************************************************/
474 void InitialCAN()
475 {
476 1 SJA_reset=0;
477 1 delay(100);
478 1 SJA_reset=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -