[問題]F2系列使用USCI 來與SMBus通訊

楼主
[問題]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
}
1楼
TI的例子头部都有程序演示说明,另外程序也有清楚备注。
我觉得你可能对430单片机较少了解,所以对这些例子的使用并不太清楚(由其是430的模块使用)。由于基础知识的原因可能会造成误解。
另外,最简单的你连问问题的内容都没多写上来就想等着别人为你解说,可想而知你是多么懒的(请别见怪)....。
呵呵!~
2楼
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--;                            
    }
  }
}
3楼
你的贴出来的代码是不易看懂了,但你写的直观格式中我只能提些意见。
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这部分,真的需要亲自去试才能好说...否则真难给你到位的解示。

电脑版 Page created in 0.0781 seconds width 2 queries.