📄 ican-mcp2515.lst
字号:
217 //Set TXB1 DLC and Data for a "READ I/O IRM"
218 SPIByteWrite(TXB1SIDH,0x50); //Set TXB0 SIDH
219 SPIByteWrite(TXB1SIDL,0x00); //Set TXB0 SIDL
220 SPIByteWrite(TXB1DLC,0x40 | DLC_8); //Set DLC = 3 bytes and RTR bit
221
222 //Interrupt on RXB0 - CANINTE
223 SPIByteWrite(CANINTE,0x01); //
224
225
226 delay_nop(100);
227 i=SPIByteRead(RXF0EID8);
228 SPIByteWrite(CANCTRL,REQOP_NORMAL | CLKOUT_DISABLE);//正常工作+时钟开
229
230 i = SPIByteRead(CANSTAT);//中断代码
231
232 SPIByteWrite(TXB0CTRL, 0);//无报文,清0
233 i=0;
234 while((SPIByteRead(CAN_RD_STATUS)&0x54)&&i<25000)
235 {
236 WWDG_ClearFlag();//快速读,清空发
237 ++i;
238 }
239 SPIByteWrite(CANINTF,0);
240 }
241 //-----------------------------------------------------------
242 void Read2551(CAN_BUS *RCAN,unsigned char x)
243 {
244
245 RCAN->SiIDH=SPIByteRead(x);
246 RCAN->SiIDL=SPIByteRead(++x);
247 RCAN->EIDM=SPIByteRead(++x);
248 RCAN->EIDL=SPIByteRead(++x);
249 RCAN->DLC=SPIByteRead(++x);
250
251 RCAN->DATA[0]=SPIByteRead(++x);
252 RCAN->DATA[1]=SPIByteRead(++x);
253 RCAN->DATA[2]=SPIByteRead(++x);
254 RCAN->DATA[3]=SPIByteRead(++x);
255 RCAN->DATA[4]=SPIByteRead(++x);
256 RCAN->DATA[5]=SPIByteRead(++x);
257 RCAN->DATA[6]=SPIByteRead(++x);
258 RCAN->DATA[7]=SPIByteRead(++x);
259 }
260 //-----------------------------------------------------------------------------
261 // RTS(buffer)
262 // buffer = CAN_RTS_TXBn; where 'n' = 0, 1, 2
263 // buffer = CAN_RTS; followed by | 0 - 7 (e.g., CAN_RTS | 7)
264 //发送操作,buffer分出是那个发送器
265 //-----------------------------------------------------------------------------
266 Boolean RTS(CAN_BUS *CANx,CAN_BUS *CANS,const Int16U *p)//发送操作
267 {
268 unsigned char x,xdata;
269
270 xdata=SPIFastRead(CAN_RD_STATUS);//读指令,快速读
271 CANx->SiIDL=0;
272
273 if((CANx->CANFUN)==C_CAN_READ)
274 {
275 if((xdata&0x04)==0x04)return 0xff;
276 ConfCAN(CANx,CANS,p);
277 if((xdata&4)==0)WriteCAN(CANS,TXB0SIDH);
278 else if((xdata&0x10)==0)WriteCAN(CANS,TXB1SIDH);
279 else if((xdata&0x40)==0)WriteCAN(CANS,TXB2SIDH);
280 x=CANx->CANlen;
281 if(x==0)return 0;
282 else return 1;
283 }
284 if((CANx->CANFUN)==C_CAN_WRITE)
285 {
286
287 }
288
289 if((CANx->CANFUN)==C_CAN_ERROR&&(xdata&4)==0)
290 {
291 CANS->SiIDH=*(p+C_PrductADD);//发送的标准标识符滤波10-3 ,产品地址
292 CANS->SiIDL=0xE0;//功能码.标准标识符滤波位0,IDH的b5与IDL的b5
293 CANS->SiIDL|=8; //mcp2515报文滤波用于0=标准帧1=扩展帧//本应用中为扩展帧
294 CANS->SiIDL|=1;
295 CANS->EIDM=CANx->EIDM&0x80;//通讯类型
296 CANS->EIDM|=CANx->SiIDH&0X7F;
297 CANS->EIDL=CANx->EIDL; //CAN.EIDL start address ,CAN.DATA[0] len
298 CANS->DLC=0;
299 if((xdata&4)==0)WriteCAN(CANS,TXB0SIDH);
300 else if((xdata&0x10)==0)WriteCAN(CANS,TXB1SIDH);
301 else if((xdata&0x40)==0)WriteCAN(CANS,TXB2SIDH);
302 return 0;
303 }
304 if((CANx->CANFUN)==3)
305 {
306
307 }
308 if((CANx->CANFUN)==4)
309 {
310 if(xdata&4) return 0xff;
311 CANS->SiIDL=0;
312 if(CANx->SiIDH&0X20)CANS->SiIDL|=0x20;
313 CANS->SiIDL|=8;
314 x=(CANx->SiIDH&0X18);
315 x>>=3;
316 CANS->SiIDL|=x;
317
318 x=CANx->SiIDH&0X7;
319 x<<=5;
320 CANS->EIDM=0;
321 CANS->EIDM|=x;
322 CANS->EIDM|=0x10;
323 CANS->EIDM|=(CANx->CANFUN);
324 CANS->EIDL=0XF7;
325 CANS->DLC=1;
326 WriteCAN(CANS,TXB0SIDH);
327 return 0;
328 }
329 if((CANx->CANFUN)==5);
330 if(((CANx->CANFUN)==6)||((CANx->CANFUN))==0XF)
331 {
332 if(xdata&4) return 0xff;
333 Init2515(_YT._Rate);
334 CANS->SiIDL=0;
335 if(CANx->SiIDH&0X20)CANS->SiIDL|=0x20;
336 CANS->SiIDL|=8;
337 x=(CANx->SiIDH&0X18);
338 x>>=3;
339 CANS->SiIDL|=x;
340
341 x=CANx->SiIDH&0X7;
342 x<<=5,CANS->EIDM=0;
343 CANS->EIDM|=x;
344 CANS->EIDM|=0x10;
345 CANS->EIDM|=(CANx->CANFUN); //6 or 0X0F
346 CANS->EIDL=CANx->EIDL; //F7 FE
347 CANS->DLC=1;
348 if((xdata&4)==0)
349 WriteCAN(CANS,TXB0SIDH);
350 return 0;
351 }
352 if((CANx->CANFUN)==7);
353 {
354 }
355 return 0;
356 }
357
358 //------------------------------------------------
359
360 unsigned char ReadCAN(CAN_BUS *CANx,unsigned char FLAG,const unsigned char address)
361 {
362 unsigned char x;
363 unsigned int xdata;
364 if(Get_bit(mIO_INT,mINT))return FLAG; //周立功的有个bug,扩展帧b0-7在发04时无法发正确
365 xdata=SPIFastRead(CAN_RD_STATUS);//读指令,快速读
366 SPIByteWrite(CANINTF,0);
367 if((xdata&1)==0)return FLAG;
368 x=SPIByteRead(RXB0EID8);//扩展b8-15
369 x&=0x7f;
370 if(x!=address)return FLAG;
371
372 Read2551(CANx,RXB0SIDH);
373 x=(CANx->CANFUN);
374 x>>=5;
375 if((x==1)||(x==0))//Read and write
376 {
377 xdata=CANx->EIDL+(CANx->CANlen);//EIDL起始地址值
378 if(xdata>c_max_len)
379 {
380 CANx->SiIDL|=0XE0,CANx->EIDL=0XFE;
381 }
382 }
383 if(((CANx->DLC&7)==0)&&(x<2))CANx->SiIDL|=0XE0,CANx->EIDL=0XFE;
384 return 1;
385
386 return FLAG;
387 }
388 //-----------------------------------------------------------
389 //UART
390 //-----------------------------------------------------------
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
Maximum stack usage in bytes:
Function .cstack
-------- -------
ConfCAN 16
Init2515 16
RTS 24
Read2551 16
ReadCAN 24
ReadSPI 0
SPIByteRead 16
SPIByteWrite 16
SPIFastRead 16
SPIFastWrite 0
SPIReset 8
WriteCAN 24
WriteSPI 0
Section sizes:
Function/Label Bytes
-------------- -----
CAN_RATE_TAB 4
CAN_BAUD 4
WriteSPI 128
ReadSPI 152
SPIByteWrite 56
SPIByteRead 56
SPIReset 36
SPIFastRead 50
SPIFastWrite 2
ConfCAN 192
WriteCAN 160
Init2515 288
Read2551 164
RTS 226
ReadCAN 180
??DataTable23 4
??DataTable25 4
??DataTable41 4
8 bytes in section .rodata
1 702 bytes in section .text
1 702 bytes of CODE memory
8 bytes of CONST memory
Errors: none
Warnings: 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -