3784|4

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

求助关于Using the USCI I2C Master的使用方法? [复制链接]

最近打算使用MSP430的i2c驱动MPU6050.

我更改了TI_USCI_I2C_master.h头文件中的一些定义:
#define SDA_PIN 0x80                                  // msp430g2553 UCB0SDA pin
#define SCL_PIN 0x40                                  // msp430g2553 UCB0SCL pin



就是将SDA和SCL这两个引脚对应到MSP430LAUNCHPAD的引脚上。

对MPU6050的初始化我只用了这个的函数TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);

在主函数中:我使用TI_USCI_I2C_slave_present(MPU6050_DEFAULT_ADDRESS);得到返回值如下
  1.   _EINT();
  2.   MPU6050Init();
  3.   while(1)
  4.   {
  5.           result= TI_USCI_I2C_slave_present(MPU6050_DEFAULT_ADDRESS);

  6.   }
复制代码
TI_USCI_I2C_slave_present(unsigned char slave_address);函数的解释如下


下面的图示我用示波器抓的图,表明从地址已发送,mpu6050也应答了。

我的问题是:我打算使用TI提供的USCI I2C驱动程序来读取MPU6050的数据,但是 MPU6050 里面的寄存器也要初始化,那我该怎么调用函数呢? 向MPU6050中的寄存器赋值呢?
Using the USCI I2C Master即TI提供的程序: Using the USCI I2C Master.zip (141.68 KB, 下载次数: 9)



*******************************************************************************************************************************
以下来自Ti员工的解释:
函数1: void TI_USCI_I2C_receiveinit(unsigned char slave_address,  unsigned char prescale)
     这个函数用来初始化I2C模块,建议在上电初始化时使用,为了让系统健壮性更好,可以在检测到I2C错误,或者I2C总线挂掉时重新调用下本函数.
函数2: TI_USCI_I2C_slave_present(MPU6050_DEFAULT_ADDRESS);
   函数是用来检测从设备是否在线的。这个函数在读写操作调用之前调用,确保从设备地址是正确的。如果不判断这个,有可能造成I2C总线挂掉。具体原因以后探讨。
函数3: void TI_USCI_I2C_transmit(unsigned char byteCount, unsigned char *field)
    本函数用来发送I2C数据,可以用在主机写从机寄存器的应用。 在使用本函数前把需要设置的从设备寄存器及数值放到*field指定的缓冲区中。 楼主要初始化MPU6050的寄存器就用该函数。
函数4: void TI_USCI_I2C_receive(unsigned char byteCount, unsigned char *field)
  这个函数用来主机读从机数据。这是个基本函数,应用到具体芯片,需要和函数3配合使用。例如如果要读MPU6050的寄存器0X05的数值,
需要如下调用:
unsigned char TXBUF[10]={0x05,0x00,};
unsigned char RXBUF[10];

  TI_USCI_I2C_transmit(1, TXBUF);
  TI_USCI_I2C_receive(1,RXBUF);


[ 本帖最后由 qinkaiabc 于 2013-8-20 07:41 编辑 ]

捕获.PNG (7.12 KB, 下载次数: 0)

捕获.PNG

捕获1.PNG (7.09 KB, 下载次数: 0)

捕获1.PNG

捕获2.PNG (75.25 KB, 下载次数: 0)

捕获2.PNG

最新回复

试试这样设置的波形 unsigned char PWR_MGMT[10]={PWR_MGMT_1,0x00}; unsigned char SMPLRT[10]=SMPLRT_DIV, 0x07}; unsigned char CON[10]={CONFIG, 0x06}; unsigned char GYRO[10]={GYRO_CONFIG, 0x18}; unsigned char ACCEL[10]={ACCEL_CONFIG, 0x01}; void MPU6050Init() { TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12); while(TI_USCI_I2C_notready());   TI_USCI_I2C_transmit(2, PWR_MGMT);   while(TI_USCI_I2C_notready()); TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12); while(TI_USCI_I2C_notready());   TI_USCI_I2C_transmit(2, SMPLRT);   while(TI_USCI_I2C_notready()); TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12); while(TI_USCI_I2C_notready());   TI_USCI_I2C_transmit(2, CON);   while(TI_USCI_I2C_notready()); TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12); while(TI_USCI_I2C_notready());   TI_USCI_I2C_transmit(2, GYRO);   while(TI_USCI_I2C_notready()); TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12); while(TI_USCI_I2C_notready());   TI_USCI_I2C_transmit(2, ACCEL); while(TI_USCI_I2C_notready()); } }  详情 回复 发表于 2013-8-19 22:57
 
点赞 关注
个人签名

回复
举报

2781

帖子

417

TA的资源

五彩晶圆(中级)

沙发
 


MPU6050的地址也正确发送了

点评

根据文档描述: TI_USCI_I2C_slave_present应该只是做IIC侦测。 如果要进行数据传输需要一下几个函数配合来做。 TI_USCI_I2C_receiveinit TI_USCI_I2C_transmitinit TI_USCI_I2C_receive TI_USCI_I2C_trans  详情 回复 发表于 2013-8-18 21:56
 
个人签名
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

回复 沙发qinkaiabc 的帖子

根据文档描述:
TI_USCI_I2C_slave_present应该只是做IIC侦测。

如果要进行数据传输需要一下几个函数配合来做。
TI_USCI_I2C_receiveinit
TI_USCI_I2C_transmitinit
TI_USCI_I2C_receive
TI_USCI_I2C_transmit

借用文档中的代码说明

#include "msp430x26x.h"
#include "TI_USCI_I2C_master.h"
unsigned char array[5] = { 0x1, 0x2, 0x3, 0x4, 0x5 };
void main(void)
{
    WDTCTL = WDTPW+ WDTHOLD; // Disable Watchdog
    _EINT(); // enable interrupts
   TI_USCI_I2C_transmitinit(0x48,0x3f); // 0x48是从机地址(这里应该是你的芯片的地址替换),0x3f是速率。
    while( TI_USCI_I2C_notready() ); // wait for bus to be free
    TI_USCI_I2C_transmit(3,array); // 传输3Byte数据。这里的3Byte数据就是要传输的。根据6050 的数据手册,单字节写 是  从机地址 + 器件内部地址 + 写入数据。这里你就要改成2Byte传输,而且第一Byte是从机内部地址,第二Byte为要写入数据
    // of array
    LPM0; // put CPU to sleepduring
    // communication
}

以上观点仅供参考

点评

#include \"mpu6050.h\" 根据6050 的数据手册,单字节写 是 从机地址 + 器件内部地址 + 写入数据,依次将这些数据写入下面数组中 unsigned char PWR_MGMT[10]={MPU6050_DEFAULT_ADDRESS,PWR_MGMT_1,0x00}; uns  详情 回复 发表于 2013-8-19 22:07
 
 
 

回复

2781

帖子

417

TA的资源

五彩晶圆(中级)

4
 

回复 板凳deweyled 的帖子

#include "mpu6050.h"

根据6050 的数据手册,单字节写 是  从机地址 + 器件内部地址 + 写入数据,依次将这些数据写入下面数组中
unsigned char PWR_MGMT[10]={MPU6050_DEFAULT_ADDRESS,PWR_MGMT_1,0x00};
unsigned char SMPLRT[10]={MPU6050_DEFAULT_ADDRESS,SMPLRT_DIV, 0x07};
unsigned char CON[10]={MPU6050_DEFAULT_ADDRESS,CONFIG, 0x06};
unsigned char GYRO[10]={MPU6050_DEFAULT_ADDRESS,GYRO_CONFIG, 0x18};
unsigned char ACCEL[10]={MPU6050_DEFAULT_ADDRESS,ACCEL_CONFIG, 0x01};

void MPU6050Init()
{
TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
if(TI_USCI_I2C_slave_present(MPU6050_DEFAULT_ADDRESS))
{
  TI_USCI_I2C_transmit(3, PWR_MGMT);
  while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(3, SMPLRT);
  while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(3, CON);
  while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(3, GYRO);
  while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(3, ACCEL);
}
}



问题是MSP430的UCB0TXBUF一直在发送0x01;我用示波器看波形,还是上面那个我抓的图。不知道是什么原因?
 
个人签名
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

5
 

回复 4楼qinkaiabc 的帖子

试试这样设置的波形

unsigned char PWR_MGMT[10]={PWR_MGMT_1,0x00};
unsigned char SMPLRT[10]=SMPLRT_DIV, 0x07};
unsigned char CON[10]={CONFIG, 0x06};
unsigned char GYRO[10]={GYRO_CONFIG, 0x18};
unsigned char ACCEL[10]={ACCEL_CONFIG, 0x01};

void MPU6050Init()
{
TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(2, PWR_MGMT);
  while(TI_USCI_I2C_notready());

TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(2, SMPLRT);
  while(TI_USCI_I2C_notready());

TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(2, CON);
  while(TI_USCI_I2C_notready());

TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(2, GYRO);
  while(TI_USCI_I2C_notready());

TI_USCI_I2C_transmitinit(MPU6050_DEFAULT_ADDRESS, 12);
while(TI_USCI_I2C_notready());
  TI_USCI_I2C_transmit(2, ACCEL);
while(TI_USCI_I2C_notready());
}
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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