This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR5739可以使用MSP430ware里面的driverlib通过i2c读出传感器里面的值吗?比如TMP006、MPU6050?

Other Parts Discussed in Thread: MSP430FR5739, TMP006

我购买了MSP430FR5739的开发板,准备通过i2c读出mpu6050的数据。使用430的硬件i2c,而不是软件模拟i2c。

MSP430ware里面有很多i2c操作的例程。

1、直接操作寄存器

*:\ti\msp430\MSP430ware_1_90_00_30\examples\devices\fr5xx\MSP430FR57xx_Code_Examples\C    目录下面有MSP430FR57xx_uscib0_i2c_04.c、MSP430FR57xx_uscib0_i2c_05.c等九个文件,是在两个MSP430之间使用i2c通信。

2、调用库函数

*:\ti\msp430\MSP430ware_1_90_00_30\driverlib\examples\MSP430FR57xx\eusci_b_i2c   这个目录下的eusci_b_i2c_ex1_masterRxMultiple.c、eusci_b_i2c_ex1_slaveTxMultiple.c等例子使用了库函数[MSP430® Peripheral Driver Library for FR57xx Devices],相比前面的要简单得多,同样,这些例子也是在两个MSP430之间使用i2c进行通信。

我的疑问:能否直接使用MSP430® Peripheral Driver Library for FR57xx Devices中的EUSCI Inter-Integrated Circuit(EUSCI_B_I2C)api函数实现MSP430单片机通过i2c读取MEMS加速度传感器的值?比如TMP006、6ADXL345、MPU6050等等?有没有相应的例子作为参考?

如果只能操作寄存器实现的话,又有没有相应的例子呢?

  • 理论上能用,具体你对比下MEMS的手册里对时序的要求
  • 我现在也遇到这个问题,解决方法是IIC协议中要求在地址位后发送寄存器位,然后接受IIC的寄存器返回值。

    不过EUSCI还不太明白,还在研究。

  • 不论寄存器方式还是DriverLib 都是只能到"Byte" 级别哦,TI的例程也只到byte 级别。

    但是一般I2C器件在Byte之间还有时序和格式要求,要看各个Slave 的data sheet哦,比如有的slave 寄存器地址是1byte长度,有的是2byte的这样,这个需要自己写程序。

    举个例子比如一般I2C的EEPROM 的地址就是 2位长,比如要写 0x1234这个地址的值为FF,I2C地址为A0,顺序就是

    Start (包含写地址) - 0x12 - 0x34 - 0xFF - Stop

    读的话是

    Start (包含写地址) - 0x12 - 0x34 - Start(包含读地址) - xx - Stop

    对应DriverLib比较简单的就是方法就是 用下面的3个函数,都是发送 N个byte,区别的是是否集成 Start 或Stop条件。

    EUSCI_B_I2C_masterSendMultiByteStart (uint16_t baseAddress, uint8_t txData)

    EUSCI_B_I2C_masterSendMultiByteNext (uint16_t baseAddress, uint8_t txData)

    EUSCI_B_I2C_masterSendMultiByteFinish (uint16_t baseAddress, uint8_t txData)


    以上面的例子就是

    EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE,  0x50);

    EUSCI_B_I2C_masterSendMultiByteStart(EUSCI_B0_BASE,  0x12);

    EUSCI_B_I2C_masterSendMultiByteNext(EUSCI_B0_BASE,  0x34);

    EUSCI_B_I2C_masterSendMultiByteFinish(EUSCI_B0_BASE,  0xFF);

    这样就可以给EEPROM写1个byte了。