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

📄 smb_ex2.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
 237   2               break;
 238   2      
 239   2            // Master Transmitter: Data byte transmitted.  ACK received.
 240   2            // This state is used in both READ and WRITE operations.  Check BYTE_NUMBER
C51 COMPILER V7.06   SMB_EX2                                                               05/20/2004 15:09:37 PAGE 5   

 241   2            // for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
 242   2            // If LOW_ADD has been sent, check COMMAND for R/W value to determine 
 243   2            // next state.
 244   2            case SMB_MTDBACK:
 245   2               switch (BYTE_NUMBER){
 246   3                  case 2:                    // If BYTE_NUMBER=2, only HIGH_ADD
 247   3                     SMB0DAT = LOW_ADD;      // has been sent.
 248   3                     BYTE_NUMBER--;          // Decrement for next time around.
 249   3                     break;
 250   3                  case 1:                    // If BYTE_NUMBER=1, LOW_ADD was just sent.
 251   3                     if (COMMAND & 0x01){    // If R/W=READ, sent repeated START.
 252   4                        STO = 0;
 253   4                        STA = 1;
 254   4      
 255   4                     } else { 
 256   4                        SMB0DAT = WORD;      // If R/W=WRITE, load byte to write.
 257   4                        BYTE_NUMBER--;
 258   4                     }
 259   3                     break;
 260   3                  default:                   // If BYTE_NUMBER=0, transfer is finished.
 261   3                     STO = 1;
 262   3                     SM_BUSY = 0;            // Free SMBus
 263   3                  }
 264   2               break;
 265   2      
 266   2      
 267   2            // Master Transmitter: Data byte transmitted.  NACK received.
 268   2            // Slave not responding.  Send STOP followed by START to try again.
 269   2            case SMB_MTDBNACK:
 270   2               STO = 1;
 271   2               STA = 1;
 272   2               break;
 273   2      
 274   2            // Master Transmitter: Arbitration lost.
 275   2            // Should not occur.  If so, restart transfer.
 276   2            case SMB_MTARBLOST:
 277   2               STO = 1;
 278   2               STA = 1;
 279   2               break;
 280   2      
 281   2            // Master Receiver: Slave address + READ transmitted.  ACK received.
 282   2            // Set to transmit NACK after next transfer since it will be the last (only)
 283   2            // byte.
 284   2            case SMB_MRADDACK:
 285   2               AA = 0;                       // NACK sent on acknowledge cycle.
 286   2               break;
 287   2      
 288   2            // Master Receiver: Slave address + READ transmitted.  NACK received.
 289   2            // Slave not responding.  Send repeated start to try again.
 290   2            case SMB_MRADDNACK:
 291   2               STO = 0;
 292   2               STA = 1;
 293   2               break;
 294   2      
 295   2            // Data byte received.  ACK transmitted.
 296   2            // State should not occur because AA is set to zero in previous state.
 297   2            // Send STOP if state does occur.
 298   2            case SMB_MRDBACK:
 299   2               STO = 1;
 300   2               SM_BUSY = 0;
 301   2               break;
 302   2      
C51 COMPILER V7.06   SMB_EX2                                                               05/20/2004 15:09:37 PAGE 6   

 303   2            // Data byte received.  NACK transmitted.
 304   2            // Read operation has completed.  Read data register and send STOP.
 305   2            case SMB_MRDBNACK:
 306   2               WORD = SMB0DAT;
 307   2               STO = 1;
 308   2               SM_BUSY = 0;                  // Free SMBus
 309   2               break;
 310   2      
 311   2            // All other status codes meaningless in this application. Reset communication.
 312   2            default:
 313   2               STO = 1;                      // Reset communication.
 314   2               SM_BUSY = 0;
 315   2               break;
 316   2            }
 317   1      
 318   1         SI=0;                               // clear interrupt flag
 319   1      }
 320          
 321          
 322          /********************************************************************************************************/
 323          /********************************************************************************************************/
 324          /********************************************************************************************************/
 325          /********************************************************************************************************/
 326          //uint8  xdata EepromBuf[16];
 327          /*********************************************************************************************************
 328          ** 函数名称: EepromReadBuf
 329          ** 功能描述: 从指定的地址开始读出指定的字节数放入缓冲区
 330          ** 输 入:   address,bytenumber
 331          ** 输 出:   无
 332          ** 全局变量: EepromBuf
 333          ** 调用模块: SM_Receive
 334          ** 注  意:此函数不可重入,使用前要先申请信号量
 335          ** 作 者: 刘宝贵
 336          ** 日 期: 2004年5月5日
 337          **-------------------------------------------------------------------------------------------------------
 338          ** 修改人:
 339          ** 日 期:
 340          **-------------------------------------------------------------------------------------------------------
 341          *********************************************************************************************************/
 342          /*
 343          void EepromReadBuf (uint16 address ,uint8 bytenumber)
 344          {
 345              uint8 data i;
 346              if(bytenumber>16)
 347                  bytenumber=16;
 348              for(i=0;i<bytenumber;i++)
 349              {
 350                  EepromBuf[i] = SM_Receive(CHIP_A, address++);
 351              }
 352          }
 353          /*********************************************************************************************************
 354          ** 函数名称: EepromWriteBuf
 355          ** 功能描述: 从指定的地址开始写入缓冲区内指定的字节数
 356          ** 输 入:   address,bytenumber
 357          ** 输 出:   无
 358          ** 全局变量: EepromBuf OSWait 
 359          ** 调用模块: SM_Send
 360          ** 注  意:此函数不可重入,使用前要先申请信号量
 361          ** 作 者: 刘宝贵
 362          ** 日 期: 2004年5月5日
 363          **-------------------------------------------------------------------------------------------------------
 364          ** 修改人:
C51 COMPILER V7.06   SMB_EX2                                                               05/20/2004 15:09:37 PAGE 7   

 365          ** 日 期:
 366          **-------------------------------------------------------------------------------------------------------
 367          *********************************************************************************************************/
 368          /*
 369          void EepromWriteBuf (uint16 address ,uint8 bytenumber)
 370          {
 371              uint8 data i;
 372              if(bytenumber>16)
 373                  bytenumber=16;
 374              for(i=0;i<bytenumber;i++)
 375              {
 376                  SM_Send(CHIP_A, address++, EepromBuf[i]);
 377                  OSWait(K_TMO,(10*OS_TICKS_PER_SEC)/1000);//delay10ms
 378              }
 379          }
 380          /*********************************************************************************************************
 381          ** 函数名称: EepromReadByte
 382          ** 功能描述: 从指定的地址读出一个字节数据
 383          ** 输 入:   address,bytenumber
 384          ** 输 出:   所读数据
 385          ** 全局变量: 无
 386          ** 调用模块: SM_Receive
 387          ** 注  意:此函数不可重入,使用前要先申请信号量
 388          ** 作 者: 刘宝贵
 389          ** 日 期: 2004年5月5日
 390          **-------------------------------------------------------------------------------------------------------
 391          ** 修改人:
 392          ** 日 期:
 393          **-------------------------------------------------------------------------------------------------------
 394          *********************************************************************************************************/
 395          uint8 EepromReadByte (uint16 address)
 396          {
 397   1          return(SM_Receive(CHIP_A, address));
 398   1      }
 399          /*********************************************************************************************************
 400          ** 函数名称: EepromReadWord
 401          ** 功能描述: 从指定的地址读出一个字节数据
 402          ** 输 入:   address,bytenumber
 403          ** 输 出:   所读数据
 404          ** 全局变量: 无
 405          ** 调用模块: SM_Receive
 406          ** 注  意:此函数不可重入,使用前要先申请信号量
 407          ** 作 者: 刘宝贵
 408          ** 日 期: 2004年5月5日
 409          **-------------------------------------------------------------------------------------------------------
 410          ** 修改人:
 411          ** 日 期:
 412          **-------------------------------------------------------------------------------------------------------
 413          *********************************************************************************************************/
 414          uint16 EepromReadWord (uint16 address)
 415          {
 416   1          uint16 data temp;
 417   1          temp  = EepromReadByte (address);
 418   1          temp  = temp<<8;
 419   1          temp |= EepromReadByte (address+1);
 420   1          return(temp);
 421   1      }
 422          /*********************************************************************************************************
 423          ** 函数名称: EepromWriteByte
 424          ** 功能描述: 在指定的地址写入指定的字节
 425          ** 输 入:   address,temp
 426          ** 输 出:   无
C51 COMPILER V7.06   SMB_EX2                                                               05/20/2004 15:09:37 PAGE 8   

 427          ** 全局变量: 
 428          ** 调用模块: SM_Send
 429          ** 注  意:此函数不可重入,使用前要先申请信号量
 430          ** 作 者: 刘宝贵
 431          ** 日 期: 2004年5月5日
 432          **-------------------------------------------------------------------------------------------------------
 433          ** 修改人:
 434          ** 日 期:
 435          **-------------------------------------------------------------------------------------------------------
 436          *********************************************************************************************************/
 437          void EepromWriteByte(uint16 address ,uint8 temp)
 438          {
 439   1          SM_Send(CHIP_A, address, temp);
 440   1          OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
 441   1      }
 442          /*********************************************************************************************************
 443          ** 函数名称: EepromWriteWord
 444          ** 功能描述: 在指定的地址写入指定的字节
 445          ** 输 入:   address,temp16
 446          ** 输 出:   无
 447          ** 全局变量: 
 448          ** 调用模块: SM_Send
 449          ** 注  意:此函数不可重入,使用前要先申请信号量
 450          ** 作 者: 刘宝贵
 451          ** 日 期: 2004年5月5日
 452          **-------------------------------------------------------------------------------------------------------
 453          ** 修改人:
 454          ** 日 期:
 455          **-------------------------------------------------------------------------------------------------------
 456          *********************************************************************************************************/
 457          void EepromWriteWord(uint16 address ,uint16 temp16)
 458          {
 459   1          SM_Send(CHIP_A, address++, (uint8)(temp16>>8));
 460   1          OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
 461   1          SM_Send(CHIP_A, address, (uint8)(temp16));
 462   1          OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
 463   1      }
 464          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    500    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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