求助关于Using the USCI I2C Master的使用方法?

2019-03-24 12:19发布

最近打算使用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);得到返回值如下
微博桌面截图_20130818210514.jpg
  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也应答了。
130818A001_副本.jpg
我的问题是:我打算使用TI提供的USCI I2C驱动程序来读取MPU6050的数据,但是 MPU6050 里面的寄存器也要初始化,那我该怎么调用函数呢? 向MPU6050中的寄存器赋值呢?
Using the USCI I2C Master即TI提供的程序: Using the USCI I2C Master.zip (141.68 KB, 下载次数: 8) 2013-8-20 15:41 上传 点击文件名下载附件



*******************************************************************************************************************************
以下来自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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
qinkaiabc
1楼-- · 2019-03-24 17:43
 精彩回答 2  元偷偷看……
deweyled
2楼-- · 2019-03-24 22:37
< :TI_MSP430_内容页_SA7 --> 根据文档描述:
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
}

以上观点仅供参考
qinkaiabc
3楼-- · 2019-03-24 23:55
#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;我用示波器看波形,还是上面那个我抓的图。不知道是什么原因?
deweyled
4楼-- · 2019-03-25 03:35
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章