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

📄 spi.lst

📁 SPI接口通信源程序
💻 LST
字号:
C51 COMPILER V7.07   SPI                                                                   09/29/2006 15:11:00 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE SPI
OBJECT MODULE PLACED IN SPI.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SPI.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //******************************************************//
   2          /*spi_m是发送或接收标志位,SPIE为中断允许位,scon中TI,RI怎么考虑??
   3          /********************************************************/
   4          #include <AT89X52.H>
   5          #include <stdio.h>
   6          #define uchar unsigned char;
   7          #define uint unsigned int;
   8          
   9          #define MOSI P1_5;
  10          #define MISO P1_6;
  11          #define SCK  P1_7;
  12          #define SS  P1_4;
  13          #define TXD P3_1;
  14          
  15          sfr SPCR        =       0xD5;
  16          sfr SPSR        =       0xAA;
  17          sfr SPDR        =       0x86;
  18          sbit SPIF       =       0xB1;
  19          sbit WCOL       =       0xB0;
  20          sbit MSTR       =       0xD9;
  21          sbit SPIE       =       0xDC;
  22          /****定义变量*****************/
  23          //SPSR=00h;
  24          //SPDR=00h;
  25          uchar SPI_RxHead;
  26          uchar SPI_TxHead;
  27          uint SPI_RxBuf[];       //选择字节,还是字容量?//
  28          uint SPI_TxBuf[];       //选择字节,还是字容量?//
  29          uint ReSend_FLAG[];
  30          uchar crc_array[];
  31          uint array_sscl[];
  32          uint array_krzt[];
  33          uint array_bwjl[];
  34          uint array_sjjl[];
  35          uint array_fwjl[];
  36          uint array_xtsz[];
  37          uint array_ddz[];
  38          
  39          uchar RT;
  40          int crc_buf;
  41          /******************************************************/
  42          /*模拟量装入
  43          /******************************************************/
  44          
  45          /*******************************************************/
  46          /*SPI初始化
  47          /*******************************************************/
  48          void int_spi(void)
  49          {
  50   1              SPCR      =0x50;        //spe=1,mstr=1:主方式,4倍分频//
  51   1              SPSR      =0x40;
  52   1              IE                =0x90;        //ES=1:允许串行中断/
  53   1              //SS=0;                         //spi为主器件//         
  54   1              SPI_RxHead=0;
  55   1              SPI_TxHead=0;
C51 COMPILER V7.07   SPI                                                                   09/29/2006 15:11:00 PAGE 2   

  56   1              ReSend_FLAG[0]=0x55;
  57   1              ReSend_FLAG[1]=0x55;                
  58   1              ReSend_FLAG[2]=0x55;
  59   1              ReSend_FLAG[3]=0x55;
  60   1              ReSend_FLAG[4]=0x55;
  61   1              RT=TXD;
  62   1              }
  63          /**************************************/
  64          /*CRC校验初始化
  65          /**************************************/
  66          void inti_crc(void)
  67          {
  68   1              char i;
  69   1              for(i=0;i<16;i++)
  70   1                      crc_array[i]=0x1021*i           ;/*为CRC数组赋初值*/
  71   1              }
  72          /**********************************************************************/
  73          /****CRC校验程序*******************************************************/
  74          /****data为待计算CRC的数据的地址,lenght为参与CRC计算的数据长度*********/
  75          /**********************************************************************/
  76          void crc_cal(int *crc_data,int length)
  77          {
  78   1                      int     n1;
  79   1                      int n2;
  80   1                      for(;length!=0;length--)
  81   1                      {
  82   2                              n2=*crc_data++  ;
  83   2                              n1=(crc_buf>>12)&0xf    ;       /*取此前CRC的高4位*/
  84   2                              crc_buf<<=4     ;               /*将此前CRC左移4位*/
  85   2                              crc_buf^=crc_array[n1^((n2>>4&0xf))];
  86   2                              n1=(crc_buf>>12)&0xf    ;       /*取此前CRC的高4位*/
  87   2                              crc_buf<<=4     ;               /*将此前CRC左移4位*/
  88   2                              crc_buf^=crc_array[n1^(n2&0xf)] ;
  89   2                      }
  90   1                      return;
  91   1      }
  92          /********************************************/
  93          /*把电压电流等参数赋给对应的数组
  94          /********************************************/
  95          
  96          /*******************************************/
  97          /*判断接收的是哪种类型BianMa_J()
  98          /*******************************************/
  99          void BianMa_J(void)
 100          {
 101   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x01)
 102   1              {
 103   2                      int i;
 104   2                      for(;i>=0;i--)array_sscl[i]=SPI_RxBuf[i];//实时测量//
 105   2                      }
 106   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x02)
 107   1              {
 108   2                      int i;
 109   2                      for(;i>=0;i--)array_krzt[i]=SPI_RxBuf[i];//开入状态//
 110   2                      }
 111   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x03)
 112   1              {
 113   2                      int i;
 114   2                      for(;i>=0;i--)array_bwjl[i]=SPI_RxBuf[i];//变位记录//
 115   2                      }
 116   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x04)
 117   1              {
C51 COMPILER V7.07   SPI                                                                   09/29/2006 15:11:00 PAGE 3   

 118   2                      int i;
 119   2                      for(;i>=0;i--)array_sjjl[i]=SPI_RxBuf[i];//事件记录//
 120   2                      }
 121   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x05)
 122   1              {
 123   2                      int i;
 124   2                      for(;i>=0;i--)array_fwjl[i]=SPI_RxBuf[i];//复位记录//
 125   2                      }
 126   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x06)
 127   1              {
 128   2                      int i;
 129   2                      for(;i>=0;i--)array_ddz[i]=SPI_RxBuf[i];//读定值//
 130   2                      }
 131   1              if(SPI_RxBuf[0]&0x10&&SPI_RxBuf[1]&0x07)
 132   1              {
 133   2                      int i;
 134   2                      for(;i>=0;i--)array_xtsz[i]=SPI_RxBuf[i];//系统设置//
 135   2                      }
 136   1              //未完//
 137   1              
 138   1              }
 139          /*******************************************/
 140          /*fill_tx_buffer()
 141          /*******************************************/
 142          fill_tx_buffer()
 143          {
 144   1              BianMa_J();             //判断//
 145   1              
 146   1              }
 147          //****************************************** 
 148          // SPI发送/接收一帧 
 149          //****************************************** 
 150          void spi_RT(int SPI_RT_LENGTH) 
 151          {       
 152   1              if(RT&0x01)                                    //如果TXD(spi_m)为0,表明是接收状态 
 153   1              { 
 154   2                      if ( SPI_RxHead > SPI_RT_LENGTH )       //如果是接收帧的最后一个数据   
 155   2                      {                       
 156   3      
 157   3                              crc_cal(SPI_RxBuf,SPI_RT_LENGTH);//CRC校验
 158   3                              if(crc_buf!=0)RT=1;
 159   3                              else
 160   3                              {
 161   4                                      if(SPI_RxBuf[0]&0x55)RT=1; 
 162   4                                      else
 163   4                                      {
 164   5                                              BianMa_J();     //判断//
 165   5                                              
 166   5                                              
 167   5                                              }                                                                                                       
 168   4                                      SPI_RxHead = 0;            //计数还原 
 169   4                                      MSTR=1;                     //接收完成,将SPI设回主方式????? 
 170   4                                      SPIE=0;                    //清空中断申请//
 171   4                                      SPIF=1;                       //置接收完成标志 ,置传输结束标志//
 172   4                              }  
 173   3                                      }
 174   2                      else 
 175   2                      {                        
 176   3                              SPI_RxBuf[SPI_RxHead] = SPDR;                   //将接收到的数据存入接收缓存区 
 177   3                              SPI_RxHead++;                           //已接收数据计数器加1 
 178   3                      }               
 179   2         }            
C51 COMPILER V7.07   SPI                                                                   09/29/2006 15:11:00 PAGE 4   

 180   1              else                                             //如果spi_m为1,表明是发送状态 
 181   1              { 
 182   2                      SPI_TxHead = 0;
 183   2                     if(crc_buf!=0)                         
 184   2                      {
 185   3                                      char j;
 186   3                                      for(j=0;;j++)SPI_TxBuf[j]=ReSend_FLAG[j];
 187   3                              if ( SPI_TxHead <= SPI_RT_LENGTH)    //如果要发送的数据还未全部发完 
 188   3                              {    
 189   4                              SPDR = SPI_TxBuf[SPI_TxHead];           //从发送缓存区取数发送 
 190   4                              SPI_TxHead++;                           //已发送数据计数器加1
 191   4                              //while(1);                           
 192   4                              } 
 193   3                              else                                      //如果要发送的数据已全部发完 
 194   3                              { 
 195   4                              SPI_TxHead=0;                         //已发送数据计数器还原 
 196   4                              //SET_SPI_MODE=1;                       //释放总线,以便接收方进入主发送。 
 197   4                              //spi_m=0; 
 198   4                              MSTR=1; 
 199   4                              SPIE=0;                         //清空中断申请//    
 200   4                              SPIF=1;                        //清空发送中标记 ,置传输结束标志//
 201   4                              
 202   4                              } 
 203   3                      }
 204   2                      if(SPI_RxBuf[0]&0x55)
 205   2                      {
 206   3                              if ( SPI_TxHead <= SPI_RT_LENGTH)    //如果要发送的数据还未全部发完 
 207   3                              {    
 208   4                              SPDR = SPI_TxBuf[SPI_TxHead];           //从发送缓存区取数发送 
 209   4                              SPI_TxHead++;                           //已发送数据计数器加1
 210   4                              //while(1);                           
 211   4                              } 
 212   3                              else                                      //如果要发送的数据已全部发完 
 213   3                              { 
 214   4                              SPI_TxHead=0;                         //已发送数据计数器还原 
 215   4                              //SET_SPI_MODE=1;                       //释放总线,以便接收方进入主发送。 
 216   4                              //spi_m=0; 
 217   4                              MSTR=1; 
 218   4                              SPIE=0;                         //清空中断申请//    
 219   4                              SPIF=1;                        //清空发送中标记 ,置传输结束标志//
 220   4                                      } 
 221   3                              }
 222   2                       
 223   2                              /*根据dis_enter和key_enter值定时发送设定值//
 224   2      } 
 225   2      
 226   2      //****************************************** 
 227   2      //发送数据 中断服务程序
 228   2      //******************************************/ 
 229   2      main() 
*** WARNING C206 IN LINE 229 OF SPI.C: 'main': missing function-prototype
 230   2      { 
*** ERROR C141 IN LINE 230 OF SPI.C: syntax error near '{'
 231   3          int_spi();          //初始化spi为主方式
 232   3          SPDR=0xFF;          //开始发送,接收方接收到的第一个数据为0xFF应忽略 
 233   3          delay_us(10);
 234   3          spi_RT();           //执行数据接发//  
 235   3      }
 236   2       

C51 COMPILATION COMPLETE.  1 WARNING(S),  1 ERROR(S)

⌨️ 快捷键说明

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