📄 sja_bcanfunc.lst
字号:
200 ;* 该子程序只能用于复位模式 *
- *
201 ;************************************************************************/
202 bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
203 {
204 1 SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
205 1 *SJA_BCANAdr=BCAN_ACR; //写入参数
206 1 if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
207 1 {
208 2 return 1;
209 2 }
210 1 SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
211 1 *SJA_BCANAdr=BCAN_AMR; //写入参数
212 1 if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
213 1 {
214 2 return 1;
215 2 }
216 1
217 1 return 0;
218 1 }
219
220 /************************************************************************
221 ;*函数原型: bit BCAN_SET_OUTCLK (unsigned char Out_Control, *
222 unsigned char Clock_Out); *
223 ;*参数说明: *
224 * Out_Control:存放输出控制寄存器 (OCR) 的参数设置 *
225 * Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
226 * *
227 ;*返回值: *
228 ;* 0 ;设置成功 *
229 ;* 1 ;设置失败 *
230 ;* *
231 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
- *
232 ;************************************************************************/
233 bit BCAN_SET_OUTCLK (unsigned char Out_Control,
234 unsigned char Clock_Out)
235 {
236 1 SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
237 1 *SJA_BCANAdr=Out_Control; //写入参数
238 1 if(*SJA_BCANAdr != Out_Control) //校验写入值
239 1 {
C51 COMPILER V7.06 SJA_BCANFUNC 12/02/2005 15:25:41 PAGE 5
240 2 return 1;
241 2 }
242 1 SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
243 1 *SJA_BCANAdr=Clock_Out; //写入参数
244 1 return 0;
245 1 }
246 /************************************************************************
247 *函数原型: bit BCAN_DATA_WRITE(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_WRITE(unsigned char *SendDataBuf)
263 {
264 1 unsigned char TempCount;
265 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
266 1 if((*SJA_BCANAdr&0x08) == 0) //判断上次发送是否完成
267 1 {
268 2 return 1;
269 2 }
270 1
271 1 if((*SJA_BCANAdr&0x04)==0) //判断发送缓冲区是否锁定
272 1 {
273 2 return 1;
274 2 }
275 1
276 1 SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区1
277 1 if((SendDataBuf[1]&0x10)==0) //判断RTR,从而得出是数据帧还是远程帧
278 1 {
279 2 TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
280 2 }
281 1
282 1 else
283 1 {
284 2 TempCount =2; //远程帧
285 2 }
286 1
287 1 memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
288 1 return 0;
289 1 }
290
291 /************************************************************************
292 *函数原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
293 *参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
294 *返回值: 0;接收成功 *
295 * 1;接收失败 *
296 *说明:CAN控制器接收数据,仅限于接收数据 *
297 ************************************************************************/
298 bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
299 {
300 1 unsigned char TempCount;
301 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
C51 COMPILER V7.06 SJA_BCANFUNC 12/02/2005 15:25:41 PAGE 6
302 1 if((*SJA_BCANAdr&0x01)==0) //判断报文是否有效
303 1 {
304 2 return 1;
305 2 }
306 1
307 1 SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区2
308 1 if((*SJA_BCANAdr&0x10)==0) //如果是数据帧
309 1 {
310 2 TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
311 2 }
312 1
313 1 else
314 1 {
315 2 TempCount=2;
316 2 }
317 1 SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
318 1 memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
319 1 return 0;
320 1 }
321
322 /************************************************************************
323 *函数原型: bit BCAN_CMD_PRG(unsigned char cmd) *
324 *参数说明: cmd:sja1000运行的命令字 *
325 * 01:发送请求 *
326 * 02:中止发送 *
327 * 04:释放接收缓冲区 *
328 * 08:清除超载状态 *
329 * 0x10:进入睡眠状态 *
330 * *
331 *返回值: *
332 * 0 ; 表示命令执行成功 *
333 * 1 ; 表示命令执行失败 *
334 * *
335 *说明: 执行sja1000命令 *
336 ************************************************************************/
337 bit BCAN_CMD_PRG(unsigned char cmd)
338 {
339 1 SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
340 1 *SJA_BCANAdr=cmd; //启动命令字
341 1 switch(cmd)
342 1 {
343 2 case TR_CMD: //发送请求命令
344 2 return 0;
345 2 break;
346 2 case AT_CMD: //夭折发送命令
347 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
348 2 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
349 2 {
350 3 return 0;
351 3 }
352 2 else
353 2 {
354 3 return 1;
355 3 }
356 2 break;
357 2 case RRB_CMD: //释放接收缓冲区
358 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
359 2 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
360 2 {
361 3 return 1;
362 3 }
363 2 else
C51 COMPILER V7.06 SJA_BCANFUNC 12/02/2005 15:25:41 PAGE 7
364 2 {
365 3 return 0;
366 3 }
367 2 break;
368 2
369 2 case COS_CMD: //清除超载状态
370 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
371 2 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
372 2 {
373 3 return 0;
374 3 }
375 2 else
376 2 {
377 3 return 1;
378 3 }
379 2 break;
380 2
381 2 case GTS_CMD: //进入睡眠状态命令
382 2 return 0;
383 2 break;
384 2 default:
385 2 return 1;
386 2 break;
387 2 }
388 1
389 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 561 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 5
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 + -