最近打算使用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);得到返回值如下
- _EINT();
- MPU6050Init();
- while(1)
- {
- result= TI_USCI_I2C_slave_present(MPU6050_DEFAULT_ADDRESS);
- }
复制代码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, 下载次数: 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 编辑 ]
此帖出自
小平头技术问答
根据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;我用示波器看波形,还是上面那个我抓的图。不知道是什么原因?
一周热门 更多>