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

📄 eep_040.lst

📁 c8051f040实验程序含CAN SMBUS IIC
💻 LST
📖 第 1 页 / 共 2 页
字号:
 151   1         return WORD;
 152   1      }
 153          
 154          
 155          //------------------------------------------------------------------------------------
 156          // Interrupt Service Routine
 157          //------------------------------------------------------------------------------------
 158          
 159          
 160          // SMBus interrupt service routine:
 161          
 162          void SMBUS_ISR (void) interrupt 7
 163          {
 164   1         switch (SMB0STA){                   // Status code for the SMBus (SMB0STA register)
 165   2      
 166   2            // Master Transmitter/Receiver: START condition transmitted.
 167   2            // The R/W bit of the COMMAND word sent after this state will
 168   2            // always be a zero (W) because for both read and write,
 169   2            // the memory address must be written first.
 170   2            case SMB_START:
 171   2                SFRPAGE   = SMB0_PAGE;
 172   2                       SMB0DAT = (COMMAND & 0xFE);   // Load address of the slave to be accessed.
 173   2               STA = 0;                      // Manually clear START bit
 174   2               break;
 175   2      
 176   2            // Master Transmitter/Receiver: Repeated START condition transmitted.
 177   2            // This state should only occur during a read, after the memory address has been
 178   2            // sent and acknowledged.
 179   2            case SMB_RP_START:
C51 COMPILER V7.50   EEP_040                                                               12/06/2006 11:04:37 PAGE 4   

 180   2               SFRPAGE   = SMB0_PAGE;
 181   2                       SMB0DAT = COMMAND;            // COMMAND should hold slave address + R.
 182   2               STA = 0;
 183   2               break;
 184   2      
 185   2            // Master Transmitter: Slave address + WRITE transmitted.  ACK received.
 186   2        //    case SMB_MTADDACK:
 187   2        //       SFRPAGE   = SMB0_PAGE;
 188   2      
 189   2      //               SMB0DAT = LOW_ADD;           // Load high byte of memory address
 190   2                                             // to be written.
 191   2       //        break;
 192   2      
 193   2            // Master Transmitter: Slave address + WRITE transmitted.  NACK received.
 194   2            // The slave is not responding.  Send a STOP followed by a START to try again.
 195   2            case SMB_MTADDNACK:
 196   2               SFRPAGE   = SMB0_PAGE;
 197   2                       STO = 1;
 198   2               STA = 1;
 199   2               break;
 200   2      
 201   2            // Master Transmitter: Data byte transmitted.  ACK received.
 202   2            // This state is used in both READ and WRITE operations.  Check BYTE_NUMBER
 203   2            // for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
 204   2            // If LOW_ADD has been sent, check COMMAND for R/W value to determine 
 205   2            // next state.
 206   2            case SMB_MTDBACK:
 207   2               switch (BYTE_NUMBER){
 208   3                  case 2:                    // If BYTE_NUMBER=2, only HIGH_ADD
 209   3                     SMB0DAT = LOW_ADD;      // has been sent.
 210   3                     BYTE_NUMBER--;          // Decrement for next time around.
 211   3                     break;
 212   3                  case 1:                    // If BYTE_NUMBER=1, LOW_ADD was just sent.
 213   3                     if (COMMAND & 0x01){    // If R/W=READ, sent repeated START.
 214   4                       SFRPAGE   = SMB0_PAGE;
 215   4                                STO = 0;
 216   4                        STA = 1;
 217   4      
 218   4                     } else { 
 219   4                          SFRPAGE   = SMB0_PAGE;
 220   4                            SMB0DAT = WORD;      // If R/W=WRITE, load byte to write.
 221   4                        BYTE_NUMBER--;
 222   4                     }
 223   3                     break;
 224   3                  default:                   // If BYTE_NUMBER=0, transfer is finished.
 225   3                SFRPAGE   = SMB0_PAGE;
 226   3      
 227   3                     STO = 1;
 228   3                     SM_BUSY = 0;            // Free SMBus
 229   3                  }
 230   2               break;
 231   2      
 232   2      
 233   2            // Master Transmitter: Data byte transmitted.  NACK received.
 234   2            // Slave not responding.  Send STOP followed by START to try again.
 235   2            case SMB_MTDBNACK:
 236   2                SFRPAGE   = SMB0_PAGE;
 237   2                STO = 1;
 238   2                STA = 1;
 239   2               break;
 240   2      
 241   2            // Master Transmitter: Arbitration lost.
C51 COMPILER V7.50   EEP_040                                                               12/06/2006 11:04:37 PAGE 5   

 242   2            // Should not occur.  If so, restart transfer.
 243   2            case SMB_MTARBLOST:
 244   2              SFRPAGE   = SMB0_PAGE; 
 245   2                       STO = 1;
 246   2               STA = 1;
 247   2               break;
 248   2      
 249   2            // Master Receiver: Slave address + READ transmitted.  ACK received.
 250   2            // Set to transmit NACK after next transfer since it will be the last (only)
 251   2            // byte.
 252   2            case SMB_MRADDACK:
 253   2              SFRPAGE   = SMB0_PAGE;
 254   2                       AA = 0;                       // NACK sent on acknowledge cycle.
 255   2               break;
 256   2      
 257   2            // Master Receiver: Slave address + READ transmitted.  NACK received.
 258   2            // Slave not responding.  Send repeated start to try again.
 259   2            case SMB_MRADDNACK:
 260   2               SFRPAGE   = SMB0_PAGE;
 261   2                       STO = 0;
 262   2               STA = 1;
 263   2               break;
 264   2      
 265   2            // Data byte received.  ACK transmitted.
 266   2            // State should not occur because AA is set to zero in previous state.
 267   2            // Send STOP if state does occur.
 268   2            case SMB_MRDBACK:
 269   2               SFRPAGE   = SMB0_PAGE;
 270   2                       STO = 1;
 271   2               SM_BUSY = 0;
 272   2               break;
 273   2      
 274   2            // Data byte received.  NACK transmitted.
 275   2            // Read operation has completed.  Read data register and send STOP.
 276   2            case SMB_MRDBNACK:
 277   2               SFRPAGE   = SMB0_PAGE;
 278   2                       WORD = SMB0DAT;
 279   2               STO = 1;
 280   2               SM_BUSY = 0;                  // Free SMBus
 281   2               break;
 282   2      
 283   2            // All other status codes meaningless in this application. Reset communication.
 284   2            default:
 285   2             SFRPAGE   = SMB0_PAGE;
 286   2                   STO = 1;                      // Reset communication.
 287   2               SM_BUSY = 0;
 288   2               break;
 289   2            }
 290   1      
 291   1         SI=0;                               // clear interrupt flag
 292   1      }


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

C51 COMPILER V7.50   EEP_040                                                               12/06/2006 11:04:37 PAGE 6   


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

⌨️ 快捷键说明

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