/*
 * H_Common_STM32F4_SPI.h
 *
 *  Created on: 2024/11/21
 *      Author: egaono-electronics
 */

#ifndef H_COMMON_STM32F4_SPI_H_
#define H_COMMON_STM32F4_SPI_H_

#include "Dev_Conf.h"

#include def_Header_HAL



//----------------------------------------------------------
// Handle SPI用パラメータの構造体
//----------------------------------------------------------
struct sParam_Handle_SPIx{
  uint8_t *puint8_aSPI_TxBuffer;  // 送信Bufferのポインタ
  uint8_t *puint8_aSPI_RxBuffer;  // 受信Bufferのポインタ


  volatile int16_t int16_vSPI_TxIdx;
  volatile int16_t int16_vSPI_RxIdx;

  volatile int16_t int16_vSPI_TxNumber;
  volatile int16_t int16_vSPI_RxNumber;

  volatile uint16_t uint16_vSPI_Mode;

  volatile int16_t int16_vSPI_Semaphore;

  volatile int16_t int16_vSPI_ReceiveEnd;
  volatile int16_t int16_vSPI_Error;

  // SPI 送受信 Timeout
  volatile uint16_t uint16_vTimerSPI;
};



//----------------------------------------------------------
// SPIx : Handle SPI用パラメータの構造体を初期化
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_aSPI_TxBuffer : SPI送信Bufferのポインタ
// uint8_t *puint8_aSPI_RxBuffer : SPI受信Bufferのポインタ

// struct sParam_Handle_SPIx  *pstructParam_Handle_SPIx
//              Handle SPI用パラメータの構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Initialize_Parameter_SPIx(uint8_t *puint8_aSPI_TxBuffer,
                               uint8_t *puint8_aSPI_RxBuffer,
        struct sParam_Handle_SPIx  *pstructParam_Handle_SPIx);



//----------------------------------------------------------
// SPIx 初期化
//----------------------------------------------------------
// 引数;
// SPI_TypeDef *SPIx :
//      where x can be 1 or 2 to select the SPI peripheral.

// SPI_HandleTypeDef *pSpiHandle : SPI handler declaration

// uint32_t uint32_SPI_Mode :
//                  SPI_MODE_MASTER or SPI_MODE_SLAVE

// uint32_t uint32_BaudRatePrescaler : SPIクロック 分周設定

// uint16_t uint16_CLKPolarity : clock polarity :
//                  SPI_POLARITY_LOW or SPI_POLARITY_HIGH


// 戻り値;
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t Initialize_SPIx(SPI_TypeDef *SPIx,
                        SPI_HandleTypeDef *pSpiHandle,
                        uint32_t uint32_SPI_Mode,
                        uint32_t uint32_BaudRatePrescaler,
                        uint32_t uint32_CLKPolarity);



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

// SPI_HandleTypeDef *pHandle_SPIx : SPI handler declaration

// IRQn_Type DMA_Stream_IRQn_Transmit_SPIx : SPI DMA Transmit IRQn
// IRQn_Type DMA_Stream_IRQn_Receive_SPIx : SPI DMA Receive IRQn

// struct sParam_Handle_SPIx *pstructParam_Handle_SPIx :
//              Handle SPI用パラメータの構造体のポインタ

// GPIO_TypeDef *pGPIOx_SPIx_NSS : SPIx_NSS のGPIOポート
// uint16_t uint16_GPIO_Pin_x_SPIx_NSS : SPIx_NSS のGPIOピン

// int16_t int16_Value_Wait_SPI_TxRx : SPI送受信待ちの値

// int16_t int16_NSS_OnOff : 送信終了時NSS ON/OFF選択
//    0 : 送信後 NSSをOFFにする。
//    1 : 送信後 NSSをONのままにする。


// 戻り値;
//   -1 : 処理中
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t SPIx_Master_TxRxByte(uint8_t *puint8_JobNum,
                    SPI_HandleTypeDef *pHandle_SPIx,
                    IRQn_Type DMA_Stream_IRQn_Transmit_SPIx,
                    IRQn_Type DMA_Stream_IRQn_Receive_SPIx,
            struct sParam_Handle_SPIx *pstructParam_Handle_SPIx,
                             GPIO_TypeDef *pGPIOx_SPIx_NSS,
                             uint16_t uint16_GPIO_Pin_x_SPIx_NSS,
                             int16_t int16_Value_Wait_SPI_TxRx,
                             int16_t int16_NSS_OnOff);


#endif /* H_COMMON_STM32F4_SPI_H_ */
