簡體   English   中英

通過 STM32CUBEMX 的低層函數在中斷模式下兩個 stm32 板之間的 I2C 通信

[英]I2C communication between two stm32 board in interrupt mode by low layer functions of STM32CUBEMX

我正在做一個需要兩個stm32 (stm32f103rb and stm32f429zg)之間數據通信的項目。

我使用stm32f103rb-nucleo examples_ll (I2C _OneBoard_Communication_IT)但它只工作一個字節,之后就停止工作。 我希望它重復工作。

代碼結構與示例在與stm32cubemx存儲庫相關的文件夾中的編寫方式完全相同。

我不知道如何讓它循環工作,通過按下按鈕,每次按下主從按鈕時,通信就會完成。

我已將主完成回調 function 放在這里:

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 function發送到串口發送完成。

但在此之后,它會再工作一次,然后停止。 我檢查了示波器信號顯示,第二次傳輸后 SCL 引腳變為低電平。 謝謝

好久沒用LL了,但是用LL_I2C_DisableIT_EVT(I2C1); ?? 確保在下次傳輸之前再次啟用它。

存在兩個主設備無法通過 I2C 總線相互通信的情況。 因為主設備沒有DEVICE_ADDRESS 主設備只能與從設備通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM