This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430g2553用I2C读取bq27541,读不出数据



请大侠帮忙看下,实现的功能是按下按键,单片机读取BQ27541里面的SOC,然后显示电量,软件调试OK,用实物调试的时候,读不出数据,IE2不能置位,附件是原理图,请大侠帮忙看看,谢谢

  • 附件是程序文件,用I2C通讯,I2c程序是TI官网推荐程序,软件调试OK,硬件调试的时候,读不出数据,IE2不能置位。以下是程序,附件是I2C程序文件,请大侠帮忙看看,谢谢!

    #include "io430g2553.h"
    #include "io430.h"
    #include "F:\项目\程序编写\2016\lib\I2C_USCI\TI_USCI_I2C_master.h"
    #include "bq27541.h"

    #define _I2C_USCI


    #define I2CSLAVEADDR           0x55           // 7-bit slave address
    #define    uint    unsigned int
    #define BUFFERSIZE             32           // # of bytes for Tx & Rx buffers


    unsigned char TxData[BUFFERSIZE];           // Stores data bytes to be TX'd
    unsigned char RxData[BUFFERSIZE];           // Stores data bytes that are RX'd
    unsigned int  SOC;                          // Stores State of Charge
    unsigned int transBytes2UnsignedInt(unsigned char msb, unsigned char lsb);
    void MSP430_bq27541_read(unsigned char cmd, unsigned int bytes);

    unsigned int transBytes2UnsignedInt(unsigned char msb, unsigned char lsb)
    {
      unsigned int tmp;
     
      tmp = ((msb << 8) & 0xFF00);
      return ((unsigned int)(tmp + lsb) & 0x0000FFFF);  
    }

    void MSP430_bq27541_read(unsigned char cmd, unsigned int bytes)
    {
      unsigned char tx[1];
      tx[0] = cmd;
      TI_USCI_I2CWrite(I2CSLAVEADDR, 1, 1, tx);
      TI_USCI_I2CRead(I2CSLAVEADDR, bytes, 0, RxData);
    }

    void main(void)
    {
        WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Time
        BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1 MHz
        DCOCTL = CALDCO_1MHZ;
        P1IES |= BIT0;                            // P1.0选择下降沿中断
        P1IE  |= BIT0;                            // 打开中断使能
        P2DIR |= BIT1+BIT2+BIT3+BIT4;             // 设置P2.1 ,2.2 ,2.3, 2.4 为输出状态
        P2OUT |= BIT1+ BIT2 + BIT3 + BIT4;        // 设置P2.1 ,2.2 ,2.3, 2.4 输出为高
        for(unsigned int i=0;i<65000;i++);                             // 延时
        P2OUT &= ~(BIT1+ BIT2 + BIT3 + BIT4);     // 设置P2.1 ,2.2 ,2.3, 2.4 输出为低
       while (1)
        {
                __enable_interrupt();
           TI_USCI_I2C_transmitinit(I2CSLAVEADDR,I2CCLOCKPRESCALER);
           while ( TI_USCI_I2C_notready() );
           MSP430_bq27541_read(bq27541CMD_SOC_LSB, 2);
           SOC = transBytes2UnsignedInt(RxData[1], RxData[0]);
           __bis_SR_register(SCG1+SCG0+CPUOFF + GIE);
           P2OUT &= ~(BIT1+ BIT2 + BIT3 + BIT4);
        }
    }

    #pragma vector = PORT1_VECTOR
    __interrupt void  PORT1_ISR(void)
    {
            if(P1IFG & 0x01)
          {
             for(unsigned int i=0;i<6000;i++);
             if(P1IFG & 0x01)
             {
                P1IFG ^= 0x01;
                __enable_interrupt();
                TI_USCI_I2C_transmitinit(I2CSLAVEADDR,I2CCLOCKPRESCALER);
                while ( TI_USCI_I2C_notready() );
                MSP430_bq27541_read(bq27541CMD_SOC_LSB, 2);
                SOC = transBytes2UnsignedInt(RxData[1], RxData[0]);
     //         SOC = 90;
              if (SOC == 0)
              {
                while(!(P1IN & BIT0))
                {
                   P2OUT |= BIT1 + BIT4;
                }
              }
                
              else if (0<SOC <= 25)
              {    
                 while (!(P1IN & BIT0))
                 {
                    P2OUT ^= BIT1;
                    for(unsigned int i=0;i<35000;i++);
                 }
              }
              else if(25<SOC && SOC<=55)
              {
                 while (!(P1IN & BIT0))
                 {
                   P2OUT |= BIT1+ BIT2;
                 }
              }
              else if(55<SOC && SOC<=85)
              {
                 while (!(P1IN & BIT0))
                 {
                   P2OUT |= BIT1+ BIT2 + BIT3;
                 }
              }
              else if(85<SOC)
              {
                 while (!(P1IN & BIT0))
                 {
                    P2OUT |= BIT1+ BIT2 + BIT3 + BIT4;
                 }
              }
            }
          }
      __bic_SR_register_on_exit(SCG1+SCG0+CPUOFF);
    }