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.

[参考译文] MSP432E401Y:I2C 突发写入

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1390928/msp432e401y-i2c-burst-write

器件型号:MSP432E401Y

工具与软件:

我需要在 EEPROM 中写入数据、可以使用突发写入模式。 由于我现在没有 EEPROM、因此我要使用另一个微控制器作为从设备。

 MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、FALSE);
 MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_START);

   while (dataIndex < 6)
   {
    
       MAP_I2CMasterDataPut (I2C2_BASE、EEPROM_w[dataIndex]);

                    if ((dataIndex < 4))
                    {
                        MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
                    }
                    否则 if (dataIndex == 4)
                    {
                        MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

                    }
 UARTprintf ("EEPROM write[%d]= 0x%x\n" 、dataIndex、EEPROM_w[dataIndex]);
                 dataIndex++;
   }
   dataIndex=0;
                 while (MAP_I2CMasterBusy (I2C2_BASE))
                   {
                   }

预期数据 EEPROM[6]={0xAA、0xBB、0xCC、0xDD、0xFF、0xEE};

写入后、我尝试使用突发读取模式进行读取。
EEPROM 读取[0]= 0xAA
EEPROM 读取[1]= 0xAA
EEPROM 读取[2]= 0xbb
EEPROM READ[3]= 0xcc
EEPROM READ[4]= 0xdd
EEPROM READ[5]= 0xff

 0xAA 重复两次、最后一个0xee 缺失

能不能更正我遗漏的地方?

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

    您好!

     请更改以下内容。 我希望它能解决您的问题。  

    发件人:

                     while (MAP_I2CMasterBusy (I2C2_BASE))
                       {
                       }

    收件人:

                     while ( map_I2CMasterBusy (I2C2_base)//将这3行添加到下面原始行的所有位置
                       {
                       }

                     while (map_I2CMasterBusy (I2C2_BASE)//您还保留了这三个原始行。 不要将其移除。  
                       {
                       }

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

    您好、Charles、

    感谢您的答复

    我尝试过,正如你所提到的,我看到同样的问题再次发生。 此外、该代码仍停留在以下行中。

    while ( map_I2CMasterBusy (I2C2_base)//将这3行添加到下面原始行的所有位置
                       {
                       }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可能是因为 UARTprintf。  

    您能在下面尝试一下吗?  

    发件人:

    if( (dataIndex < 4))
                         {
                             MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
                         }
                         else if(dataIndex == 4)
                         {
                             MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);

                         }

    收件人:

    if( (dataIndex < 4))
                         {
                             MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);

                             while(!MAP_I2CMasterBusBusy(I2C2_BASE)); // Add this line                   

                             while(MAP_I2CMasterBusBusy(I2C2_BASE)); // Keep this line.
                    

                         }
                         else if(dataIndex == 4)
                         {

                             MAP_I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);

                             while(!MAP_I2CMasterBusBusy(I2C2_BASE)); // Add this line                   

                             while(MAP_I2CMasterBusBusy(I2C2_BASE)); // Keep this line.


                         }

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

    您好、Charles、

    我尝试做同样的,但它是卡在下面的行本身。 我试图使用步越也,在第一个索引本身,它被卡在那里,没有走出这一行.

      while (map_I2CMasterBusy (I2C2_base)); //保留此行。

    请引导我完成此操作。

    也可以共享其他微控制器中使用的从代码片段

    uint8_t EEPROM_DATA[6]={0x00、0x00、0x00、0x00、0x00};

    void I2C2_IRQHandler (void)

       uint32_t getIntStatus;
       uint32_t getStatus;

       //获取中断状态并清除相同的状态
       getIntStatus = MAP_I2CSlaveIntStatusEx (I2C2_BASE、TRUE);
       MAP_I2CSlaveIntClearEx (I2C2_BASE、getIntStatus);

       //获取数据方向的状态
       getStatus = MAP_I2CSlaveStatus (I2C2_BASE);

        //检查我们是否有数据请求
       if (((getIntStatus 和 I2C_SLAVE_INT_DATA)== I2C_SLAVE_INT_DATA)
       {
          // 处理发送路径的数据中断
           if (((getStatus & I2C_SLAVE_ACT_RREQ)== I2C_SLAVE_ACT_RREQ)
           {
               //dataIndex=0;
             // data = MAP_I2CSlaveDataGet (I2C2_BASE);
               EEPROM_DATA[dataIndex++]= MAP_I2CSlaveDataGet (I2C2_BASE);

           }

            //通过反转数据处理发送路径的数据中断
            //发送之前。
           if (getStatus == I2C_SLAVE_ACT_TREQ)
           {
             
               MAP_I2CSlaveDataPut (I2C2_BASE、EEPROM_DATA[dataIndex++]);

               //map_I2CSlaveDataPut (I2C2_BASE、~(getDataBuff[dataIndex++]);
           }
       }

        //检查总线上是否有停止条件
       if (((getIntStatus & I2C_SLAVE_INT_STOP)== I2C_SLAVE_INT_STOP)
       {
          // 清除索引标志
           dataIndex = 0;
       }
    }

    突发读取可以正常工作、只有突发写入才会出现此问题。

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

    您好!

     您能再次发布修改过的代码吗? 只有您写入 I2C 器件的函数就足够了。 我不需要与 I2C 操作无关的其余代码。  我想看看是否遗漏了任何东西。  

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

    您好、Charles、

    //写入到从属设备

    MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、FALSE);
    MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    while (dataIndex < 6)


    MAP_I2CMasterDataPut (I2C2_BASE、EEPROM_w[dataIndex]);
    if ((dataIndex < 4))

    MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
    while (! MAP_I2CMasterBusy (I2C2_BASE);
    while (MAP_I2CMasterBusy (I2C2_BASE));//代码自身滞留在此处、未继续执行。
    }
    否则 if (dataIndex == 4)

    MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
    while (! MAP_I2CMasterBusy (I2C2_BASE);
    while (MAP_I2CMasterBusy (I2C2_BASE));
    }
    UARTprintf ("EEPROM write[%d]= 0x%x\n"、dataIndex、EEPROM_w[dataIndex]);

    dataIndex++;
    }
    dataIndex=0;

     为了进行测试、我要读回它。 阅读效果很好、因为我也将此相同代码用于其他应用。


           MAP_I2CMasterSlaveAddrSet (I2C2_BASE、SLAVE_ADDRESS、TRUE);
                 MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);
       while (dataIndex < 6)
       {
           MAP_SysCtlDelay (10000);
           EEPROM_w_check[dataIndex]= MAP_I2CMasterDataGet (I2C2_base);
          // map_SysCtlDelay (10000);
                        if ((dataIndex < 4))
                        {
                            MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);
                           // map_SysCtlDelay (10000000);
                        }
                        否则 if (dataIndex == 4)
                        {
                            MAP_I2CMasterControl (I2C2_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

                        }
                        UARTprintf ("EEPROM Read[%d]= 0x%x\n" 、dataIndex、EEPROM_w_check[dataIndex]);
                     dataIndex++;
       }

    谢谢

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

    您好!

     下面是循环遍历6个数据元素的行。 但是、调用 MAP_I2CMasterControl 的条件取决于 dataIndex=4还是 dataIndex<4。   当 dataIndex 为5时会发生什么情况?  

    while (dataIndex < 6)

     如果要传输六个元素、 则不应该从  dataIndex < 4更 改为 dataIndex < 5、而对于 dataIndex == 4更改为 dataIndex == 5也是如此。