/*
 * H_Common_STM32F4_I2C.h
 *
 *  Created on: 2026/01/25
 *      Author: egaono-electronics
 */

#ifndef H_COMMON_STM32F4_I2C_H_
#define H_COMMON_STM32F4_I2C_H_

#include "Dev_Conf.h"

#include def_Header_HAL



//----------------------------------------------------------
// I2C Slave Addressのbit長の定義 : Address 7bit or 10bit
//----------------------------------------------------------
#define def_I2C_7BITS_ADDRESS   0
#define def_I2C_10BITS_ADDRESS  1



#define def_Time_Wait_I2C_Response  100



//------------------------------------------
#define  def_I2C_CLOCK_SPEED  100000
#define  def_I2C_CLOCK_SPEED_100k  100000
#define  def_I2C_CLOCK_SPEED_400k  400000
//------------------------------------------



// Master or Slave
#define def_I2C_Master 0
#define def_I2C_Slave 1


// Master Mode Selected
#define defMASTER_MODE_TRANSMITTER       0x01
#define defMASTER_MODE_RECEIVER          0x00



//----------------------------------------------------------
// Handle I2C用パラメータの構造体
//----------------------------------------------------------
struct sParam_Handle_I2Cx{
  uint8_t *puint8_aI2C_TxBuffer;  // 送信Bufferのポインタ
  uint8_t *puint8_aI2C_RxBuffer;  // 受信Bufferのポインタ


  volatile uint16_t uint16_vI2C_TxIdx;  // 送信終了判定用変数
  volatile uint16_t uint16_vI2C_RxIdx;  // 受信終了判定用変数

  volatile uint16_t uint16_vI2C_TxNumber;  // 送信データ数
  volatile uint16_t uint16_vI2C_RxNumber;  // 受信データ数

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

  // I2Cデバイスの Slave Address
  volatile uint16_t uint16_vI2C_SlaveAddress;

  // I2C Clock Speed
  volatile uint32_t uint32_vI2C_Clock_Speed;


  volatile int16_t int16_vTimerI2C;  // Timeout監視


  // I2C Master/Slave選択
  //  0 : Master
  //  1 : Slave
  volatile int16_t int16_vI2C_Master_Slave;


  volatile int16_t int16_vI2C_Initialize_Done;
                                    // 初期化済みフラグ


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

  // I2C通信終了
  //  0 : 終了待ち
  //  1 : 終了
  volatile int16_t int16_vI2C_TransferEnded;

  // I2C Slave 送受信フラグ
  //  Slave受信 : I2C_DIRECTION_RECEIVE
  //  Slave送信 : I2C_DIRECTION_TRANSMIT
  volatile uint8_t uint8_vI2C_TransferDirection;


  // I2C EV割り込みカウンタ TX RX
  volatile uint32_t uint32_vI2C_Count_Slave_TX_RX_EV;

  // I2C Slaveエラーフラグ
  volatile int16_t int16_vI2C_Slave_Error;
  //--------------------------------------------------------
};



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


// 戻り値;
//    なし
//----------------------------------------------------------
void Initialize_Parameter_I2Cx(
        struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx);



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

// I2C_HandleTypeDef *pHandle_I2Cx : 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_I2Cx,
                        uint32_t uint32_AddressingMode,
                        uint32_t uint32_ClockSpeed,
                        uint32_t uint32_I2C_Address);



//--------------------------------------------------------------
// 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);




//----------------------------------------------------------
// 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);



//----------------------------------------------------------
// 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);



//----------------------------------------------------------
// 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);



//----------------------------------------------------------
// 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);



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

// I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

// uint8_t *puint8_aRxBuffer :
//                  受信データを格納するBufferのポインタ
// 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,
//                          uint8_t *puint8_aRxBuffer,
                          uint16_t uint16_RxNumber,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx);



#endif /* H_COMMON_STM32F4_I2C_H_ */
