/*
 * H_Common_STM32F4_I2C.c
 *
 *  Created on: 2026/01/29
 *      Author: egaono-electronics
 */

#include "H_Common_STM32F4_I2C.h"



//----------------------------------------------------------
// Handle I2C用パラメータの構造体を初期化
//----------------------------------------------------------
// 引数;
// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Initialize_Parameter_I2Cx(
        struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx = 0;
  pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx = 0;


  pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;  // Timeout監視


  //------------------------------------------------------------
  // Slaveモードで使用するパラメータ
  //------------------------------------------------------------
  // I2C通信開始
  //  0 : 開始待ち
  //  1 : 開始
  pstructParam_Handle_I2Cx->int16_vI2C_TransferInitiated = 0;

  // I2C通信終了
  //  0 : 終了待ち
  //  1 : 終了
  pstructParam_Handle_I2Cx->int16_vI2C_TransferEnded = 0;

  // I2C Clock Speed
  pstructParam_Handle_I2Cx->uint32_vI2C_Clock_Speed
                        = (uint32_t)def_I2C_CLOCK_SPEED;


  //----------------------------------------------------
  // I2C EV割り込みカウンタ TX RX 初期化
  //----------------------------------------------------
  pstructParam_Handle_I2Cx->uint32_vI2C_Count_Slave_TX_RX_EV = 0;
  //------------------------------------------------------------
}



//----------------------------------------------------------
// I2Cx 初期化
//----------------------------------------------------------
// 引数;
// I2C_TypeDef *I2Cx :
//      where x can be 1 or 2 to select the I2C peripheral.
// I2C_HandleTypeDef *pHandle_I2C : I2C handler declaration

// uint32_t uint32_AddressingMode :
//      Specifies if 7-bit or 10-bit addressing mode
//                                              is selected.
//                7bit : I2C_ADDRESSINGMODE_7BIT
//                10bit : I2C_ADDRESSINGMODE_10BIT

// uint32_t uint32_ClockSpeed : Specifies the clock frequency.
//  This parameter must be set to a value lower than 400kHz.

// uint32_t uint32_I2C_Address :
//          Specifies the first device own address.
//          This parameter can be a 7-bit or 10-bit address.


// 戻り値;
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t Initialize_I2Cx(I2C_TypeDef *I2Cx,
                        I2C_HandleTypeDef *pHandle_I2C,
                        uint32_t uint32_AddressingMode,
                        uint32_t uint32_ClockSpeed,
                        uint32_t uint32_I2C_Address)
{
  //------------------------------------------------------------
  // Configure the I2C peripheral
  //------------------------------------------------------------
  pHandle_I2C->Instance             = I2Cx;

  pHandle_I2C->Init.AddressingMode  = uint32_AddressingMode;
  pHandle_I2C->Init.ClockSpeed      = uint32_ClockSpeed;
  pHandle_I2C->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

  pHandle_I2C->Init.DutyCycle       = I2C_DUTYCYCLE_2;

  pHandle_I2C->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  pHandle_I2C->Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
  pHandle_I2C->Init.OwnAddress1     = uint32_I2C_Address;
  pHandle_I2C->Init.OwnAddress2     = 0x00;

  if(HAL_I2C_Init(pHandle_I2C) != HAL_OK)
  {
    // Initialization Error
    return(1);  // NG
  }

  return(0);  // OK
}



//--------------------------------------------------------------
// I2C送受信
//--------------------------------------------------------------

//----------------------------------------------------------
// I2Cx Master送信
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Master_TxByte(uint8_t *puint8_JobNum,
                           I2C_HandleTypeDef *pHandle_I2Cx,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_I2C_StateTypeDef hal_State;
  HAL_StatusTypeDef hal_Status;


  uint32_t uint32_Error;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx = 0;
                                // 送信終了判定用変数クリア


    // TimeOut値設定
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Master_Transmit_IT(pHandle_I2Cx,
        (uint16_t)pstructParam_Handle_I2Cx->uint16_vI2C_SlaveAddress,
                    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer,
                    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber);
    if(hal_Status != HAL_OK){
      uint32_Error = HAL_I2C_GetError(pHandle_I2Cx);
      if(uint32_Error != HAL_I2C_ERROR_AF)
      {
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }

      // Check Timer
      if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
        // Timeout
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }


      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    // TimeOut値設定 : 監視タイマ
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    hal_State = HAL_I2C_GetState(pHandle_I2Cx);
    if(hal_State != HAL_I2C_STATE_READY){
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // 送信終了待ち
    if(pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx
            < pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber){
      // 終了していない場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                    // 監視タイマクリア


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}




//----------------------------------------------------------
// I2Cx Master送信 : NO STOP
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Master_TxByte_NO_STOP(uint8_t *puint8_JobNum,
                           I2C_HandleTypeDef *pHandle_I2Cx,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_I2C_StateTypeDef hal_State;
  HAL_StatusTypeDef hal_Status;


  uint32_t uint32_Error;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx = 0;
                                // 送信終了判定用変数クリア


    // TimeOut値設定
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Master_Seq_Transmit_IT(pHandle_I2Cx,
        (uint16_t)pstructParam_Handle_I2Cx->uint16_vI2C_SlaveAddress,
                    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer,
                    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber,
                    I2C_LAST_FRAME_NO_STOP);
    if(hal_Status != HAL_OK){
      uint32_Error = HAL_I2C_GetError(pHandle_I2Cx);
      if(uint32_Error != HAL_I2C_ERROR_AF)
      {
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }

      // Check Timer
      if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
        // Timeout
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }


      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    // TimeOut値設定 : 監視タイマ
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    hal_State = HAL_I2C_GetState(pHandle_I2Cx);
    if(hal_State != HAL_I2C_STATE_READY){
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // 送信終了待ち
    if(pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx
            < pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber){
      // 終了していない場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                    // 監視タイマクリア


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// I2Cx Master受信
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Master_RxByte(uint8_t *puint8_JobNum,
                           I2C_HandleTypeDef *pHandle_I2Cx,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_StatusTypeDef hal_Status;

  uint32_t uint32_Error;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx = 0;
                                // 受信終了判定用変数クリア


    // TimeOut値設定 : 監視タイマ
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Master_Receive_IT(pHandle_I2Cx,
        (uint16_t)pstructParam_Handle_I2Cx->uint16_vI2C_SlaveAddress,
                    pstructParam_Handle_I2Cx->puint8_aI2C_RxBuffer,
                    pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber);
    if(hal_Status != HAL_OK){
      uint32_Error = HAL_I2C_GetError(pHandle_I2Cx);
      if(uint32_Error != HAL_I2C_ERROR_AF)
      {
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }

      // Check Timer
      if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
        // Timeout
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }


      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    // TimeOut値設定
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // 受信終了待ち
    if(pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx
                < pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber){
      // 終了していない場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                    // 監視タイマクリア


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// I2Cx Master受信 : OTHER_AND_LAST_FRAME
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Master_RxByte_OTHER_AND_LAST_FRAME(
                            uint8_t *puint8_JobNum,
                            I2C_HandleTypeDef *pHandle_I2Cx,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_StatusTypeDef hal_Status;

  uint32_t uint32_Error;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx = 0;
                                // 受信終了判定用変数クリア


    // TimeOut値設定 : 監視タイマ
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Master_Seq_Receive_IT(pHandle_I2Cx,
        (uint16_t)pstructParam_Handle_I2Cx->uint16_vI2C_SlaveAddress,
                    pstructParam_Handle_I2Cx->puint8_aI2C_RxBuffer,
                    pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber,
                    I2C_OTHER_AND_LAST_FRAME);
    if(hal_Status != HAL_OK){
      uint32_Error = HAL_I2C_GetError(pHandle_I2Cx);
      if(uint32_Error != HAL_I2C_ERROR_AF)
      {
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }

      // Check Timer
      if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
        // Timeout
        pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 1;    // NG
        break;
      }


      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    // TimeOut値設定
    pstructParam_Handle_I2Cx->int16_vTimerI2C
                = (uint16_t)def_Time_Wait_I2C_Response;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // 受信終了待ち
    if(pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx
                < pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber){
      // 終了していない場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                    // 監視タイマクリア


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// I2Cx Slave送信
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// uint8_t *puint8_aTxBuffer :
//                  送信データが格納されたBufferのポインタ
// uint16_t uint16_TxNumber : 送信データ数

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Slave_TxByte(uint8_t *puint8_JobNum,
                          I2C_HandleTypeDef *pHandle_I2Cx,
                          uint8_t *puint8_aTxBuffer,
                          uint16_t uint16_TxNumber,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_StatusTypeDef hal_Status;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber
                                    = uint16_TxNumber;
                                    // 送信データ数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_TxIdx = 0;
                                // 送信終了判定用変数クリア

//    pstructParam_Handle_I2Cx->uint32_vI2C_Count_Slave_TX_RX_EV
//                                    = 100000;
    pstructParam_Handle_I2Cx->uint32_vI2C_Count_Slave_TX_RX_EV
                                    = 1000000;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Slave_Seq_Transmit_IT(pHandle_I2Cx,
                            puint8_aTxBuffer, uint16_TxNumber,
                            I2C_LAST_FRAME);
    if(hal_Status != HAL_OK){
      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = 200;
                                // 監視タイマセット


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      HAL_I2C_DisableListen_IT(pHandle_I2Cx);

      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // I2C Slave 送信終了待ち
    if(pstructParam_Handle_I2Cx->int16_vI2C_TransferEnded == 0){
      // 終了していない場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                // 監視タイマクリア


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    HAL_I2C_DisableListen_IT(pHandle_I2Cx);


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// I2Cx Slave受信
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// uint16_t uint16_RxNumber : 受信データ数

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t I2Cx_Slave_RxByte(uint8_t *puint8_JobNum,
                          I2C_HandleTypeDef *pHandle_I2Cx,
                          uint16_t uint16_RxNumber,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  HAL_StatusTypeDef hal_Status;


  int16_t int16_I;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber
                                = uint16_RxNumber;
                                    // 受信データ数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_RxIdx = 0;
                                // 受信終了判定用変数クリア

//    pstructParam_Handle_I2Cx->uint32_vI2C_Count_Slave_TX_RX_EV
//                                    = 100000;
    pstructParam_Handle_I2Cx->uint32_vI2C_Count_Slave_TX_RX_EV
                                    = 1000000;


    // 受信バッファクリア
    for(int16_I = 0;
        int16_I < (int16_t)uint16_RxNumber; int16_I++){
        pstructParam_Handle_I2Cx->puint8_aI2C_RxBuffer[int16_I] = 0;

    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    hal_Status = HAL_I2C_Slave_Seq_Receive_IT(pHandle_I2Cx,
            pstructParam_Handle_I2Cx->puint8_aI2C_RxBuffer,
                           uint16_RxNumber,
                           I2C_FIRST_FRAME);
    if(hal_Status != HAL_OK){
      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = 200;
                                    // 監視タイマセット


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    // Check Timer
    if(pstructParam_Handle_I2Cx->int16_vTimerI2C == 0){
      // Timeout
      HAL_I2C_DisableListen_IT(pHandle_I2Cx);

      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;
                                // 初期化済みフラグクリア

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG
      break;
    }


    // I2C Slave 受信終了待ち
    if(pstructParam_Handle_I2Cx->int16_vI2C_TransferEnded == 0){
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


    pstructParam_Handle_I2Cx->int16_vTimerI2C = -1;
                                    // 監視タイマクリア


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理番号維持
    break;

  case 3:
    HAL_I2C_DisableListen_IT(pHandle_I2Cx);


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}
