📄 basiccan_final1.lst
字号:
195 1 TempData = *SJA_BCANAdr; //保存原始值
196 1 *SJA_BCANAdr=(TempData&0xfe); //清除复位请求
197 1 if((*SJA_BCANAdr&0x01) == 0)
198 1 {
199 2 return 0; //退出成功
200 2 }
201 1 else
202 1 {
203 2 return 1; //
204 2 }
205 1
206 1 }
207
208 /************************************************************************
209 ;*函数原型: bit BCAN_SET_BANDRATE(uchar CAN_ByteRate) *
210 ;*参数说明: R7 波特率(Kbit/s) BTR0 BTR1 *
211 ;* 0 20 053H, 02FH *
212 ;* 1 40 087H, 0FFH *
213 ;* 2 50 047H, 02FH *
214 ;* 3 80 083H, 0FFH *
215 ;* 4 100 043H, 02fH *
216 ;* 5 125 03H, 01cH *
217 ;* 6 200 081H, 0faH *
218 ;* 7 250 01H, 01cH *
219 ;* 8 400 080H, 0faH *
220 ;* 9 500 00H, 01cH *
221 ;* 10 666 080H, 0b6H *
222 ;* 11 800 00H, 016H *
223 ;* 12 1000 00H, 014H *
224 ;*返回值: *
225 ;* 0 ;波特率设置成功 *
226 ;* 1 ;波特率设置失败 *
227 ;* *
228 ;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ, *
229 ;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *
230 ;* 复位模式 *
231 ;************************************************************************/
232 unsigned char code SJA_BTR_CODETAB[]={
233 0x53,0x2F, //;20KBPS的预设值
234 0x87,0xFF, //;40KBPS的预设值
235 0x47,0x2F, //;50KBPS的预设值
236 0x83,0xFF, //;80KBPS的预设值
237 0x43,0x2f, //;100KBPS的预设值
238 0x03,0x1c, //;125KBPS的预设值
239 0x81,0xfa, //;200KBPS的预设值
240 0x01,0x1c, //;250KBPS的预设值
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 5
241 0x80,0xfa, //;400KBPS的预设值
242 0x00,0x1c, //;500KBPS的预设值
243 0x80,0xb6, //;666KBPS的预设值
244 0x00,0x16, //;800KBPS的预设值
245 0x80,0x23 //;1000KBPS的预设值
246
247 };
248
249 bit BCAN_SET_BANDRATE(uchar CAN_ByteRate)
250 {
251 1 uchar BTR0_num,BTR1_num;
252 1 BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
253 1 BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
254 1 //将波特率的的预设值装入sja1000的总线定时器
255 1 SJA_BCANAdr=REG_BTR0; //访问地址指向总线定时寄存器0
256 1 *SJA_BCANAdr=BTR0_num; //写入参数
257 1 if(*SJA_BCANAdr != BTR0_num) //校验写入值
258 1 {
259 2 return 1;
260 2 }
261 1 SJA_BCANAdr=REG_BTR1; //访问地址指向总线定时寄存器0
262 1 *SJA_BCANAdr=BTR1_num; //写入参数
263 1 if(*SJA_BCANAdr != BTR1_num) //校验写入值
264 1 {
265 2 return 1;
266 2 }
267 1
268 1 return 0;
269 1 }
270
271
272 /************************************************************************
273 ;*函数原型: BCAN_SET_OBJECT *
274 *参数说明: *
275 * BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
276 * BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
277 ;*返回值: *
278 ;* 0 ;通信对象设置成功 *
279 ;* 1 ;通信对象设置失败 *
280 ;* *
281 ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
282 ;* 允许接收的报文,是由AMR和ACR共同决定的. *
283 ;* 满足以下条件的ID号的报文才可以被接收 *
284 ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
285 ;* 该子程序只能用于复位模式 *
- *
286 ;************************************************************************/
287 bit BCAN_SET_OBJECT(uchar BCAN_ACR,uchar BCAN_AMR)
288 {
289 1 SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
290 1 *SJA_BCANAdr=BCAN_ACR; //写入参数
291 1 if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
292 1 {
293 2 return 1;
294 2 }
295 1 SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
296 1 *SJA_BCANAdr=BCAN_AMR; //写入参数
297 1 if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
298 1 {
299 2 return 1;
300 2 }
301 1
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 6
302 1 return 0;
303 1 }
304
305
306
307 /************************************************************************
308 ;*函数原型: bit BCAN_SET_OUTCLK (uchar Out_Control, *
309 uchar Clock_Out); *
310 ;*参数说明: *
311 * Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
312 * Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
313 * *
314 ;*返回值: *
315 ;* 0 ;设置成功 *
316 ;* 1 ;设置失败 *
317 ;* *
318 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
- *
319 ;************************************************************************/
320 bit BCAN_SET_OUTCLK (uchar Out_Control,
321 uchar Clock_Out)
322 {
323 1 SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
324 1 *SJA_BCANAdr=Out_Control; //写入参数
325 1 if(*SJA_BCANAdr != Out_Control) //校验写入值
326 1 {
327 2 return 1;
328 2 }
329 1 SJA_BCANAdr=REG_CDR; //访问地址指向时钟分频寄存器,主要用于设置CAN模式
330 1 *SJA_BCANAdr=Clock_Out; //写入参数
331 1 return 0;
332 1 }
333
334
335 /************************************************************************
336 *函数原型: bit BCAN_DATA_WRITE(uchar *SendDataBuf)*
337 *参数说明: 特定帧各式的数据? *
338 *返回值: *
339 * 0 ; 表示将数据成功的送至发送缓冲区 *
340 * 1 ; 表示上一次的数据正在发送, *
341 * ; 表示发送缓冲区被锁定,不能写入数据 *
342 * ; 表示写入数据错误 *
343 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
344 * SJA1000发送。 *
345 * 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
346 * 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
347 * *
348 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
349 * 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
350 ************************************************************************/
351
352 bit BCAN_DATA_WRITE(uchar *SendDataBuf) reentrant //只是将数据写入SJA1000的发送缓存区
353 {
354 1 uchar TempCount;
355 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
356 1 if((*SJA_BCANAdr&0x08) == 0) //判断上次发送是否完成
357 1 {
358 2 return 1;
359 2 }
360 1
361 1 if((*SJA_BCANAdr&0x04)==0) //判断发送缓冲区是否锁定
362 1 {
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 7
363 2 return 1;
364 2 }
365 1
366 1 SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区1
367 1 if((SendDataBuf[1]&0x10)==0) //判断RTR,从而得出是数据帧还是远程帧
368 1 {
369 2 TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
370 2 }
371 1
372 1 else
373 1 {
374 2 TempCount =2; //远程帧
375 2 }
376 1
377 1 memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
378 1 return 0;
379 1 }
380
381
382
383 /************************************************************************
384 *函数原型: bit BCAN_DATA_RECEIVE(uchar *RcvDataBuf); *
385 *参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
386 *返回值: 0;接收成功 *
387 * 1;接收失败 *
388 *说明:CAN控制器接收数据,仅限于接收数据 *
389 ************************************************************************/
390
391 bit BCAN_DATA_RECEIVE(uchar *RcvDataBuf) //把数据接收之后出入RcvDataBuf
392 {
393 1 uchar TempCount;
394 1 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
395 1 if((*SJA_BCANAdr&0x01)==0) //判断报文是否有效
396 1 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -