首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用STM32CUBEMX底层函数实现中断模式下两块stm32板卡之间的I2C通信

利用STM32CUBEMX底层函数实现中断模式下两块stm32板卡之间的I2C通信
EN

Stack Overflow用户
提问于 2020-08-20 15:32:24
回答 2查看 1.1K关注 0票数 0

我正在从事一个项目,需要两个stm32 (stm32f103rb and stm32f429zg)之间的数据通信。

我使用的是stm32f103rb-nucleo examples_ll (I2C _OneBoard_Communication_IT),但它只工作一个字节,超过一个字节,它就停止工作了。我希望它能重复工作。

代码结构与示例在与stm32cubemx存储库相关的文件夹中编写的方式完全相同。

我不知道如何让它在循环中工作,通过按下按钮,每次我按下主和从按钮时,通信就会完成。

我把主补全回调函数放在这里:

代码语言:javascript
复制
void Master_Complete_Callback(void)
{
  if(ubNbDataToReceive == 3)
  {
    /* Prepare the generation of a Non ACKnowledge condition after next received bytes */
    LL_I2C_AcknowledgeNextData(I2C1, LL_I2C_NACK);
    
    /* Read character in Receive Data register.
    RXNE flag is cleared by reading data in RXDR register */
    aReceiveBuffer[ubReceiveIndex++] = LL_I2C_ReceiveData8(I2C1);
    ubNbDataToReceive--;

    /* Disable Buffer Interrupts */
    LL_I2C_DisableIT_BUF(I2C1);
  }
  else if(ubNbDataToReceive == 2)
  {
    /* Generate Stop condition */
    LL_I2C_GenerateStopCondition(I2C1);

    /* Read character from Receive Data register.
    RXNE flag is cleared by reading data in RXDR register */
    aReceiveBuffer[ubReceiveIndex++] = LL_I2C_ReceiveData8(I2C1);
    ubNbDataToReceive--;

    /* Read character from shift register.
    RXNE flag is cleared by reading data in RXDR register */
    aReceiveBuffer[ubReceiveIndex++] = LL_I2C_ReceiveData8(I2C1);
    ubNbDataToReceive--;
  }
  else
  {
    if(ubNbDataToReceive > 0)
    {
      /* Read character from shift register.
      RXNE flag is cleared by reading data in RXDR register */
      aReceiveBuffer[ubReceiveIndex++] = LL_I2C_ReceiveData8(I2C2);
      
      /* Update ubNbDataToReceive variable */
      ubNbDataToReceive--;
    }
  }

  if(ubNbDataToReceive == 0)
  {
    /* (1) Disable I2C1 transfer event/error interrupts:
     *  - Disable Events Interrupt
     *  - Disable Error interrupts
     */
    LL_I2C_DisableIT_EVT(I2C1);
    LL_I2C_DisableIT_ERR(I2C1);

        LL_I2C_EnableIT_EVT(I2C1);
    LL_I2C_EnableIT_ERR(I2C1);
    /* Read Received character.
    RXNE flag is cleared by reading of RXDR register */
    if(aReceiveBuffer[ubReceiveIndex-1] == SLAVE_BYTE_TO_SEND)
    {
      /* Turn LED2 On:
       * - Expected byte has been received
       * - Master Rx sequence completed successfully
       */
            
      //LED_On();
            HAL_UART_Transmit_IT(&huart2,(uint8_t*)"#Data transfer is OK!$",strlen("#Data transfer is OK!$"));
            ubNbDataToTransmit     = sizeof(SLAVE_BYTE_TO_SEND);
            ubNbDataToReceive      = sizeof(SLAVE_BYTE_TO_SEND);
    }
    else
    {
      /* Call Error function */
      Error_Callback();
    }
  }
}

很容易理解,传输过程的结束就是当我添加HAL_UART函数发送到串口时,传输完成了。

但在这之后,它又工作了一次,之后它就停止了。我检查了示波器的信号显示,第二次传输后SCL引脚变低。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-22 20:13:56

长时间未使用LL,但使用LL_I2C_DisableIT_EVT(I2C1);进行单次传输后,I2C中断是否禁用??请确保在下次传输之前再次启用它。

票数 0
EN

Stack Overflow用户

发布于 2021-01-07 15:43:41

存在这样一种情况,即两个主设备不能通过I2C总线彼此通信。因为主设备没有DEVICE_ADDRESS。主设备只能与从属设备通信。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63500335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档