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.

[参考译文] MSP432P401R:使用 MSP432实现 MPU6050

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/677763/msp432p401r-implementing-the-mpu6050-with-msp432

器件型号:MSP432P401R

我正在尝试使用 MPU6050获取导航项目的罗盘读数。 我需要一个有关如何执行它的指南。 我查看了 mspware 中的 driverlib 示例。 我随附了我认为需要用来启动的那个。 如果有人能提供帮助、我将不胜感激。  

/*-版权所有-、BSD
*版权所有(c) 2017、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*--/版权--*/

* MSP432 I2C - EUSCI_B0 I2C 主器件 TX 字节到 MSP432从器件-重复启动
*
说明:此演示通过 I2C 总线连接两个 MSP432。 主
设备*发送到从设备。 这是主代码。 它持续
*传输一组数据、并演示如何实现 I2C
*主发送器、发送多个字节、后跟重复起始
*和读取多个字节。
这是从传感器等 I2C 从器件读取寄存器值的常见操作。
写入的 I2C 的*事务如下所示:
*
______________________________
*|开始| |开始| | |
*| 0x48Addr | 0x04 | 0x48Addr |<10 Byte Read>| Stop |
*| W | | R | | |
*|_________________ _________________ _________________ _________________________________ _________________ |
*
* ACLK = n/a、MCLK = HSMCLK = SMCLK = BRCLK =默认 DCO =~3.0MHz
*
/|\/|\
* MSP432P401 10k 10k MSP432P401
* 从器件 || Master
* -------- |||---
* | P1.6/UCB0SDA|<-|--+-|P1.6/UCB0SDA |
* | || | |
* | || | |
* | P1.7/UCB.S.|<!---- >|P1.7/UCB.S. |
* | | | |
*
(小部分 /*
DriverLib 定义了*/
#include 

/*标准定义*/
#include 
#include 
#include 

/* I2C 从机的从机地址*/
#define SLAVE_ADDRESS 0x1E
#define NUM_OF_REC_Bytes 10

//变量*/
const uint8_t TXData[]={0x04};
static uint8_t RXData[NUM_OF_REC_Bytes];
static volatile uint32_t xferIndex;
static volatile bstool stopSent;

// I2C Master Configuration parameter */
const eUSCI_USCI_USCI_USCI_Config_bytes

EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
3000000、 // SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE 400KBPS、 //所需的100kHz I2C 时钟
0、 //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};

int main (void)
{
/*禁用看门狗*/
MAP_WDT_A_HOLDTimer();

/*为 I2C 选择端口1 -将引脚6、7设置为输入主模块功能、
(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S.)。
*
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、
GPIO_PIN6 + GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);
stopSent = false;
memset (RXData、0x00、NUM_OF_REC_Bytes);

/*以100kHz 的频率将 I2C 主设备初始化为 SMCLK,而不进行自动停止*/
MAP_I2C_initMaster (EUSCI_B0_BASE、&i2cConfig);

/*指定从地址*/
MAP_I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);

/*启用 I2C 模块以启动操作*/
MAP_I2C_enableModule (EUSCI_B0_BASE);
MAP_Interrupt_enableInterrupt (INT_EUSCIB0);

while (1)
{
/*确保最后一个交易已完全发送*/
while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE));

MAP_Interrupt_disableSlepOnIsrExit();

/*发送开始和发送缓冲区的第一个字节。 *
MAP_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、TXData[0]);

//发送第一个字节,现在我们需要启动读取*/
xferIndex = 0;
MAP_I2C_masterReceiveStart (EUSCI_B0_BASE);
MAP_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);

MAP_PCM_gotoLPM0InterruptSafe ();

}
}

/*********
* eUSCIB0 ISR。 重复的启动和发送/接收操作在
该 ISR 内发生*。
秘书长的报告 /
void EUSCIB0_IRQHandler (void)
{
uint_fast16_t status;

STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B0_BASE);
MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、STATUS);

/*将字节接收到接收缓冲区中。 如果我们已接收所有字节、
*发送停止条件*/
IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0)
{
if (xferIndex = NUM_OF_REC_bytes - 2)
{
MAP_I2C_DisableInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_Receive_INTERRUPT0);
MAP_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_STOP_INTERRUPT);

/*
*切换顺序,以便在接收最后一个时设置 STOP
*字节读取字节、以便可以读取下一个字节。
*
MAP_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE);
RXData[xferIndex++]= MAP_I2C_ReceivmasterMultiByteNext (
EUSCI_B0_BASE);
} 其他
{
RXData[xferIndex++]= MAP_I2C_ReceivmasterMultiByteNext (
EUSCI_B0_BASE);
}
}
否则、如果(STATUS & EUSCI_B_I2C_STOP_INTERRUPT)
{
MAP_Interrupt_disableSlepOnIsrExit();
MAP_I2C_DisableInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_STOP_INTERRUPT);
}
}

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

    MSP432器件不再支持 MSPWare。 而 SimpleLink SDK 是要使用的正确软件工具。 作为 SDK 的一部分、除了 SimpleLink MSP432P4 SDK 之外、还提供可从以下 URL 下载的 sail 插件

    www.ti.com/.../simplelink-sdk-sensor-actuator-plugin

    它支持较新的 Bosch BMI160加速计和陀螺仪、并且正在计划其它设备。

    如果您仍然想使用 MSPWare (我们强烈建议您使用)、您可能需要查看 TivaWare 示例以了解如何通过不同的算法运行数据处理
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、
    我说错了。 我所附的示例代码来自 simplelink_msp432p4_sdk_1_60_00_12。 我检查了该链接、但想知道是否有方法在没有 RTOS 的情况下实现它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Akin、

    我怀疑这是一个 TI RTOS 或 FreeRTOS 示例、因为主函数中包含使用 driverlib 进行的器件初始化。 RTOS 示例不是这样做的。 如果您可以向我指出您所指的确切示例、我可以进行双次检查。

    但是、就代码而言、它不是基于 RTOS 的示例
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    示例我从 MSP432 SDK 中的 i2c_master_rw_rw_r栈 重复_start-master_code 开始。 我运行了该示例并在 clk 引脚上放置了一个逻辑电阻器、但我得到的只是噪声。 我可能错了、但我认为它将是100kHz、因为这是我在 I2C 配置中设置的值。

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

    在开始数据传输之前、如果您检查 I2C 线路、那么它们是否显示数据和时钟的高电平? 如果没有、则检查电路板的电源接地是否正确、上拉电阻是否安装在外部。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在使用示波器开始数据传输之前、我确认了 I2C 线路为高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Akin、

    当您运行数据事务时、行发生了切换。 请务必记住在 SCL 上将示波器保持在边缘捕获模式、并确保示波器的分辨率保持在正确的值、以便能够看到100KHz 时钟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确保将范围设置为正确。 每当我运行它时、示波器在 clk 行上显示大约91khz、并且 RX 阵列中只有字符

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我意识到每次运行程序时都必须对传感器进行电源循环、除非 CLK 线不切换且未存储任何数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Akin、

    您能否捕获波形并查看信号上是否存在 NAK 或噪声?