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:10组 I2C (FIFO + DMA)

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663791/compiler-tm4c1294ncpdt-10-sets-i2c-fifo-dma

器件型号:TM4C1294NCPDT

工具/软件:TI C/C++编译器

您好、PAL、

我设置10个 I2C 外设 (I2C0~9)来读取/写入数据、并再次遇到硬故障。


如果我在 I2C3 & I2C4 &I2C7上禁用或更改为 FIFO、则该功能没有问题。


请查看我的代码并提供建议、谢谢。

int main (空)

// uint16_t 反转;
 //uint32_t uiLoopTest=0;
 volatile uint32_t ui32Boot = 0;
 uint8_t nPntCnt=25、nPntCnt2=26、nMaxPntCnt=0;
 uint8_t nPalmCnt=30、nPalmCnt2=31、nMaxPalmCnt=0;
 uint8_t i;
 
 G_Shotscope = 1;
  
 #ifdef TI_Board
 G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
                                        SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                                        SYSCTL_CFG_VCO_480)、120000000);
 其他
 G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_12MHz|)
                                        SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                                        SYSCTL_CFG_VCO_480)、120000000);
 #endif
 //GPIO 端口功能初始化
 PortFunctionInit();
 #ifdef TI_Board
 ConfigureDBGUART (3、115200);//无法使用端口0,uart0与 I2C9冲突  
 其他
 ConfigureDBGUART (2、115200);//无法使用端口0,uart0与 I2C9冲突  
 #endif

 UARTprintf ("配置__________________ 好的!!!!!!!!!);

 PowerOnEnable();

 I2C_InitialAll (I2C_EN);
 I2C_DMAInitialAll (I2C_DMA_EN);
       //#define SLAVE_0_EN  0x0001
       //#define SLAVE_1_EN  0x0002
       //#define SLAVE_2_EN  0x0004
       //#define SLAVE_3_EN  0x0008
       //#define SLAVE_4_EN  0x0010
       //#define SLAVE_5_EN  0x0020
       //#define SLAVE_6_EN  0x0040
       //#define SLAVE_7_EN  0x0080
       //#define SLAVE_8_EN  0x0100
       //#define SLAVE_9_EN  0x0200

       //#define I2C_EN (0x3FF) //-->如果定义为0x367,则函数正常
       //#define I2C_DMA_EN (0x3FF) //-->如果定义为0x367,则函数正常

 I2CMaster_Speed (I2C_SPED_400K);
 vfDelay_ms (1);
 
 Flash_Test();  
 while (1){};

void I2C_InitialAll (uint16_t u16MaskCH)

 uint8_t i;
 对于(i=0;i<10;i++)
 {
  if (u16MaskCH &(1 <<I))
  {
   SysCtlPeripheralDisable (I2C_Periph[i]);
   SysCtlPeripheralReset (I2C_Periph[i]);
   SysCtlPeripheralEnable (I2C_Periph[i]);
   while (!SysCtlPeripheralReady (I2C_Periph[i]));

   GPIOPinTypeI2C (I2C_PIN_BASI[i]、I2C_SDA_PIN[i]);
   GPIOPinTypeI2CSCL (I2C_PIN_BASI[i]、I2C_SCL_PIN[i]);
   GPIOPinConfigure (I2C_SDA[i]);
   GPIOPinConfigure (I2C_SCL[i]);
   HWREG (I2C_PIN_BAS[i]+ GPIO_PUR)=(I2C_SDA_PIN[i]|I2C_SCL_PIN[i]);

   I2CRxFIFOConfigSet (I2C_BASE_[i]、(I2C_FIFO_CFG_RX_MASTER_DMA | I2C_FIFO_CFG_RX_TRIG_8));
   I2CTxFIFOConfigSet (I2C_BASE]、(I2C_FIFO_CFG_TX_MASTER_DMA);
   I2CRxFIFOFlush (I2C_BASE_I]);
   I2CTxFIFOFlush (I2C_BASE_I]);

   I2CMInit (&g_sI2CMInst[i]、I2C_BASE[i]、I2C_INT[i]、0xff、0xff、 G_ui32SysClock、1);  
   I2CIntRegister (I2C_base[i]、pISRHandler[i]);
  }
 }
 #if 0
 IF (SLAVE_3_EN 和 u16MaskCH)
 {
  I2CRxFIFOConfigSet (I2C_BASE_3]、I2C_FIFO_CFG_RX_MASTER);
  I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
 }
 IF (SLAVE_4_EN 和 u16MaskCH)
 {
  I2CRxFIFOConfigSet (I2C_BASE_4]、I2C_FIFO_CFG_RX_MASTER);
  I2CTxFIFOConfigSet (I2C_BASE_4]、I2C_FIFO_CFG_TX_MASTER);
 }
 IF (SLAVE_5_EN 和 u16MaskCH)
 {
  I2CRxFIFOConfigSet (I2C_base[5]、I2C_FIFO_CFG_RX_MASTER);
  I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
 }
 IF (SLAVE_7_EN 和 u16MaskCH)
 {
  I2CRxFIFOConfigSet (I2C_base[7]、I2C_FIFO_CFG_RX_MASTER);
  I2CTxFIFOConfigSet (I2C_base[7]、I2C_FIFO_CFG_TX_MASTER);
 }
 其他
 IF (SLAVE_5_EN 和 u16MaskCH)
 {
  I2CRxFIFOConfigSet (I2C_base[5]、I2C_FIFO_CFG_RX_MASTER);
  I2CTxFIFOConfigSet (I2C_BASE]、I2C_FIFO_CFG_TX_MASTER);
 }
 #endif

void I2C_DMAInitialAll (uint16_t u16MaskCH)

 uint8_t i;
 SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
 SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);
 IntEnable (INT_UDMAERR);
 uDMAEnable();
 uDMAControlBaseSet (pui8ControlTable);
 IntEnable (INT_UDMA);
 对于(i=0;i<10;i++)
 {
  #if 0
  if (u16MaskCH &(1 << i)&&(i!= 3)&&(i!=4)&&(i!=5)&&(i!=7))//if (u16MaskCH &(1 << i)&&(i!= 5))
  其他
  if (u16MaskCH &(1 << I)&&(I!= 5))
  #endif
  {
   uDMAChannelAssign (DMA_I2CTX[i]);
   uDMAChannelAttributeDisable (DMA_I2CTX[i]、
     UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR_UDMA_ATTR_REQMASK);
   uDMAChannelControlSet (DMA_I2CTX[i]| UDMA_PRI_SELECT、
     UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARC_4);

   uDMAChannelAssign (DMA_I2CRX[i]);
   uDMAChannelAttributeDisable (DMA_I2CRX[i]、
     UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |(UDMA_ATTR_HIGH_PRIOR_UDMA_ATTR_REQMASK);
   uDMAChannelControlSet (DMA_I2CRX[i]| UDMA_PRI_SELECT、
     UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARC_4);
   //uDMAIntRegister
  }
 }

void I2C_DMAWriteAll (uint16_t u16MaskCH、uint8_t (* pu8TxBuffer)[200]、uint16_t u16Len)

 uint8_t u8CH;
 uint16_t u16Freed=0、u16cnt=0;
 
// DMA 设置===================================================================================================================
 对于(u8ch=0;u8ch<10;u8ch++)
 {
  #if 0
  if (u16MaskCH &(1 << u8CH)&&(u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7))
  其他
  if ((u16MaskCH &(1<<u8CH)) && (u8CH != 5))
  #endif  
  {
   I2CMasterSlaveAddrSet (I2C_base[u8ch]、I2C_SLAVE_ADDR、false);
   uDMAChannelTransferSet (DMA_I2CTX[u8CH]| UDMA_PRI_SELECT、UDMA_MODE_BASIC、
           pu8TxBuffer[u8ch]、((void *)(I2C_base[u8ch]+ I2C_O_FIFODATA)、u16Len);
   uDMAChannelEnable (DMA_I2CTX[u8CH]);
   I2CMasterBurstLengthSet (I2C_base[u8ch]、u16Len);   
  }
 }

// DMA star ========================================================================================================================================
 对于(u8ch=0;u8ch<10;u8ch++)
 {
  #if 0
  if (u16MaskCH &(1 << u8CH)&&((u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7))//
  其他
  if ((u16MaskCH &(1<<u8CH)) && (u8CH != 5))
  #endif
   I2CMasterControl (I2C_base[u8ch]、I2C_MASTER_CMD_FIFO_SINGLE_SEND);
 }
SysCtlDelay (1000);
//I2C5 START ================================================================================================================================================================================================================
 #if 0
 if ((SLAVE_3_EN 和 u16MaskCH)|(SLAVE_4_EN 和 u16MaskCH)|(SLAVE_5_EN 和 u16MaskCH)|(SLAVE_7_EN 和 u16MaskCH))//IF (SLAVE_5_EN 和 u16MaskCH)
 {
//  I2C_Write (I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
//  //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
//  while (I2CMasterBusy (I2C_base[5]));
  IF (SLAVE_3_EN 和 u16MaskCH)
  {
   I2C_Write (3、I2C_SLAVE_ADDR、pu8TxBuffer[3]、u16Len);
  }
  IF (SLAVE_4_EN 和 u16MaskCH)
  {
   I2C_Write (4、I2C_SLAVE_ADDR、pu8TxBuffer[4]、u16Len);
  }
  IF (SLAVE_5_EN 和 u16MaskCH)
  {
   I2C_Write (5、I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
  }
  IF (SLAVE_7_EN 和 u16MaskCH)
  {
   I2C_Write (7、I2C_SLAVE_ADDR、pu8TxBuffer[7]、u16Len);
  }
  
  IF (SLAVE_3_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[3]));
  }
  IF (SLAVE_4_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[4]));
  }
  IF (SLAVE_5_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[5]));
  }
  IF (SLAVE_7_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[7]));
  }
 }
 其他
 IF (SLAVE_5_EN 和 u16MaskCH)
 {
  I2C_Write (5、I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);  <--***** 在调试模式下卡在这里****
  //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
  while (I2CMasterBusy (I2C_base[5]));
 }
 #endif
 
//等待总线空闲===========================================================================================
 while (u16Cnt<5000)
 {
  SysCtlDelay (1000);
  u16Cnt++;
  对于(u8ch=0;u8ch<10;u8ch++)
  {
   if ((u16MaskCH &(1<<u8CH)) && (I2CMasterBusy(I2C_BASE[u8CH]) == false))
    u16Free |=(1 << u8CH);
   
  }
  if (u16MaskCH = u16Free)
   中断;
 }
 if (u16cnt = 5000)
  UARTprintf ("\n 写入错误!!!!");

void I2C_DMAReadAll (uint16_t u16MaskCH、uint8_t (* pu8RxBuffer)[200]、uint16_t u16Len)

 uint8_t u8CH;
 uint16_t u16Freed=0、u16cnt=0;
 
// DMA 设置===================================================================================================================
 对于(u8ch=0;u8ch<10;u8ch++)
 {
  IF (u16MaskCH &(1<<u8CH) && (u8CH != 5))
  {
   I2CMasterSlaveAddrSet (I2C_base[u8ch]、I2C_SLAVE_ADDR、true);
   I2CMasterBurstLengthSet (I2C_base[u8ch]、u16Len);
   uDMAChannelTransferSet (DMA_I2CRX[u8CH]| UDMA_PRI_SELECT、UDMA_MODE_BASIC、
      ((void *)(I2C_base[u8ch]+ I2C_O_FIFODATA)、pu8RxBuffer[u8ch]、u16Len);
   uDMAChannelEnable (DMA_I2CRX[u8CH]);
  }
 }

// DMA star ========================================================================================================================================
 对于(u8ch=0;u8ch<10;u8ch++)
 {
  #if 0
  if (u16MaskCH &(1 << u8CH)&&((u8CH!= 3)&&(u8CH!= 4)&&(u8CH!= 5)&&(u8CH!= 7)))
  其他
  IF (u16MaskCH &(1<<u8CH) && (u8CH != 5))
  #endif
  I2CMasterControl (I2C_base[u8ch]、I2C_MASTER_CMD_FIFO_SINGLE_Receive);
 }

//I2C5 START ================================================================================================================================================================================================================
// if (slave_5_EN 和 u16MaskCH)
// {
//  I2C_Read (I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
//  while (I2CMasterBusy (I2C_base[5]));
// }
 #if 0
 if ((SLAVE_3_EN 和 u16MaskCH)|(SLAVE_4_EN 和 u16MaskCH)|(SLAVE_5_EN 和 u16MaskCH)|(SLAVE_7_EN 和 u16MaskCH))//IF (SLAVE_5_EN 和 u16MaskCH)
 {
//  I2C_Write (I2C_SLAVE_ADDR、pu8TxBuffer[5]、u16Len);
//  //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
//  while (I2CMasterBusy (I2C_base[5]));
  IF (SLAVE_3_EN 和 u16MaskCH)
  {
   I2C_Read (3、I2C_SLAVE_ADDR、pu8RxBuffer[3]、u16Len);
  }
  IF (SLAVE_4_EN 和 u16MaskCH)
  {
   I2C_Read (4、I2C_SLAVE_ADDR、pu8RxBuffer[4]、u16Len);
  }
  IF (SLAVE_5_EN 和 u16MaskCH)
  {
   I2C_Read (5、I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
  }
   IF (SLAVE_7_EN 和 u16MaskCH)
  {
   I2C_Read (7、I2C_SLAVE_ADDR、pu8RxBuffer[7]、u16Len);
  }
  
  IF (SLAVE_3_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[3]));
  }
  IF (SLAVE_4_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[4]));
  }
  IF (SLAVE_5_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[5]));
  }
  IF (SLAVE_7_EN 和 u16MaskCH)
  {
   while (I2CMasterBusy (I2C_base[7]));
  }
 }
 其他
 IF (SLAVE_5_EN 和 u16MaskCH)
 {
  I2C_Read (5、I2C_SLAVE_ADDR、pu8RxBuffer[5]、u16Len);
  //I2C0_FIFO_Write (pu8TxBuffer[5]、u16Len);
  while (I2CMasterBusy (I2C_base[5]));
 }
 #endif
  
//等待总线空闲===========================================================================================
 while (u16Cnt<5000)
 {
  SysCtlDelay (1000);
  u16Cnt++;
  对于(u8ch=0;u8ch<10;u8ch++)
  {
   if ((u16MaskCH &(1<<u8CH)) && (I2CMasterBusy(I2C_BASE[u8CH]) == false))
    u16Free |=(1 << u8CH);
   
  }
  if (u16MaskCH = u16Free)
   中断;
 }
 if (u16cnt = 5000)
  UARTprintf ("\n 报错!!!!");

void Flash_Test (void)

  uint8_t u8i;
   uint8_t data[5];

   //进入串行调试模式
   数据[0]= 0x53;
   数据[1]= 0x45;
   DATA[2]= 0x52;
   数据[3]= 0x44;
   DATA[4]= 0x42;
 for (u8i=0;u8i<10;u8i++)
 {
  if (I2C_EN&(1<<u8i))
  {
   memcpy (&(gau8TxBuf[u8i][0])、data、sizeof (data));
  }
 }
 I2C_DMAWriteAll (I2C_EN、Gau8TxBuf、5);
   delay_1ms ();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    很多时候、当发生硬故障时、它与堆栈有关。 有时它与访问尚未通过 SysCtlPeripheralEnable()启用的外设有关。 由于您说如果处于 DMA 模式、那么您没有遇到硬故障、这意味着故障不可能是由于外设尚未启用所致。 您从 CPU 中的总线故障状态寄存器(BFAULTSTAT)中读取了什么? 请尝试增大堆栈大小、看看这是否会产生任何影响。 我还建议您首先尝试限制 I2C 的数量、然后逐渐逐个增加。

    下面是一个应用手册、展示了如何调试硬故障问题。 www.ti.com/.../spma043.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaa"]我还建议您先尝试限制 I2C 的数量,然后逐步增加一个。 [/报价]

    或者-用两个词来说明这一点、 "雇用 kiss。"

    I (还)注意 A、代码中的"硬编码"延迟-"I2C 调用的级联"可能会"构建"、因此"I2C 外设就绪"(而不是延迟)测试证明更加稳健!

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

    您好!

    我是 QZboy 的同事。

    QZboy 说,只有在使用 i2c+uDMA 同时配置 i2c6和 i2c7时才会失败。

    如何在通过 UDMA 传输数据期间添加延迟?

    我认为这只是硬件操作、对吗?

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

    那么、不带 uDMA 的 i2c6和 i2c7将起作用吗? 只有一个具有 UDMA 的 I2C6能正常工作吗? UDMA 基于来自 I2C 模块的触发器。 一旦它被触发、它将根据它相对于其他通道的优先级开始。 如果没有来自其他通道的更高优先级的待处理操作、它将只会启动。

    同样、我建议您从基础版开始。 首先从一个 I2C 开始。 然后继续使用一个具有 UDMA 的 I2C。 如果这起作用、您将继续添加另一个 I2C、稍后添加 UDMA。 如果您可以让一个具有 UDMA 的 I2C 正常工作、则基本上可以为 I2C 和 UDMA 模块进行正确的配置。 以这种方式调试问题会容易得多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们注意  到在您的程序中出现了3个:"SysCtlDelay(1000);"。   您必须确定此值延迟(始终)是否正确-和/或-如果"外设就绪"呼叫证明卓越。

    供应商(通过许多词语)和我(通过2 、"使用 kiss")都建议将您的程序代码简化为仅那些(目前)会导致故障的部件。

    通常、当任务"数量减少"时、"获得正确的代码操作"会证明"更快、更轻松"。   只有当每项任务都取得了巨大成功时、才应(然后)将另一项任务"添加到混合任务中"。    您当前的方法似乎是:"继续尝试"做一切"-我发现这是"添加不必要的并发症"-并使您的"修复"变得"更难和更长的时间才能实现!"

    再次强调-我将重点介绍您的"仅故障功能"-我怀疑您将(极大地)通过学习:

    • 当这些(目前)失败的职能发挥作用时(如果它们曾经发挥作用)
    • 哪些条件-阻止 -这些功能无法正常工作?   (通常、这需要您每次添加一个其他功能-仔细且系统地。)   这就是 “吻”。

    我必须指出,"即使阅读了您的主题/标题... "Ten Sets I2C"-"Rejects of kiss was most problem"-您的"问题"得到了(几乎)保证!   简化!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、标题令人困惑。
    我想使用10组 I2C 同时读取/写入10个器件、但发现了一些问题。 请参阅以下信息。

    1.逐一启用每个 I2C 外设
    --> I2C3和 I2C4不能使用 DMA,但它在 INTERRUPTMODE 中工作。
    I2C5和 I2C8是同一个 uDMA 通道(请参阅数据表)
    -->我将 I2C5设置为“中断”模式,并将 I2C8设置为 DMA 模式;它现在似乎可以工作。
    I2C6/I2C7单独在中断和 DMA 模式下工作、但不能同时将两者设置为 DMA 模式。
    -->我想这是同一个 uDMA 通道,需要您确认。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    请参考我的回复(2018年2月12日下午2:55)、谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="QZboy"]我想使用10组 I2C 同时读取/写入10个器件

    这(可能)是一个"语言问题"-您不会(实际上)期望"读取/写入10 个"I2C 器件"(同时)-您会吗?    (这正是您的写作所暗示的...完全不可能!)

    供应商代理最有才华的是"挖掘数据表"-如果您寻求更"一般问题解决方法"-我将尝试提供帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们实际上需要同时使用十组 i2c 传输。
    是否有人可以指导我们实施它? 还是无法实现?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="QZboy"]--> I2C3和 I2C4不能使用 DMA,但它在 INTERRUPTMODE 中工作。
    [/报价]

    根据数据表、I2C3和 I2C4使用不同的 DMA 通道。 如果您只将 I2C3与 UDMA 搭配使用、或将 I2C4与 UDMA 搭配使用、但两者不同时使用、是否适合您?

    [引用 user="QZboy"]2. I2C5和 I2C8是同一个 UDMA 通道(请参阅数据表)
    -->我将 I2C5设置为“中断”模式,并将 I2C8设置为 DMA 模式;它现在似乎可以工作。[/QUERT]

    正确的做法是 I2C5和 I2C8共享相同的通道、因此您可以同时在这两个通道上使用 DMA。  

    [引用 user="QZboy"]3. I2C6/I2C7单独在中断和 DMA 模式下工作、但不能同时将两者设置为 DMA 模式。
    -->我想这是同一个 uDMA 通道,需要您确认。

    根据数据表、I2C6使用通道26/27、而 I2C7使用通道28/29。  

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

    [报价用户="Will Wu"]我们真的需要同时使用十组 i2c 传输

    如前所述-很大程度上取决于您对" 同时"的定义。    (假设您打算 "同时"。)

    虽然"MCU's µDMA â"的使用 可能(在某种程度上)自动执行 I2C 传输过程-但" 所有10个 I2C 通道"可以 "在不影响性能的情况下运行"在标准 I2C 数据速率下是有疑问的。   ( 这种"十个 I2C 通道、同时运行"的考虑中、供应商代理的评论将证明(极大)有帮助-并且深受欢迎!)

     有时、MCU 必须"处理 μ µDMA 管理的数据"、在这一过程中、(任何)同步操作超出了我 的识别/理解范围...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、
    我想您打算在您的应用中激活10个 I2C。 我相信您知道 CPU 一次只能对一个 I2C 模块进行写或读操作。 尽管 DMA 模块最多可以支持32个通道、但每次只有一个通道被激活用于传输、而其余通道只是等待它们的转弯。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的关注、"一个且只有一个- I2C 外设模块-可以在任何给定的时间"传输"!"   海报"被拒绝或过度审视"了现实-我的著作试图提醒海报-听到您(供应商)的声音... (五月)现在实现他的"接受!"   也许...