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

📄 ican-mcp2515.lst

📁 完成数据的采集
💻 LST
📖 第 1 页 / 共 2 页
字号:
###############################################################################
#                                                                             #
#                                                       04/Dec/2008  16:07:55 #
# IAR ARM ANSI C/C++ Compiler V5.11.0.20622/W32 EVALUATION                    #
# Copyright 1999-2007 IAR Systems. All rights reserved.                       #
#                                                                             #
#    Cpu mode     =  thumb                                                    #
#    Endian       =  little                                                   #
#    Source file  =  E:\ELE\yten\pro\message\ican-mcp2515.c                   #
#    Command line =  E:\ELE\yten\pro\message\ican-mcp2515.c -D EMB_FLASH      #
#                    -lcN E:\ELE\yten\pro\Release\List\ -o                    #
#                    E:\ELE\yten\pro\Release\Obj\ --no_cse --no_unroll        #
#                    --no_inline --no_code_motion --no_tbaa --no_clustering   #
#                    --no_scheduling --debug --endian little --cpu Cortex-M3  #
#                    -e --fpu None --dlib_config "C:\Program Files\IAR        #
#                    Systems\Embedded Workbench 5.0                           #
#                    Evaluation\ARM\INC\DLib_Config_Normal.h" -I              #
#                    E:\ELE\yten\pro\ -I E:\ELE\yten\pro\..\LIBRARY\INC\ -I   #
#                    "C:\Program Files\IAR Systems\Embedded Workbench 5.0     #
#                    Evaluation\ARM\INC\" -On                                 #
#    List file    =  E:\ELE\yten\pro\Release\List\ican-mcp2515.lst            #
#    Object file  =  E:\ELE\yten\pro\Release\Obj\ican-mcp2515.o               #
#                                                                             #
#                                                                             #
###############################################################################

E:\ELE\yten\pro\message\ican-mcp2515.c
      1          ////////////////////////
      2          #include "includes.h"
      3          #include"ytep.h"
      4          #include"can.h"
      5          const Int8U	 CAN_BAUD[]={1,4,18};
      6          ////////////////////////
      7          //------------------------------------
      8          void WriteSPI(unsigned char DataOut)
      9          {
     10            unsigned char n;
     11          
     12            Clr_bit(IO_mSCK,mSCK) ;  //Make sure clock is low
     13          
     14            for(n=0; n<8; n++)
     15            {    	
     16              if((DataOut << n) & 0x80)Set_bit(IO_mSI,mSI);        //mSII = 1;
     17              else                     Clr_bit(IO_mSI,mSI) ;                      //Clock a 0
     18              asm("nop");
     19              asm("nop");
     20              asm("nop");
     21          
     22              Set_bit(IO_mSCK,mSCK);   //mSCK = 1;                 //Pulse clock                               //      mSCK = 0;                 //
     23              asm("nop");
     24              asm("nop");
     25              asm("nop");
     26              asm("nop");
     27              asm("nop");
     28           
     29              Clr_bit(IO_mSCK,mSCK);
     30              asm("nop");
     31              asm("nop");
     32              asm("nop");
     33              asm("nop");
     34          
     35              Clr_bit(IO_mSI,mSI) ;
     36            }
     37          }
     38          
     39          /********************************************************************/
     40          unsigned char ReadSPI( void )
     41          {
     42            unsigned char n, DataIn = 0;
     43          
     44            Clr_bit(IO_mSCK,mSCK);      //mSCK = 0;   //Make sure clock is low
     45            for(n=0; n<7; n++)
     46            {
     47              Set_bit(IO_mSCK,mSCK) ;    //mSCK = 1;
     48              asm("nop");
     49              asm("nop");
     50              if(Get_bit(IO_mSO,mSO))DataIn|=1;
     51              else            DataIn&=0xfe;	
     52              	
     53              DataIn = (DataIn << 1);
     54              Clr_bit(IO_mSCK,mSCK);
     55              asm("nop");
     56              asm("nop");//mSCK = 0;
     57            }
     58              Set_bit(IO_mSCK,mSCK);								//mSCK = 1;
     59              if(Get_bit(IO_mSO,mSO))DataIn|=1;
     60              else          DataIn&=0xfe;	          //DataIn = DataIn + mSI;
     61              Clr_bit(IO_mSCK,mSCK);								//				mSCK = 0;
     62              return DataIn;
     63          }
     64          //-------------------------------------------------------------
     65          //-------------------------------------------------------------------------
     66          //  SPIByteWrite()
     67          //-------------------------------------------------------------------------
     68          void SPIByteWrite(unsigned char addr, unsigned char value )
     69          {
     70            Clr_bit(IO_CS,mCS) ;      //mCS = LOW;
     71            WriteSPI(CAN_WRITE);
     72            WriteSPI(addr);
     73            WriteSPI(value);
     74            Set_bit(IO_CS,mCS);       //mCS = HIGH;;
     75          }
     76          
     77          
     78          //-----------------------------------------------------------------------------
     79          //  SPIByteRead()
     80          //-----------------------------------------------------------------------------
     81          unsigned char SPIByteRead(unsigned char addr)
     82          {
     83            unsigned char tempdata;
     84          	Clr_bit(IO_CS,mCS);             //mCS = LOW;;
     85            WriteSPI(CAN_READ);
     86            WriteSPI(addr);
     87            tempdata = ReadSPI();
     88            Set_bit(IO_CS,mCS);						  //mCS = HIGH;;
     89            return tempdata;
     90          }
     91          //-----------------------------------------------------------------------------
     92          //  SPIReset()
     93          //-----------------------------------------------------------------------------
     94          void SPIReset(void)
     95          {
     96          	Clr_bit(IO_CS,mCS);//mCS = LOW;
     97          	WriteSPI(CAN_RESET);
     98            Set_bit(IO_CS,mCS);
     99          }
    100          SPIFastRead(unsigned char m)
    101          {
    102          	unsigned char tempdata;
    103          	Clr_bit(IO_CS,mCS);             //mCS = LOW;;
    104            WriteSPI(m);
    105            tempdata = ReadSPI();
    106            Set_bit(IO_CS,mCS);						  //mCS = HIGH;;
    107            return tempdata;
    108          }
    109          SPIFastWrite()
    110          {
    111          }
    112          //-----------------------------------------------------------------------------
    113          //----------------------------------------------------
    114          void		ConfCAN(CAN_BUS *CANx,volatile CAN_BUS *CANS,const Int16U *p)
    115          {
    116                      unsigned char  x,y; 
    117                      
    118                   
    119                      
    120                CANS->SiIDH=*(p+C_PrductADD);//发送的标准标识符滤波10-3	,产品地址	     	     	
    121          	     
    122                CANS->SiIDL=0;
    123          		  if(CANx->SiIDL&0Xe0)CANS->SiIDL|=0xe0;//功能码.标准标识符滤波位0,IDH的b5与IDL的b5
    124          		  CANS->SiIDL|=8;                       //mcp2515报文滤波用于0=标准帧1=扩展帧//本应用中为扩展帧
    125          		  CANS->EIDM=CANx->EIDM&0xc0;//通讯类型
    126          		  CANS->EIDM|=CANx->SiIDH&0X3F;
    127          		  CANS->EIDL=CANx->EIDL;  
    128          		  		                     //CAN.EIDL start address ,CAN.DATA[0] len
    129          		  CANS->DLC=0;
    130          		  x=CANx->EIDL;                                //起始地址		
    131          		  p+=x;
    132          		  for(x=0;(x<4)&&(CANx->DATA[0]!=0);x++)//CAN.DATA[0]数据长度
    133          		  {	    
    134                              y=2*x;
    135          		    CANS->DATA[y]=*p/256,CANS->DLC++;;
    136                              CANS->DATA[y+1]=*p&0xff,CANS->DLC++;;
    137          		    p++;
    138          		    CANx->EIDL++;
    139          		    if(CANx->DATA[0]>=1)CANx->DATA[0]--;
    140          		    else		CANx->DATA[0]=0;
    141          		  }
    142          		  if(CANx->DATA[0]==0)CANS->SiIDL|=0x3;	 // 数据发完时C0
    143          		  else							  CANS->SiIDL|=0X1;
    144          #if 0	  	
    145          		  CANS->SiIDH=0XAA;
    146                            CANS->EIDM=0XAA;
    147                             CANS->EIDL=0X1;
    148                             CANS->DLC=0;
    149                             CANS->DATA[0]=0XBB;
    150                             CANS->DATA[1]=0X7F;
    151                             CANS->DATA[2]=0X7F;
    152                             CANS->DATA[3]=0X7F;
    153                             CANS->DATA[4]=0X7F;
    154                             CANS->DATA[5]=0X7F;
    155                             CANS->DATA[6]=0X7F;
    156                             CANS->DATA[7]=0X7F;
    157          		  CANS->SiIDL=8;
    158          #endif		  	
    159          }
    160          //---------------------------------------------------------
    161          //---------------------------------------------------------
    162          WriteCAN(const CAN_BUS *WCAN,unsigned char c)
    163          {
    164          	unsigned char c1,c2,c3;
    165          	c3=c;
    166          	SPIByteWrite(c,WCAN->SiIDH);
    167          	SPIByteWrite(++c,WCAN->SiIDL);
    168          	SPIByteWrite(++c,WCAN->EIDM);
    169          	SPIByteWrite(++c,WCAN->EIDL);
    170          	SPIByteWrite(++c,WCAN->DLC);
    171          	c1=WCAN->DLC&0xf;
    172          	for(c2=0;c2<c1;c2++)		
    173          	SPIByteWrite(++c,WCAN->DATA[c2]);
    174          	
    175            if(c3==TXB0SIDH)SPIByteWrite(TXB0CTRL,8);
    176          	else if(c3==TXB1SIDH)SPIByteWrite(TXB1CTRL,8);
    177          	else if(c3==TXB2SIDH)SPIByteWrite(TXB2CTRL,8);
    178          }
    179          /////////////////////////////////////////////////////////////
    180          
    181          void Init2515(Int8U m)
    182          {
    183            Int16U  i; 
    184            SPIReset();
    185            delay_nop(100);
    186            
    187            SPIByteWrite(RXB0CTRL,0x00);//清RXB0  
    188            //Clear masks to RX all messages
    189            SPIByteWrite(RXM0SIDH,0x00);//标准标识低位
    190            SPIByteWrite(RXM0SIDL,0x00);//标准标识高位
    191            //Clear filter... really only concerned to clear EXIDE bit
    192            SPIByteWrite(RXF0SIDH,0x00);//验收滤波器H位
    193            SPIByteWrite(RXF0SIDL,0x08);//验收滤波器L位
    194            SPIByteWrite(RXF0EID8,0x3F);//验收滤波器扩展8~15位
    195            SPIByteWrite(RXF0EID0,0x0);//验收滤波器扩展0-7位
    196          
    197            //Set CNF1
    198            m=CAN_RATE_TAB[m];
    199            SPIByteWrite(CNF1,m);//分频CAN_125kbps
    200          
    201            //Set CNF2
    202            SPIByteWrite(CNF2,0x80 | PHSEG1_3TQ | PRSEG_1TQ);
    203          
    204            //Set CNF3
    205            SPIByteWrite(CNF3, PHSEG2_3TQ);
    206          
    207            //Set TXB0 DLC and Data for a "Write Register" Input Message to the MCP25020
    208            SPIByteWrite(TXB0SIDH,0xA0);    //发送器标识符高位
    209            SPIByteWrite(TXB0SIDL,0xe8);    //
    210            SPIByteWrite(TXB0EID8,0XFF);    //发送器扩展8-15位
    211            SPIByteWrite(TXB0EID0,0XA8);
    212            SPIByteWrite(TXB0DLC,DLC_3);// 发送数据字节长度,0-8字节
    213            SPIByteWrite(TXB0D0,0x6);   //发送器发送数据D0
    214            SPIByteWrite(TXB0D1,0xff);      //D1 = Mask = 0x10
    215            SPIByteWrite(TXB0D2,0xff);
    216          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -