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

📄 52-eepom.lst

📁 AD7705的驱动程序,二通道,可用于检测小电压变化的传感器
💻 LST
📖 第 1 页 / 共 3 页
字号:
 161   1              ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 162   1      
 163   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 164   1              ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;     /* 0000,0010 */
 165   1              ISP_DATA        =       original_data;
 166   1      
 167   1              ISP_IAP_enable();
 168   1      
 169   1              ISP_TRIG        =       0x46;
 170   1              ISP_TRIG        =       0xb9;
 171   1              _nop_();
 172   1      
 173   1              ISP_DATA        =       0x00;
 174   1      
 175   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 176   1              ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 177   1      
 178   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
C51 COMPILER V7.50   52_EEPOM                                                              04/26/2007 11:38:57 PAGE 4   

 179   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 180   1              _nop_();
 181   1      
 182   1              ISP_IAP_disable();
 183   1      
 184   1              if(ISP_DATA     ==      original_data)
 185   1                      return  OK;
 186   1              else
 187   1                      return  ERROR;
 188   1      }
 189          
 190          /* 写数据进 数据Flash存储器, 只在同一个扇区内写,不保留原有数据 */
 191          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源       */
 192          INT8U sequential_write_flash_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 193          {
 194   1              INT16U  i       =       0;
 195   1              INT16U  in_sector_begin_addr    =       0;
 196   1              INT16U  sector_addr     =       0;
 197   1      
 198   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 199   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 200   1                      return  ERROR;
 201   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 202   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 203   1                      return ERROR;
 204   1      
 205   1          /* 擦除 要修改/写入 的扇区 */
 206   1              sector_addr     =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址 */
 207   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 208   1              ISP_ADDRL       =       0x00;
 209   1              ISP_CMD         =       ISP_CMD &       0xf8;           /* 1111,1000 */
 210   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 211   1      
 212   1              ISP_IAP_enable();
 213   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 214   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 215   1              _nop_();
 216   1      
 217   1              for(i = 0; i< counter; i++)
 218   1              {
 219   2                      /* 写一个字节 */
 220   2                      ISP_ADDRH       =       (INT8U)(begin_addr >> 8);
 221   2                      ISP_ADDRL       =       (INT8U)(begin_addr & 0x00ff);
 222   2                      ISP_DATA        =       array[i];
 223   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 224   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 225   2      
 226   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 227   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 228   2                      _nop_();
 229   2      
 230   2                      /* 读回来 */
 231   2                      ISP_DATA        =       0x00;
 232   2      
 233   2                      ISP_CMD         =       ISP_CMD &       0xf8;   /* 1111,1000 */
 234   2                      ISP_CMD     =   ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 235   2      
 236   2                      ISP_TRIG        =       0x46;   /* 触发ISP_IAP命令 */
 237   2                      ISP_TRIG        =       0xb9;   /* 触发ISP_IAP命令 */
 238   2                      _nop_();
 239   2      
 240   2                      /*  比较对错 */
C51 COMPILER V7.50   52_EEPOM                                                              04/26/2007 11:38:57 PAGE 5   

 241   2                      if(ISP_DATA != array[i])
 242   2                      {
 243   3                              ISP_IAP_disable();
 244   3                              return ERROR;
 245   3                      }
 246   2              begin_addr++;
 247   2              }
 248   1              ISP_IAP_disable();
 249   1              return  OK;
 250   1      }
 251          
 252          /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
 253          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源               */
 254          INT8U write_flash_with_protect_in_one_sector(INT16U begin_addr, INT16U counter, INT8U array[])
 255          {
 256   1              INT16U  i       =       0;
 257   1              INT16U  in_sector_begin_addr    =       0;
 258   1              INT16U  sector_addr     =       0;
 259   1              INT16U  byte_addr       =       0;
 260   1      
 261   1              /* 判是否是有效范围,此函数不允许跨扇区操作 */
 262   1              if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 263   1                      return ERROR;
 264   1              in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 265   1              /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */
 266   1              if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 267   1                      return ERROR;
 268   1      
 269   1              /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
 270   1              sector_addr             =       (begin_addr & 0xfe00);  /* 1111,1110,0000,0000; 取扇区地址              */
 271   1              byte_addr               =   sector_addr;                        /* 扇区地址为扇区首字节地址                             */
 272   1      
 273   1              ISP_IAP_enable();
 274   1              for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 275   1              {
 276   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 277   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 278   2      
 279   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 280   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 281   2      
 282   2                      ISP_TRIG        =       0x46;
 283   2                      ISP_TRIG        =       0xb9;
 284   2                      _nop_();
 285   2      
 286   2                      protect_buffer[i]       =       ISP_DATA;
 287   2                      byte_addr++;
 288   2              }
 289   1      
 290   1              /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
 291   1              for(i = 0; i < counter; i++)
 292   1              {
 293   2                      protect_buffer[in_sector_begin_addr] = array[i];
 294   2                      in_sector_begin_addr++;
 295   2              }
 296   1      
 297   1              /* 擦除 要修改/写入 的扇区 */
 298   1              ISP_ADDRH       =       (INT8U)(sector_addr >> 8);
 299   1              ISP_ADDRL       =       0x00;
 300   1              ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 301   1              ISP_CMD         =       ISP_CMD |       SECTOR_ERASE_AP_and_Data_Memory_Command;        /* 0000,0011 */
 302   1      
C51 COMPILER V7.50   52_EEPOM                                                              04/26/2007 11:38:57 PAGE 6   

 303   1              ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 304   1              ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 305   1              _nop_();
 306   1      
 307   1              /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
 308   1              byte_addr       =   sector_addr;                        /* 扇区地址为扇区首字节地址     */
 309   1              for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 310   1              {
 311   2                      /* 写一个字节 */
 312   2                      ISP_ADDRH       =       (INT8U)(byte_addr >> 8);
 313   2                      ISP_ADDRL       =       (INT8U)(byte_addr & 0x00ff);
 314   2                      ISP_DATA        =       protect_buffer[i];
 315   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 316   2                      ISP_CMD         =       ISP_CMD |       PROGRAM_AP_and_Data_Memory_Command;             /* 0000,0010 */
 317   2      
 318   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */
 319   2                      ISP_TRIG        =       0xb9;        /* 触发ISP_IAP命令 */
 320   2                      _nop_();
 321   2      
 322   2                      /* 读回来 */
 323   2                      ISP_DATA        =       0x00;
 324   2      
 325   2                      ISP_CMD         =       ISP_CMD &       0xf8;        /* 1111,1000 */
 326   2                      ISP_CMD         =       ISP_CMD |       READ_AP_and_Data_Memory_Command;        /* 0000,0001 */
 327   2      
 328   2                      ISP_TRIG        =       0x46;        /* 触发ISP_IAP命令 */

⌨️ 快捷键说明

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