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.

[参考译文] TMS320F280049C:Driverlib I2C MPU6050帮助

Guru**** 2244780 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/753807/tms320f280049c-driverlib-i2c-mpu6050-help

器件型号:TMS320F280049C

大家好、

我正在处理一个项目、在这个项目中、我需要轮询加速计以获取运动数据、但是、当我尝试将 DriverLib 文档中提供的示例代码调整为我的问题时、我遇到了困难。 当我将开发板连接到振荡器时、我注意到以下行为:

C2000:将 MPU 地址写入 I2C 总线

MPU:无 ACK

下面的代码正在尝试请求和读回 MPU-6050的单个寄存器地址。 如果您想查看、我随附了下面的文档 pdf。 有关协议见第34页。

#include "driverlib.h"
#include 
#include 

#define WHO _AM_I 0x75
#define MPU_ADDRESS 0x68

void initI2C();
__interrupt void i2cFIFOISR();

uint16_t MPU_data;
uint16_t status;

void main (){
//* Setup C2000 */
Device_init ();
Device_initGPIO ();

/*为 I2C 设置 GPIO */
GPIO_setPinConfig (GPIO_35_SDAA);
GPIO_setPadConfig (35U、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (35U、GPIO_QUAL_异 步);
GPIO_setPinConfig (GPIO_37_SCLA);
GPIO_setPadConfig (37U、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (37U、GPIO_QUAL_异 步);

/*设置中断*/
Interrupt_initModule();
Interrupt_initVectorTable();
interrupt_register (INT_I2CA、&i2cFIFOISR);

/*调用 i2c 设置函数*/
initI2C();

/*在系统范围内启用中断*/
INTERRUPT_ENABLE (INT_I2CA);
EINT;
ERTM;

I2C_setDataCount (I2CA_BASE、1);


while (1){
while (I2C_isBusBusy (I2CA_BASE)){}
// I2C_putData (I2CA_BASE、WHO_AM_I);
I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE);
I2C_sendStartCondition (I2CA_BASE);
状态= I2C_getStatus (I2CA_BASE);
}
}

void initI2C(){I2C_disableModule(I2CA_BASE)
;

/*为具有50%占空比的400kHz 时钟配置*/
I2C_initMaster (I2CA_BASE、DEVICE_SYSCLK_FREQ、100000、I2C_DUTYCYCLE_33);
I2C_setBitCount (I2CA_BASE、I2C_BITCOUNT_8);
I2C_setSlaveAddress (I2CA_BASE、MPU_ADDRESS);
I2C_setEmulationMode (I2CA_BASE、I2C_emulation_free_run);

I2C_enableInterrupt (I2CA_BASE、I2C_INT_REG_ACCESS_RDY | I2C_INT_STOP_Condition);

I2C_enableFIFO (I2CA_BASE);
I2C_clearInterruptStatus (I2CA_BASE、I2C_INT_RXFF | I2C_INT_TXFF);

I2C_enableModule (I2CA_BASE);
}

__interrupt void i2cFIFOISR (){
I2C_InterruptSource 源;

Source = I2C_getInterruptSource (I2CA_BASE);


开关(源极){
I2C_INTSRC_REG_ACCESS_RDY 案例:

if ((I2C_getStatus (I2CA_BASE)& I2C_STS_NO_ACK)!= 0){
I2C_sendStopCondition (I2CA_BASE);
I2C_clearStatus (I2CA_BASE、I2C_STS_NO_ACK);
}

I2C_setConfig (I2CA_BASE、I2C_MASTER_Receive_MODE);
I2C_putData (I2CA_BASE、WHO_AM_I);
I2C_sendStartCondition (I2CA_BASE);
MPU_DATA = I2C_getData (I2CA_BASE);
I2C_sendStopCondition (I2CA_BASE);
I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE);
中断;

情况 I2C_INTSRC_STOP_Condition:
I2C_sendStopCondition (I2CA_BASE);
MPU_DATA = I2C_getData (I2CA_BASE);
中断;

默认值:
MPU_DATA = I2C_getData (I2CA_BASE);
I2C_sendNACK (I2CA_BASE);
中断;
}


interrupt_clearACKGroup (interrupt_ack_group8);
} 

非常感谢!e2e.ti.com/.../MPU_2D00_6050_5F00_DataSheet_5F00_V3-4.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Edward:

    您是否在靠近从器件(MPU)接口的位置探测 I2C 总线? 确保从设备的数据完整性良好。 此外、确保从器件上的接线正确、即正确的 GPIO 等

    您的 MPU 从地址是否设置为 AD0 (68)或 AD1 (69)? 如果您的硬件设置正确、并且从机接口正确接收到正确的从机地址(您在示波器上看到正确的地址)、则可能是 MPU 上的软件配置问题、因为未看到 ACK。

    如果上述内容不能帮助解决问题、请在从接口提供波形截图。

    最棒的
    Kevin