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

📄 spidriv.lst

📁 单片机开发列程
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.01   SPIDRIV                                                               09/30/2007 11:14:55 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE SPIDRIV
OBJECT MODULE PLACED IN SPIDriv.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SPIDriv.c LARGE BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS

line level    source

   1          #define __SPIDRIV_H__
   2          
   3          #include "Config.h"
   4          
   5          #define WREN    0x06    //写使能
   6          #define WRDI    0x04    //写禁止
   7          #define RDSR    0x05    //读状态寄存器
   8          #define WRSR    0x01    //写状态寄存器
   9          
  10          #define READH   0x0B    //读存储器的高半部分
  11          #define READL   0x03    //读存储器的低半部分
  12          #define WRITEH  0x0A    //写存储器的高半部分
  13          #define WRITEL  0x02    //写存储器的低半部分
  14          
  15          /********************************************************************************************************
  16          **函数名称: SPIInit
  17          **函数功能: SPI接口初始化
  18          **输    入: 无
  19          **输    出: 无
  20          ********************************************************************************************************/
  21          void SPIInit(void)
  22          {
  23   1          PERIPHEN1 |= (BIT7 | BIT6);     //SPI接口使能;SPI CS禁止,作为通用IO口(CS0除外)
  24   1          //--------------------------------------------------------------------   
  25   1          #ifdef DOWNLOAD
  26   1              while((SPISTATUS & BIT3) == 0x00);      //等待SPI准备好
  27   1          #endif
  28   1          //--------------------------------------------------------------------   
  29   1          SPICTRL = (0 | BIT6 | BIT5 | 0 | 0 | 0 | BIT1 | BIT0);          //上升沿采样,休眠时停留为高电平
  30   1                              //通信速率sysclk/32;
  31   1                              //CS0使能
  32   1                              //SPI模式0(模式3也可以)
  33   1                              //SPI主模式
  34   1          
  35   1          SPICONFIG = (BIT7 | 0 | 0 | 0 | 0 | 0 | 0 | 0);             //CS手动控制
  36   1                              //片选自动控制
  37   1                              //CS3正常模式
  38   1                              //正常传输模式
  39   1                              //接收溢出中断禁止
  40   1                              //接收中断禁止
  41   1                              //发送缓冲空使能
  42   1          SPISTATUS = 0x00;   //正常模式
  43   1                              //至少一个片选有效
  44   1                              //中断标志清零
  45   1          //SPISIZE = 0x07;   //8位传输模式
  46   1      }
  47          
  48          /********************************************************************************************************
  49          **函数名称: FMSPIWrite
  50          **函数功能: 写数据到存储器
  51          **输    入: Src:      要写入到存储器的数据的缓冲区指针
  52                       Dst:      要写入的存储器的地址
  53                       DataLen:  要写入的数据长度
  54          **输    出: 无
  55          ********************************************************************************************************/
C51 COMPILER V8.01   SPIDRIV                                                               09/30/2007 11:14:55 PAGE 2   

  56          void FMSPIWrite(uchar * Src, uint Dst, uint DataLen)
  57          {
  58   1          uchar Temp;
  59   1          //-----------------------------------------
  60   1          //因为只发送一个字节,所以用自动模式即可
  61   1          SPICONFIG &= ~BIT7;             
  62   1          //-----------------------------------------
  63   1      
  64   1          Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
  65   1          SPIRXTX0 = WREN;                        //在写之前先发送写使能
  66   1          #ifdef DOWNLOAD
  67   1              while((SPISTATUS & BIT1) == 0);     //等待发送完成
  68   1          #endif
  69   1          //-----------------------------------------
  70   1          //下面要发送多个字节故转为/CS手动控制方式
  71   1          SPICONFIG |= BIT7;       //转换为手动模式
  72   1          //-----------------------------------------
  73   1      
  74   1          if(Dst < 0x100)                             //如果是写低半部分
  75   1          {
  76   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
  77   2              SPIRXTX0 = WRITEL;                      //低半部写
  78   2              #ifdef DOWNLOAD
  79   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
  80   2              #endif
  81   2      
  82   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
  83   2              SPIRXTX0 = (uchar)(Dst & 0x00FF);       //发送字节地址
  84   2              #ifdef DOWNLOAD
  85   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
  86   2              #endif
  87   2          }
  88   1          else                                        //写高半部分
  89   1          {
  90   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
  91   2              SPIRXTX0 = WRITEH;                      //高半部写
  92   2              #ifdef DOWNLOAD
  93   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
  94   2              #endif
  95   2      
  96   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
  97   2              SPIRXTX0 = (uchar)(Dst & 0x00FF);       //发送字节地址
  98   2              #ifdef DOWNLOAD
  99   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
 100   2              #endif
 101   2          }
 102   1      
 103   1          for(; DataLen --; DataLen > 0)
 104   1          {
 105   2              Temp = SPIRXTX0;                        //读清标志
 106   2              SPIRXTX0 = *Src;                        //写数据
 107   2      
 108   2          #ifdef DOWNLOAD
 109   2              while((SPISTATUS & BIT1) == 0);         //等待数据发送完成        
 110   2          #endif
 111   2      
 112   2              Src ++;                                 //指向下一个要发送的数据
 113   2          }
 114   1      
 115   1          //-----------------------------------------
 116   1          //必须在一个操作完成之后再置高/CS
 117   1          SPICONFIG &= ~BIT7;             //拉高CS,(同时设为自动模式)
C51 COMPILER V8.01   SPIDRIV                                                               09/30/2007 11:14:55 PAGE 3   

 118   1          //-----------------------------------------
 119   1      }
 120          
 121          /********************************************************************************************************
 122          **函数名称:FMSPIRead
 123          **函数功能:读入数据数据到存储器
 124          **输    入:DSt:       要存储读到的数据的缓冲区指针
 125                          Src:       要读数据的存储器的地址
 126                          DataLen:   要写入的数据长度
 127          **输    出:读回的数据存储到DST指向的缓冲
 128          ********************************************************************************************************/
 129          void FMSPIRead(uchar * Dst, uint Src, uint DataLen)
 130          {
 131   1          uchar Temp;
 132   1          //-----------------------------------------
 133   1          //由于要读写多字节,设为为手动模式,手动控制/CS
 134   1          SPICONFIG |= BIT7;           
 135   1          //-----------------------------------------
 136   1          Temp = SPIRXTX0;                            //DummyRead  清标志
 137   1          
 138   1          if(Src < 0x100)                             //读低字节
 139   1          {
 140   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
 141   2              SPIRXTX0 = READL;
 142   2              #ifdef DOWNLOAD
 143   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
 144   2              #endif
 145   2      
 146   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
 147   2              SPIRXTX0 = (uchar)(Src & 0x00FF);       //发送字节地址
 148   2              #ifdef DOWNLOAD
 149   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
 150   2              #endif
 151   2          }
 152   1          else                                        //读高字节
 153   1          {
 154   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志            
 155   2              SPIRXTX0 = READH;
 156   2              #ifdef DOWNLOAD
 157   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
 158   2              #endif
 159   2      
 160   2              Temp = SPIRXTX0;                        //DummyRead to clear SPIRXAV flag 清接收标志    
 161   2              SPIRXTX0 = (uchar)(Src & 0x00FF);       //发送字节地址
 162   2              #ifdef DOWNLOAD
 163   2                  while((SPISTATUS & BIT1) == 0);     //等待发送完成
 164   2              #endif
 165   2          }
 166   1      
 167   1          for(; DataLen --; DataLen > 0)
 168   1          {
 169   2              Temp = SPIRXTX0;
 170   2              SPIRXTX0 = 0x00;                        //产生接收数据时钟
 171   2      
 172   2          #ifdef DOWNLOAD
 173   2              while((SPISTATUS & BIT1) == 0);
 174   2          #endif
 175   2              *Dst = SPIRXTX0;                        //读回数据
 176   2              Dst ++;    
 177   2          }
 178   1          //-----------------------------------------
 179   1          //必须在一个操作完成之后再置高/CS
C51 COMPILER V8.01   SPIDRIV                                                               09/30/2007 11:14:55 PAGE 4   

 180   1          SPICONFIG &= ~BIT7;                         //拉高CS
 181   1          //-----------------------------------------
 182   1      }
 183          
 184          /********************************************************************************************************
 185          **函数名称:FM25L04Test
 186          **函数功能:25CL04数据存储器测试
 187          **输    入: 无
 188          **输    出: 无
 189          ********************************************************************************************************/
 190          void FM25L04Test(void)
 191          {
 192   1          //-----------------------------------------------
 193   1          //SPI接口存储器FM25L04测试时用到的变量
 194   1          //-----------------------------------------------
 195   1          uint  xdata FM25L04ADDR;
 196   1          uchar xdata FM25L04DatWR;                 //写入的数据
 197   1          uchar xdata FM25L04WRStore[512];    //写入数据存储的数组
 198   1          uchar xdata FM25L04RDStore[512];    //读取的数据存储殊组
 199   1          //-----------------------------------------------
 200   1      
 201   1          FM25L04ADDR = 0x0000;               //25L04的地址计数器
 202   1      
 203   1          //memset(FM25L04WRStore, 512, 0);   //清空写RAM
 204   1          //memset(FM25L04RDStore, 512, 0);   //清空读RAM
 205   1      
 206   1          UART0_Printf("\n ->FM25L04 test begin: \n");
 207   1      
 208   1          //-----------------------------------------------
 209   1          //先将待写的数据存储,方便用写多字节的方法一次写入
 210   1          //-----------------------------------------------
 211   1          for(FM25L04ADDR = 0x00; FM25L04ADDR < 512; FM25L04ADDR ++)
 212   1          {
 213   2              FM25L04DatWR = (int)rand();
 214   2              FM25L04WRStore[FM25L04ADDR] = FM25L04DatWR;     
 215   2          }
 216   1          FMSPIWrite(FM25L04WRStore, 0x00, 512);       //写入512字节数据
 217   1          
 218   1          #ifdef FM25L04DATASHOW
                      UART0_Printf("\n\n Write to 0x:%x \n",0x0000);
                      for(FM25L04ADDR = 0x00; FM25L04ADDR < 512; FM25L04ADDR ++)
                      {
                          UART0_Printf(" %d ",(int)FM25L04WRStore[FM25L04ADDR]);
                      }
                  #endif
 225   1                      
 226   1          //-------------------------------------------------

⌨️ 快捷键说明

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