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.

[参考译文] TM4C1294NCPDT:I2C 多数据字节传输:被跳过的字节

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/741685/tm4c1294ncpdt-i2c-multiple-data-byte-transfer-bytes-being-skipped

器件型号:TM4C1294NCPDT

我将 I2C1外设与 AT24CM01 EEPROM 搭配使用。  我正在尝试将一些虚拟 值写入 EEPROM、以查看是否可以正确地写入和读取数据。   下面的代码写入 器件的地址 、后跟 一 个2字节存储器地址、后跟50个数据字节。  数据字节的值从0递增到49。

我遇到的问题是缺少数据字节。  例如、当我在示波器上观察传输时、数据字节应该从0增加到 49、但当它运行时 、数据字节被跳过。  (即 1->3->6->9等,而不是0->1->2->3)

如果我 在代码中插入断点(如下突出显示) 、则每个字节都被正确写入、并且代码 工作正常。  删除断点后、会跳过数据字节。  I2CMCS 寄存器中的 BUSY 位似乎从未设置为"1"、因为数据正在计时输出。  我已经包含了用于 设置 I2C1外设的相关代码片段以及简单的测试代码。

我是否错过了设置步骤?

谢谢、

Joe

#define EXTERNAL_MEM_PERIPh         I2C1_BASE

void main (void)

      //--设置 I2C 端口--
   TD_Init_I2CPorts (dwSystemClock);   //dwSystemClock = 120MHz

   ExternalMem_Init (external_MEM_Periph);

// 初始化例程
静态空 TD_Init_I2CPorts (uint32_t dwSystemClock)

   //-启用 I2C1
   ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);
   while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_I2C1))
   {
   }

   ///-使能 I2C1的端口 G 引脚
   ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);


   //--为 I2C 配置 G0和 G1
   ROM_GPIOPinConfigure (GPIO_PG0_I2C1SCL);
   ROM_GPIOPinConfigure (GPIO_PG1_I2C1SDA);

   ROM_GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_1);
   ROM_GPIOPinTypeI2CSCL (GPIO_PORTG_BASE、GPIO_PIN_0);

   //将传输速度设置为400kbps 并脱离系统时钟运行
   I2CMasterInitExpClk (I2C1_base、dwSystemClock、true);

//虚拟变量写入操作
uint32_t externalMem_Init (uint32_t dwCommPort)

   uint32_t dwNumberofBytes = 50;
   uint32_t i;
   volatile uint32_t dwSlaveAdd;
   uint32_t  byLowerAddress = 0x0A;
   volatile uint32_t  byData = 0;
   volatile uint32_t  counter = 0;
   volatile uint32_t dwReturnedData[50];
   volatile uint32_t dwError = 0x000;


   dwSlaveAdd = EXT_MEM_SLAVE_ADDRESS | EXT_MEM_WRITE | EXT_MEM_LOWE_PAGES;

   I2CSlaveAddressSet (external_MEM_Periph、0、dwSlaveAdd);

   //--发送从机地址和上地址
   HWREG (external_MEM_Periph + I2C_O_MSA)= dwSlaveAdd;
   I2CMasterDataPut (external_MEM_Periph、0x00);
   while (I2CMasterBusy (external_MEM_Periph))
      {
       }

   I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_SEND_START);
   while (I2CMasterBusy (external_MEM_Periph))
      {
      }

   //--发送存储器地址的低字节
   I2CMasterDataPut (external_MEM_Periph、byLowerAddress);    //此处为断点
   I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_cont);

   while (I2CMasterBusy (external_MEM_Periph))
      {
      }


   //写入数据
   for (i=0;i < dwNumberofBytes;i++)
      {
       I2CMasterDataPut (external_MEM_Periph、byData);      //此处为断点

       if (((i+1)=dwNumberofBytes)
          {
          I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_finish);
          }
       其他
          {
          I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_send_cont);
          }
       //--等待 Master 完成
       while (I2CMasterBusy (external_MEM_Periph))
          {
          }


       byData++;

      }

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

    Joe、您好!

     您能试试

    更换:

      I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_SEND_START);

      while (I2CMasterBusy (external_MEM_Periph))

       {

       }

      //--发送存储器地址的低字节

      I2CMasterDataPut (external_MEM_Periph、byLowerAddress);  //此处为断点

    其中:

      I2CMasterControl (external_MEM_Periph、I2C_master_CMD_burst_SEND_START);

     while (!I2CMasterBusy (external_MEM_Periph))//添加此代码

       {

       }

      while (I2CMasterBusy (external_MEM_Periph))

       {

       }

      //--发送存储器地址的低字节

      I2CMasterDataPut (external_MEM_Periph、byLowerAddress);  //此处为断点

    您可能希望在代码中以黄色突出显示的第二个位置尝试相同的操作。

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

    您好、Charles、

    就是这样。  我尝试添加一个小延迟、但显然不够长。  感谢您的建议。

    Joe