3361|6

13

帖子

1

TA的资源

一粒金砂(初级)

楼主
 

TI 的I2C代码,不出结果,有个点看不懂,求指教 [复制链接]

代码如下,不知道为什么开的是RX中断,却用TX中断向量接受,我下到片子里,发现连时钟都没有输出,我用的G2553的LaunchPad
  1. //******************************************************************************
  2. //  MSP430G2xx3 Demo - USCI_B0 I2C Master RX multiple bytes from MSP430 Slave
  3. //
  4. //  Description: This demo connects two MSP430's via the I2C bus. The slave
  5. //  transmits to the master. This is the master code. It continuously
  6. //  receives an array of data and demonstrates how to implement an I2C
  7. //  master receiver receiving multiple bytes using the USCI_B0 TX interrupt.
  8. //  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
  9. //
  10. //  *** to be used with "msp430g2xx3_uscib0_i2c_11.c" ***
  11. //
  12. //                                /|\  /|\
  13. //               MSP430G2xx3      10k  10k     MSP430G2xx3
  14. //                   slave         |    |        master
  15. //             -----------------   |    |  -----------------
  16. //           -|XIN  P3.1/UCB0SDA|<-|---+->|P3.1/UCB0SDA  XIN|-
  17. //            |                 |  |      |                 |
  18. //           -|XOUT             |  |      |             XOUT|-
  19. //            |     P3.2/UCB0SCL|<-+----->|P3.2/UCB0SCL     |
  20. //            |                 |         |                 |
  21. //
  22. //  D. Dang
  23. //  Texas Instruments Inc.
  24. //  February 2011
  25. //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
  26. //******************************************************************************
  27. #include

  28. unsigned char *PRxData;                     // Pointer to RX data
  29. unsigned char RXByteCtr;
  30. volatile unsigned char RxBuffer[128];       // Allocate 128 byte of RAM

  31. int main(void)
  32. {
  33.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  34.   P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  35.   P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  36.   UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  37.   UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  38.   UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  39.   UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  40.   UCB0BR1 = 0;
  41.   UCB0I2CSA = 0x02;                         // Slave Address is 048h
  42.   UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  43.   IE2 |= UCB0RXIE;                          // Enable RX interrupt

  44.   while (1)
  45.   {
  46.     PRxData = (unsigned char *)RxBuffer;    // Start of RX buffer
  47.     RXByteCtr = 5;                          // Load RX byte counter
  48.     while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
  49.     UCB0CTL1 |= UCTXSTT;                    // I2C start condition
  50.     __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
  51.                                             // Remain in LPM0 until all data
  52.                                             // is RX'd
  53.     __no_operation();                       // Set breakpoint >>here<< and
  54.   }                                         // read out the RxBuffer buffer
  55. }

  56. //-------------------------------------------------------------------------------
  57. // The USCI_B0 data ISR is used to move received data from the I2C slave
  58. // to the MSP430 memory. It is structured such that it can be used to receive
  59. // any 2+ number of bytes by pre-loading RXByteCtr with the byte count.
  60. //-------------------------------------------------------------------------------
  61. #pragma vector = USCIAB0TX_VECTOR
  62. __interrupt void USCIAB0TX_ISR(void)
  63. {
  64.   RXByteCtr--;                              // Decrement RX byte counter
  65.   if (RXByteCtr)
  66.   {
  67.     *PRxData++ = UCB0RXBUF;                 // Move RX data to address PRxData
  68.     if (RXByteCtr == 1)                     // Only one byte left?
  69.       UCB0CTL1 |= UCTXSTP;                  // Generate I2C stop condition
  70.   }
  71.   else
  72.   {
  73.     *PRxData = UCB0RXBUF;                   // Move final RX data to PRxData
  74.     __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  75.   }
  76. }

复制代码

最新回复

抱歉,我理解错了,你贴的主机程序在接收时是应该主动输出SCL给从机. 我也看了下TI的例程,你贴的代码开始处的include后面没有器件头文件了,另外主函数开始处的从机地址也跟例程不一样,当然这只要跟从机程序一致就行,G2553的USCI_B0 I2C是在P1.6和P1.7,TI例程开头的图示变成了P3.1和P3.2,你测量时应该没有弄错吧?另外,上拉电阻接了吗? 例程应该没啥问题,或者你看看例程4的单字节接收,跟这个类似。 msp430g2xx3_uscib0_i2c_04.c//******************************************************************************//  MSP430G2xx3 Demo - USCI_B0 I2C Master RX single bytes from MSP430 Slave////  Description: This demo connects two MSP430's via the I2C bus. The master//  reads from the slave. This is the master code. The data from the slave//  transmitter begins at 0 and increments with each transfer. The received//  data is in R5 and is checked for validity. If the received data is//  incorrect, the CPU is trapped and the P1.0 LED will stay on. The USCI_B0//  RX interrupt is used to know when new data has been received.//  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz////                                /|\  /|\//               MSP430G2xx3      10k  10k     MSP430G2xx3//                   slave         |    |        master//             -----------------   |    |  -----------------//           -|XIN  P1.7/UCB0SDA||P1.7/UCB0SDA  XIN|-//            |                 |  |      |                 | 32kHz//           -|XOUT             |  |      |             XOUT|-//            |     P1.6/UCB0SCL||P1.6/UCB0SCL     |//            |                 |         |             P1.0|--> LED////  D. Dang//  Texas Instruments Inc.//  February 2011//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10//******************************************************************************#include "msp430g2553.h" unsigned char RXData;unsigned char RXCompare; void main(void){  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT  P1OUT &= ~BIT0;                           // P1.0 = 0  P1DIR |= BIT0;                            // P1.0 output  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0  P1SEL2|= BIT6 + BIT7;                     // 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 = 12;                             // fSCL = SMCLK/12 = ~100kHz  UCB0BR1 = 0;  UCB0I2CSA = 0x048;                        // Slave Address is 048h  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation  IE2 |= UCB0RXIE;                          // Enable RX interrupt  RXCompare = 0;                            // Used to check incoming data   while (1)  {    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent    UCB0CTL1 |= UCTXSTT;                    // I2C start condition    while (UCB0CTL1 & UCTXSTT);             // Start condition sent?    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts     if (RXData != RXCompare)                // Trap CPU if wrong    {      P1OUT |= BIT0;                        // P1.0 = 1      while (1);                            // Trap CPU    }     RXCompare++;                            // Increment correct RX value  }} // USCI_B0 Data ISR#pragma vector = USCIAB0TX_VECTOR__interrupt void USCIAB0TX_ISR(void){  RXData = UCB0RXBUF;                       // Get RX data  __bic_SR_register_on_exit(CPUOFF);        // Exit LPM0}复制代码  详情 回复 发表于 2013-8-27 16:39
 
点赞 关注

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
顶,不行就改模拟,比较通用。。。。。。。

点评

感谢斑竹友情帮顶,是时候试试模拟了  详情 回复 发表于 2013-8-27 08:29
 
个人签名我的博客
 

回复

277

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
楼主,建议你先稍微学习一下430的中断架构然后再稍微看一下芯片数据手册中的Interrupt Vector Addresses章节,然后你就会明白了。

你贴的是主机程序,主机是负责接收,处于接收状态,你让它输出什么时钟呢?

点评

再请教下,I2C中时钟信号不是master输出的吗?  详情 回复 发表于 2013-8-27 08:27
 
 
 

回复

13

帖子

1

TA的资源

一粒金砂(初级)

4
 

回复 板凳wojiaomt 的帖子

再请教下,I2C中时钟信号不是master输出的吗?

点评

抱歉,我理解错了,你贴的主机程序在接收时是应该主动输出SCL给从机. 我也看了下TI的例程,你贴的代码开始处的include后面没有器件头文件了,另外主函数开始处的从机地址也跟例程不一样,当然这只要跟从机程序  详情 回复 发表于 2013-8-27 16:39
 
 
 

回复

13

帖子

1

TA的资源

一粒金砂(初级)

5
 

回复 沙发zhaojun_xf 的帖子

感谢斑竹友情帮顶,是时候试试模拟了
 
 
 

回复

277

帖子

0

TA的资源

纯净的硅(中级)

6
 
原帖由 erduoII 于 2013-8-27 08:27 发表
再请教下,I2C中时钟信号不是master输出的吗?

抱歉,我理解错了,你贴的主机程序在接收时是应该主动输出SCL给从机.

我也看了下TI的例程,你贴的代码开始处的include后面没有器件头文件了,另外主函数开始处的从机地址也跟例程不一样,当然这只要跟从机程序一致就行,G2553的USCI_B0 I2C是在P1.6和P1.7,TI例程开头的图示变成了P3.1和P3.2,你测量时应该没有弄错吧?另外,上拉电阻接了吗?

例程应该没啥问题,或者你看看例程4的单字节接收,跟这个类似。

msp430g2xx3_uscib0_i2c_04.c
  1. //******************************************************************************
    //  MSP430G2xx3 Demo - USCI_B0 I2C Master RX single bytes from MSP430 Slave
    //
    //  Description: This demo connects two MSP430's via the I2C bus. The master
    //  reads from the slave. This is the master code. The data from the slave
    //  transmitter begins at 0 and increments with each transfer. The received
    //  data is in R5 and is checked for validity. If the received data is
    //  incorrect, the CPU is trapped and the P1.0 LED will stay on. The USCI_B0
    //  RX interrupt is used to know when new data has been received.
    //  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
    //
    //                                /|\  /|\
    //               MSP430G2xx3      10k  10k     MSP430G2xx3
    //                   slave         |    |        master
    //             -----------------   |    |  -----------------
    //           -|XIN  P1.7/UCB0SDA|<-|---+->|P1.7/UCB0SDA  XIN|-
    //            |                 |  |      |                 | 32kHz
    //           -|XOUT             |  |      |             XOUT|-
    //            |     P1.6/UCB0SCL|<-+----->|P1.6/UCB0SCL     |
    //            |                 |         |             P1.0|--> LED
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  February 2011
    //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    #include "msp430g2553.h"

unsigned char RXData;
unsigned char RXCompare;

  • void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      P1OUT &= ~BIT0;                           // P1.0 = 0
      P1DIR |= BIT0;                            // P1.0 output
      P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
      P1SEL2|= BIT6 + BIT7;                     // 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 = 12;                             // fSCL = SMCLK/12 = ~100kHz
      UCB0BR1 = 0;
      UCB0I2CSA = 0x048;                        // Slave Address is 048h
      UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
      IE2 |= UCB0RXIE;                          // Enable RX interrupt
      RXCompare = 0;                            // Used to check incoming data

  •   while (1)
      {
        while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
        UCB0CTL1 |= UCTXSTT;                    // I2C start condition
        while (UCB0CTL1 & UCTXSTT);             // Start condition sent?
        UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
        __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts

  •     if (RXData != RXCompare)                // Trap CPU if wrong
        {
          P1OUT |= BIT0;                        // P1.0 = 1
          while (1);                            // Trap CPU
        }

  •     RXCompare++;                            // Increment correct RX value
      }
    }

  • // USCI_B0 Data ISR
    #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {
      RXData = UCB0RXBUF;                       // Get RX data
      __bic_SR_register_on_exit(CPUOFF);        // Exit LPM0
    }
    复制代码

    点评

    非常感谢你的回复,我再仔细调调,这个东西按理来说应该可以的  详情 回复 发表于 2013-8-29 08:24
     
     
     

    回复

    13

    帖子

    1

    TA的资源

    一粒金砂(初级)

    7
     

    回复 6楼wojiaomt 的帖子

    非常感谢你的回复,我再仔细调调,这个东西按理来说应该可以的
     
     
     

    回复
    您需要登录后才可以回帖 登录 | 注册

    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表