⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ican-mcp2515.lst

📁 完成数据的采集
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -