在线情况
楼主
  • 头像
  • 级别
    • 积分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
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    TI的例子头部都有程序演示说明,另外程序也有清楚备注。
    我觉得你可能对430单片机较少了解,所以对这些例子的使用并不太清楚(由其是430的模块使用)。由于基础知识的原因可能会造成误解。
    另外,最简单的你连问问题的内容都没多写上来就想等着别人为你解说,可想而知你是多么懒的(请别见怪)....。
    呵呵!~
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分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--;                            
          }
        }
      }
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      你的贴出来的代码是不易看懂了,但你写的直观格式中我只能提些意见。
      START+ADDR(W)+ACK+COMM+ACK+STOP+START+ADDR(R)+ACK+DATA+DATA+NACK+STOP
      这段格式中,有两处启动和停止的关联动作。符合IIC操作的格式。
      而START+ADDR(W)+ACK+COMM+ACK+RSTART+ADDR(R)+ACK+DATA+DATA+NACK+STOP
      上面格式中有两次启动,而只有一次停止。不知道是不是这些关联性动作是不是没做对。
      我只能针对这些直观的东西给你意见。对IIC这部分,真的需要亲自去试才能好说...否则真难给你到位的解示。
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      Powered by LeadBBS 9.2 .
      Page created in 0.1719 seconds with 5 queries.