请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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); } }