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.

[参考译文] CCS/MSP432P401R:MSP432的通用 I2C 编码

Guru**** 2596535 points
Other Parts Discussed in Thread: CC2650, CC2650MODA, CC2640

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/648472/ccs-msp432p401r-generic-i2c-coding-for-msp432

器件型号:MSP432P401R
主题中讨论的其他器件:CC2650CC2650MODACC2640

工具/软件:Code Composer Studio

大家好、

我正在尝试为 mpu6050写入 I2C 接口。

对于 IC、将会有单字节和多字节接收、我正在尝试编写通用代码。

我的代码可以很好地进行多字节传输、但单字节传输不起作用。 此外、该代码执行 i2c 传输、单字节传输也不起作用。

如果您能为我提供帮助、我将不胜感激。

当我用德州仪器编写 I2C 驱动程序时、我总是感到沮丧。 我非常了解 I2C 协议、但在为微控制器编写代码时、我需要花费数小时。

我是否有办法了解如何为 I2C 驱动程序编写代码?

此致

#include

#include "MPU6050.h"


const uint8_t PORT_MAPPING 3_3[]=

   //Portmapping EUSCI_B0_SPI_I2C.SCL 至 P3.5、EUSCI_B0_SPI_I2C.SDA 至 P3.7
   PM_NONE、PM_NONE、PM_NONE、PM_NONE、PM_NONE、 PM_UCB.S、PM_NONE、PM_UCB0SDA、
};
#define SLAVE_ADDRESS      0x68
uint8_t NUM_OF_REC_Bytes_B0 = 2;
//const uint8_t TXData[]={0x07};
//const uint8_t TXData[]={0x00};
//static uint8_t RXData[NUM_OF_REC_Bytes];
uint8_t TXData_B0[256]={0x07};
uint8_t* TXDataPtr_B0;
uint8_t RXData_B0[256];
静态易失性 uint32_t xferIndex_B0;
volatile char stopSent_B0;
uint8_t 发送_B0 = 0;
uint8_t TXByteCtr = 0;
uint8_t single = 0;

const eUSCI_I2C_MasterConfig i2cConfig_B0 =

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

void Setup_MPU6050 ()

   //端口映射相应的引脚。 有关详细信息、请参阅上述数组
   MAP_PMAP_configurePorts ((const uint8_t *) port_mapping _3_3、P3MAP、1、PMAP_disable_reconfiguration);
   //为 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SCL 配置 P3.5
   MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN5、GPIO_PRIMARY_MODULE_Function);
   //为 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SDA 配置 P3.7
   MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);

   //配置为 P5.1的上拉电阻使能引脚
   MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P5、GPIO_PIN1);
   //为 P5.1启用中断
   MAP_GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN1);
   //为 P5.1选择中断边沿(高到低)
   MAP_GPIO_interruptEdgeSelect (GPIO_PORT_P5、GPIO_PIN1、GPIO_HIGH_TO_LOW_TRANSITION);

   stopSent_B0 = 0;
   I2C_initMaster (EUSCI_B0_BASE、&i2cConfig_B0);
   I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);

   I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);

   I2C_enableModule (USCI_B0_BASE);
   I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0 + EUSCI_B_I2C_Receive_INTERRUPT0);
   INTERRUPT_enableInterrupt (INT_EUSCIB0);



void MPU6050_ReadReg (uint8_t RegAddress、uint8_t length)

   stopSent_B0 = 0;
   正在发送_B0 = 0;
   num_for_REC_Bytes_B0 =长度;
   如果(长度==1)
       单个= 1;
   其他
       单个= 0;
   I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
   I2C_masterSendMultiByteStart (EUSCI_B0_BASE、RegAddress);
   I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);

   xferIndex_B0 = 0;
   while (!stopSent_B0);

   返回((RXData_B0[0]<< 8)+ RXData_B0[1]);
   返回0;


void MPU6050_WriteReg (uint8_t RegAddress、uint8_t* TxBuffer、uint8_t length)

   正在发送_B0 = 1;
   stopSent_B0 = 0;
   TXByteCtr =长度;
   TXDataPTR_B0 =&TXData_B0[0];
   I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
   I2C_masterSendMultiByteStart (EUSCI_B0_BASE、RegAddress);
   I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);

   while (!stopSent_B0);



空 EUSCIB0_IRQHandler (空)

   uint_fast16_t status;

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

   IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0)
   {
       IF (发送_B0)
       {
           IF (TXByteCtr)
           {
               /*发送下一个数据并递减字节计数器*/
               MAP_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、* TXDataPtr_B0++);
               TXByteCtr B0--;
           }否则
           {
               MAP_I2C_masterSendMultiByteStop (EUSCI_B0_BASE);
               stopSent_B0 = 1;
           }
       }
       其他
       {
           I2C_DisableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
           I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
           I2C_masterReceiveStart (EUSCI_B0_BASE);
           I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
       }
   }
   /*将字节接收到接收缓冲区中。 如果我们已接收所有字节、
    *发送停止条件*/
   IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0)
   {
       if (xferIndex_B0 = NUM_OF_REC_Bytes_B0 - 2)
       {
           ///map_I2C_DisableInterrupt (EUSCI_B1_base、EUSCI_B_I2C_Receive_INTERRUPT0);
           ///map_I2C_enableInterrupt (EUSCI_B1_base、EUSCI_B_I2C_STOP_INTERRUPT);

           /*
            *切换顺序,以便在接收最后一个时设置 STOP
            *字节读取字节、以便可以读取下一个字节。
            *


               MAP_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE);
           RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (
                   EUSCI_B0_BASE);
       }
       否则、如果(xferIndex_B0 = NUM_OF_REC_Bytes_B0 - 1)
       {
           RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
           I2C_DisableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
           I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
           xferIndex_B0 = 0;
           stopSent_B0 = 1;
       }
       其他
       {
           RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (
                   EUSCI_B0_BASE);
       }
   }
   否则、如果(STATUS & EUSCI_B_I2C_STOP_INTERRUPT)
   {
       MAP_I2C_DisableInterrupt (EUSCI_B0_BASE、
                                EUSCI_B_I2C_STOP_INTERRUPT);
   }