在线情况
楼主
  • 头像
  • 级别
    • 积分7
    • 经验58
    • 文章6
    • 注册2010-11-22
    MSP430247 硬件I2C程序
    各位,新年好!祝大家新年工作愉快!
    谁能给我个硬件I2C操作AT24C02的程序?
    我老是卡住,有时通有时不通,谁能帮帮忙啊,郁闷了很久!
    下面是我的程序,哪位有空帮看下:

    void I2CInit(unsigned char SA)
    {
      P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0
      UCB0CTL1 |= UCSWRST;                      // Enable SW reset
      UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
      UCB0BR0 = 80;                             // fSCL = SMCLK/80 = ~100kHz
      UCB0BR1 = 0;
      UCB0I2CSA = SA;                         // Slave Address is 2ch
      UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
    }
    uint16 NVMRead(uint16 addr)
    {
        unsigned char data;
        I2CInit(0x50);
        while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
        UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        while((IFG2 & UCB0TXIFG)==0);
        UCB0TXBUF = (unsigned char) (addr&0x00ff);////eeprom low addr
        while((IFG2 & UCB0TXIFG)==0); //老是卡在这个位置,而且断电重来都不行.但是有时候通,只要不通了断电也没用。
        IFG2 &= ~UCB0TXIFG;                                      

        UCB0CTL1 &= ~UCTR;             // I2C RX,
        while (UCB0CTL1 & UCTXSTP);               // 判断总线是否被释放
        UCB0CTL1 |= UCTXSTT;           // Start condition
        while((UCB0CTL1&UCTXSTT)==1);
        while((IFG2&UCB0RXIFG)==0);
        data = UCB0RXBUF;
        delay100us();
        UCB0CTL1 |= UCTXSTP + UCTXNACK;
        while((UCB0CTL1 & UCTXSTP)==1);  
        return data;
    }
     
    uint8 NVMWrite(uint16 addr, uint8 data)
    {
        I2CInit(0x50);
        while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
        UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        while((IFG2 & UCB0TXIFG)==0);
        UCB0TXBUF = (unsigned char) (addr&0x00ff);
        while((IFG2 & UCB0TXIFG)==0);
        UCB0TXBUF = data;
        while((IFG2 & UCB0TXIFG)==0);
        UCB0CTL1 |= UCTXSTP + UCTXNACK;                    // I2C stop condition    
        while((UCB0CTL1 & UCTXSTP)==1);
        delayms(10);
        return 1;
    }
     
    void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      BCSCTL1=CALBC1_16MHZ;  
      DCOCTL=CALDCO_16MHZ;        //DCOCLK设置16M
      BCSCTL2 = DIVM0 | DIVS0;  //16M DCOCLK经2分频得到8M MCLK和8M SMCLK
     
      NVMRead(0);
     
    }
     
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分7
      • 经验58
      • 文章6
      • 注册2010-11-22
      感谢版主的关注!
      问题已经解决了,解决办法:在每次I2C操作之间需要留一点时间!我留了1ms。
      我之前的Main里面有连续调用导致Stop和下一个Start时序上挨的太近,所以出错,只是出错了以后不知道是MSCU原因还是外设的原因,I2C会很久没有响应,在这种情况下我开贴的Main也是不通的。
      具体是什么导致长时间不通,首先MCU程序能跑,波形可以看到。所以我估计还是外设对于错误时序没有响应,类似进入死机状态。
      TI的I2C用查询不是很安全,万一不通全死了,我想中断会更合理,后续还是要改中断方式。
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分7
        • 经验58
        • 文章6
        • 注册2010-11-22
        版主,借帖子咨询下,我现在有个库文件是针对430F2xx系列编译的,后续我想用430F5xx系列,是否可以通用呢?还是必须重新编译,环境为IAR。
        微控网感谢您的参与
        在线情况
        4
        • 头像
        • 级别
          • 积分7
          • 经验58
          • 文章6
          • 注册2010-11-22
          版主意思如果IAR的版本已经包含新的5xx器件型号就可以直接在430f5xx上引用430f2xx的库吗?
          微控网感谢您的参与
          Powered by LeadBBS 9.2 .
          Page created in 0.0938 seconds with 6 queries.