在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验915
    • 文章11
    • 注册2009-09-25
    [問題]F2系列使用USCI 來與SMBus通訊
    請問若參考範例249a中的msp430x26x_SMB_tmp175
    我看不懂它如何傳送與接受資料部份
    有人可以大致說明一下嗎?? 謝謝
    #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {
      if (TXByteCtr)                            // Check TX byte counter
      {
        UCB0TXBUF = *PTxData++;                 // Load TX buffer
        TXByteCtr--;                            // Decrement TX byte counter
      }
      else
      {
        UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
        IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
        __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
      }
    }


    // Timer A0 interrupt service routine
    #pragma vector=TIMERA0_VECTOR
    __interrupt void Timer_A (void)
    {
      if (UCB0RXBUF > 0x20) P1OUT |= 0x01;      // LED on if >32C
      else P1OUT &= ~0x01;                      // LED off
      UCB0CTL0 |= UCMST;                        // Master mode
      while (UCB0CTL1 & UCTXSTP);               // Ensure stop condition got sent
      UCB0CTL1 |= UCTXSTT;                      // I2C start condition
      while (UCB0CTL1 & UCTXSTT);               // Start condition sent?
      UCB0CTL1 |= UCTXSTP;                      // I2C stop condition
    }
    #pragma vector=PORT2_VECTOR
    __interrupt void p2_isr(void)
    {
      P2IFG = 0;
      UCB0I2CSA = 0x19;                         // SMBus Alert response
      UCB0CTL0 |= UCMST;                        // Master mode
      while (UCB0CTL1 & UCTXSTP);               // Ensure stop condition got sent
      UCB0CTL1 |= UCTXSTT;                      // I2C start condition
      while (UCB0CTL1 & UCTXSTT);               // Start condition sent?
      UCB0CTL1 |= UCTXSTP;                      // I2C stop condition
      UCB0I2CSA = 0x48;                         // Slave Address
    }
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分3
      • 经验915
      • 文章11
      • 注册2009-09-25
      DC 我是不了解USCI動作部份
      我不了解若使用I2C 讀取SMbus 有部份IC資料讀取會正確
      START+ADDR(W)+ACK+COMM+ACK+STOP+START+ADDR(R)+ACK+DATA+DATA+NACK+STOP
      上述的SMBUS部份我可以讀取正常
      但若是下列這一種的
      START+ADDR(W)+ACK+COMM+ACK+RSTART+ADDR(R)+ACK+DATA+DATA+NACK+STOP
      我會在ADDR(R)就停止回應SCL為LOW 我不明白為什麼會這樣
      #pragma vector = USCIAB0TX_VECTOR           //傳送中斷副程式
      __interrupt void USCIAB0TX_ISR(void)
      {
        if (IFG2 & UCB0RXIFG)                     //假設 中斷暫存器(IFG2)
        {
          if ( byteCtr == 0 )                     //假設設定接受數量=0
          {
            UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
            *TI_receive_field = UCB0RXBUF;        //將接收資料暫存器 傳出
            TI_receive_field++;                   //接收數量遞增
          }
          else                                   
          {
            *TI_receive_field = UCB0RXBUF;        //將接收資料暫存器 資料放入 接收陣列中
            TI_receive_field++;                
            byteCtr--;                            
          }
        }
        else                                      //假設 中斷暫存器(IFG2)
        {
          if (byteCtr == 0)                       
          {
            UCB0CTL1 |= UCTXSTP;                  // I2C stop condition  
            IFG2 &= ~UCB0TXIFG;                   // Clear USCI_B0 TX int flag
           
          }
          else
          {
            UCB0TXBUF = *TI_transmit_field;       //將傳送陣列資料放入 傳送暫存器中
            TI_transmit_field++;                
            byteCtr--;                            
          }
        }
      }
      微控网感谢您的参与
      Powered by LeadBBS 9.2 .
      Page created in 0.0938 seconds with 6 queries.