📄 sja_basiccan.lst
字号:
201 1 Sja_BasicCan = REG_ACR; //访问地址指向验收代码寄存器(ACR)
202 1 *Sja_BasicCan = BCAN_ACR; //写入参数
203 1 if ( *Sja_BasicCan != BCAN_ACR ) //校验写入值
204 1 {
205 2 return 1;
206 2 }
207 1
208 1 Sja_BasicCan = REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
209 1 *Sja_BasicCan = BCAN_AMR; //写入参数
210 1 if ( *Sja_BasicCan != BCAN_AMR ) //校验写入值
211 1 {
212 2 return 1;
213 2 }
214 1
215 1 return 0;
216 1 }
217
218 /************************************************************************
219 ;*函数原型: bit BCan_Set_Outclk (unsigned char BCAN_OCR, *
220 unsigned char BCAN_CDR); *
221 ;*参数说明: *
222 * BCAN_OCR: 存放输出控制寄存器 (OC) 的参数设置 *
223 * BCAN_CDR: 存放时钟分频寄存器 (CDR) 的参数设置 *
224 * *
225 ;*返回值: *
226 ;* 0 ;设置成功 *
227 ;* 1 ;设置失败 *
228 ;* *
229 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
230 ;************************************************************************/
231 bit BCan_Set_Outclk (unsigned char BCAN_OCR,
232 unsigned char BCAN_CDR)
233 {
234 1 Sja_BasicCan = REG_OCR ; //访问地址指向输出控制寄存器
235 1 *Sja_BasicCan = BCAN_OCR; //写入参数
236 1 if ( *Sja_BasicCan != BCAN_OCR ) //校验写入值
237 1 {
238 2 return 1;
239 2 }
240 1
241 1 Sja_BasicCan = REG_CDR; //访问地址指向输出控制寄存器
C51 COMPILER V7.06 SJA_BASICCAN 05/11/2006 15:34:24 PAGE 5
242 1 *Sja_BasicCan = BCAN_CDR; //写入参数
243 1 return 0;
244 1 }
245
246 /************************************************************************
247 *函数原型: bit BCan_Data_Send(unsigned char *SendDataBuf) *
248 *参数说明: 特定帧各式的数据 *
249 *返回值: *
250 * 0 ; 表示将数据成功的送至发送缓冲区 *
251 * 1 ; 表示上一次的数据正在发送, *
252 * ; 表示发送缓冲区被锁定,不能写入数据 *
253 * ; 表示写入数据错误 *
254 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
255 * SJA1000发送。 *
256 * 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
257 * 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
258 * *
259 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
260 * 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
261 ************************************************************************/
262 bit BCan_Data_Send(unsigned char *SendDataBuf)
263 {
264 1 unsigned char TempCount;
265 1 Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
266 1 if ( (*Sja_BasicCan&0x08) == 0 ) //判断上次发送是否完成
267 1 {
268 2 return 1;
269 2 }
270 1
271 1 if( (*Sja_BasicCan&0x04) == 0 ) //判断发送缓冲区是否锁定
272 1 {
273 2 return 1;
274 2 }
275 1
276 1 Sja_BasicCan = REG_TxBuffer1; //访问地址指向发送缓冲区1
277 1 if ( (SendDataBuf[1]&0x10) == 0 ) //判断RTR,从而得出是数据帧还是远程帧
278 1 {
279 2 //输入数据帧
280 2 TempCount = ( ((SendDataBuf[1]&0x0f) > 8) ? 8 : TempCount ) + 2;
281 2 }
282 1 else
283 1 {
284 2 TempCount = 2; //远程帧
285 2 }
286 1
287 1 memcpy(Sja_BasicCan, SendDataBuf, TempCount);
288 1 return 0;
289 1 }
290
291 /************************************************************************
292 *函数原型: bit BCan_Data_Recv (unsigned char *RcvDataBuf, *
293 * unsigned char *ucBufLen) *
294 *参数说明: RcvDataBuf, 存放微处理器保存数据缓冲区 *
295 *返回值: 0; 接收成功 *
296 * 1; 接收失败 *
297 *说明: CAN控制器接收数据,仅限于接收数据 *
298 ************************************************************************/
299 bit BCan_Data_Recv(unsigned char *RcvDataBuf, unsigned char *ucBufLen)
300 {
301 1 Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
302 1 if ( (*Sja_BasicCan&0x01) == 0 ) //判断报文是否有效
303 1 {
C51 COMPILER V7.06 SJA_BASICCAN 05/11/2006 15:34:24 PAGE 6
304 2 *ucBufLen = 0;
305 2 return 1;
306 2 }
307 1
308 1 Sja_BasicCan = REG_RxBuffer2; //访问地址指向接收缓冲区2
309 1 if ( (*Sja_BasicCan&0x10) == 0 ) //如果是数据帧
310 1 {
311 2 *ucBufLen = (*Sja_BasicCan&0x0f) + 2; //计算报文中数据的个数
312 2 }
313 1 else
314 1 {
315 2 *ucBufLen = 2;
316 2 }
317 1 Sja_BasicCan = REG_RxBuffer1; //访问地址指向接收缓冲区1
318 1 memcpy(RcvDataBuf, Sja_BasicCan, *ucBufLen ); //读取接收缓冲区的报文
319 1
320 1 return 0;
321 1 }
322
323 /************************************************************************
324 *函数原型: bit BCan_Cmd_Prg(unsigned char cmd) *
325 *参数说明: unsigned char cmd: sja1000运行的命令字 *
326 * 0x01: 发送请求 *
327 * 0x02: 中止发送 *
328 * 0x04: 释放接收缓冲区 *
329 * 0x08: 清除超载状态 *
330 * 0x10: 进入睡眠状态 *
331 * *
332 *返回值: *
333 * 0 ; 表示命令执行成功 *
334 * 1 ; 表示命令执行失败 *
335 * *
336 *说明: 执行sja1000命令 *
337 ************************************************************************/
338 bit BCan_Cmd_Prg(unsigned char cmd)
339 {
340 1 Sja_BasicCan = REG_COMMAND; //访问地址指向命令寄存器
341 1 *Sja_BasicCan = cmd; //启动命令字
342 1 switch ( cmd )
343 1 {
344 2 case CMD_SEND: //发送请求命令
345 2 return 0;
346 2 break;
347 2
348 2 case CMD_ABORT_SEND: //夭折发送命令
349 2 Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
350 2 if ( (*Sja_BasicCan & 0x20) ==0 )//判断是否正在发送
351 2 {
352 3 return 0;
353 3 }
354 2 else
355 2 {
356 3 return 1;
357 3 }
358 2 break;
359 2
360 2 case CMD_RELEASE_RXBUFF: //释放接收缓冲区
361 2 Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
362 2 if ( (*Sja_BasicCan & 0x01) == 1 )//判断是否释放成功
363 2 {
364 3 return 1;
365 3 }
C51 COMPILER V7.06 SJA_BASICCAN 05/11/2006 15:34:24 PAGE 7
366 2 else
367 2 {
368 3 return 0;
369 3 }
370 2 break;
371 2
372 2 case CMD_CLEAR_OVER_STAT: //清除超载状态
373 2 Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
374 2 if((*Sja_BasicCan & 0x02) == 0 ) //判断清除超载是否成功
375 2 {
376 3 return 0;
377 3 }
378 2 else
379 2 {
380 3 return 1;
381 3 }
382 2 break;
383 2
384 2 case CMD_GOTO_SLEEP: //进入睡眠状态命令
385 2 return 0;
386 2 break;
387 2
388 2 default:
389 2 return 1;
390 2 break;
391 2 }
392 1 }
393
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 772 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- 7
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -