打印

MSP430 硬件I2C ,时钟SCLK测量。

[复制链接]
4333|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuhaidianzi|  楼主 | 2013-2-21 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好。。最近遇到MSP430硬件I2C通信问题,因而想测试一下I2C的SCLK信号。但是官网的I2C程序,在程序编译并写入MSP430F5438开发板之后。再用示波器一端接地一端接对应I2C的UCB0SCLK脚未测试到波形的存在。。因而想请教一下。这种测量方法是否正常呢。??是否有其他测量方法呢。?硬件I2C通信时可以在开发板里面单步运行通信程序么。因为程序单步运行在发送数据的过程中会停留在等待发送区为空,但是全速运行时是不会有任何问题的。。

相关帖子

沙发
wuhaidianzi|  楼主 | 2013-2-21 19:07 | 只看该作者
我测试用的程序如下:

#include "msp430x54x.h"

unsigned char TXData;
unsigned char TXByteCtr;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P11SEL |= BIT0 + BIT1 + BIT2;
  P11DIR |= BIT0 + BIT1 + BIT2;
  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 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 0x48;                         // Slave Address is 048h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE;                         // Enable TX interrupt

  TXData = 0x01;                            // Holds TX data

  while (1)
  {
    TXByteCtr = 1;                          // Load TX byte counter

    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
   
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts
   __no_operation();                       // Remain in LPM0 until all data
                                            // is TX'd
                                             
    TXData++;                               // Increment data byte
  }
}

//------------------------------------------------------------------------------
// The USCIAB0_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count.
//------------------------------------------------------------------------------
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4: break;                           // Vector  4: NACKIFG
  case  6: break;                           // Vector  6: STTIFG
  case  8: break;                           // Vector  8: STPIFG
  case 10: break;                           // Vector 10: RXIFG
  case 12:                                  // Vector 12: TXIFG  
    if (TXByteCtr)                          // Check TX byte counter
    {
      UCB0TXBUF = TXData;                   // Load TX buffer
      TXByteCtr--;                          // Decrement TX byte counter
    }
    else
    {
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
      UCB0IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
    }
    break;
  default: break;
  }
}

使用特权

评论回复
板凳
weishukongji| | 2013-2-21 19:20 | 只看该作者
请帮忙确认一下几个问题:

1, 是否有接上拉电阻?

2, 使用哪几个引脚作为I2C 的SCL SDA?

可以使用示波器测量数据波形。

建议安装MSP430ware,使用官方提供的I2C例程修改。

使用特权

评论回复
地板
hawksabre| | 2013-2-21 20:22 | 只看该作者
这个只能帮你顶一个   确实没有用到  呵呵

使用特权

评论回复
5
banalmaster| | 2013-7-5 00:34 | 只看该作者
不知道楼主的问题解决了没有?我也遇到这个问题,用示波器采集不到I2C的信号,但是数据写进去了。

使用特权

评论回复
6
ok2879121| | 2013-7-5 12:03 | 只看该作者
你可以用示波器单次触发就行了

使用特权

评论回复
7
51xlf| | 2013-7-7 00:19 | 只看该作者
可以自己用模拟口编写的。

使用特权

评论回复
8
smilingangel| | 2013-7-7 22:40 | 只看该作者
这样测量应该是可以的啊,I2C总线的SCK我个人理解相当于信号的驱动跟信号参照

使用特权

评论回复
9
angerbird| | 2013-7-9 23:47 | 只看该作者
这样应该是可以的啊,在你进行I2C通讯的时候是可以这样检测的

使用特权

评论回复
10
孙大为1| | 2013-8-2 13:21 | 只看该作者
请问接收中断向量#pragma vector = USCIAB0RX_VECTOR 什么时候会用到,什么情况进入这个中断?

使用特权

评论回复
11
1988020566| | 2013-8-2 23:17 | 只看该作者
这个还是用模拟io口比较好的。

使用特权

评论回复
12
1988020566| | 2013-8-2 23:18 | 只看该作者
程序移植性就很好了。

使用特权

评论回复
13
jiang20100906| | 2013-8-7 12:10 | 只看该作者
我用 MSP430F4152的硬件i2c,也遇到这个问题,没有发送信号。 我怀疑 ti的i2c 有问题。

使用特权

评论回复
14
smilingangel| | 2013-8-7 18:07 | 只看该作者
利用示波器来观察的话是最直观的,在进行数据通讯的时候再测量另一数据线的就可以直观的看到你所发送的数据的二进制形式的高低电平的变化的

使用特权

评论回复
15
angerbird| | 2013-8-7 21:21 | 只看该作者
示波器来测量是很好的,开发中很常见的检测手段的

使用特权

评论回复
16
jiang20100906| | 2013-8-28 15:29 | 只看该作者
可能的原因:
1. 需要先设为输出口,再设置为i2c特殊功能口。
2. 从地址要写对。
3. 要连接好芯片。

使用特权

评论回复
17
xiaox314| | 2013-9-20 00:33 | 只看该作者
搞了我2天了,我不要中断的怎么写啊!

使用特权

评论回复
18
comeon201208| | 2013-9-20 19:13 | 只看该作者
但不运行的时候是那个电平信号的由于时间延迟被错过了,就出现电平状态不正确的,导致一直在等待的

使用特权

评论回复
19
AI_YSD| | 2013-12-16 17:18 | 只看该作者
请问大家用过I2C主从切换吗?就是一会当做主机,一会当做从机,调试了几天没结果!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

146

帖子

0

粉丝