#include "bsp_spi.h"
#include "elog.h"
// #include "delay.h"
 
extern SPI_HandleTypeDef hspi5;
SPI_HandleTypeDef *testSPIHandle = &hspi5;


SPI_HELPER_TypeDef * SPI_HELPER_Init( )
{
    SPI_HELPER_TypeDef *Handle = (SPI_HELPER_TypeDef *)malloc(sizeof(SPI_HELPER_TypeDef));
    if (Handle == NULL)
    {
        return NULL;
    }
 
	Handle->hspi = NULL;
	Handle->rx_tx = SPI_WORKMODE_RX_TX;
	Handle->trans_mode = SPI_Trans_Polling;
	Handle->rcv_mode = SPI_Trans_Polling;
 
	Handle->transferring = 0;
 

	Handle->obj =NULL;
	Handle->callback =NULL;
    return Handle;
}


int SPI_HELPER_Setup_Trans_mode( SPI_HELPER_TypeDef * spihelper, uint8_t trans_mode )
{
  spihelper->trans_mode =trans_mode;
  spihelper->rcv_mode =trans_mode;
  return 0;
}
int SPI_HELPER_Setup_Rcv_mode( SPI_HELPER_TypeDef * spihelper, uint8_t rcv_mode )
{
  spihelper->rcv_mode =rcv_mode;
  return 0;
}

int SPI_HELPER_Setup_WokMode_RX_TX( SPI_HELPER_TypeDef * spihelper, uint8_t rx_tx )
{
  spihelper->rx_tx =rx_tx;
  return 0;
}

int SPI_HELPER_Set_Rcv_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size)
{
	spihelper->rcv_buf = buf;
	spihelper->rcv_size = size;
  return 0;
}
int SPI_HELPER_Set_Trans_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size)
{
  	spihelper->trans_buf = buf;
	spihelper->trans_size = size;
	return 0;
}

int SPI_HELPER_Set_Callback( SPI_HELPER_TypeDef * spihelper, void *obj, callback_fun func)
{
  	spihelper->obj = obj;
	spihelper->callback = func;
	return 0;
}

void SPI_Test(void) 
{ 
  uint8_t txData[4] = {0x9F, 0x00, 0x00, 0x00}; 
  uint8_t rxData[4] = {0};   //   
  SPI_TransmitReceive(txData, rxData, 4); 
  log_i("Manufacturer ID: 0x%02X\n", rxData[1]);  // EF
  log_i("Memory Type: 0x%02X\n", rxData[2]);   // 40 
  log_i("Capacity: 0x%02X\n", rxData[3]);     // 19
}  


void SPI_TransmitReceive(uint8_t* txData, uint8_t* rxData, uint16_t size) 
{ 
  HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_RESET); 
  HAL_SPI_TransmitReceive(testSPIHandle, txData, rxData, size, HAL_MAX_DELAY); 
  HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_SET); 
} 

// void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI)
// {
// 	GPIO_InitTypeDef GPIO_InitStructure;
//     __HAL_RCC_GPIOB_CLK_ENABLE();   		// 使能GPIOB时钟

//     // //PB6  SCL PB7初始化设置
//     // GPIO_Initure.Pin	= pSoftIIC->scl_pin ;
//     // GPIO_Initure.Mode	= GPIO_MODE_OUTPUT_PP;  // 推挽输出
//     // GPIO_Initure.Pull	= GPIO_PULLUP;          // 上拉
//     // GPIO_Initure.Speed	= GPIO_SPEED_FAST;     // 快速
//     // HAL_GPIO_Init( pSoftIIC->scl_port, &GPIO_Initure );

//     // //  SDA PB7 初始化设置
//     // GPIO_Initure.Pin	= pSoftIIC->sda_pin;
//     // HAL_GPIO_Init( pSoftIIC->sda_port, &GPIO_Initure ); 
    
//     // GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
//     // GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1); 


// 	// 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
// 	// GPIO_InitTypeDef GPIO_InitStructure;
// 	// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //457引脚配置为推挽输出
// 	// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7;//457引脚配置为推挽输出
// 	// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 	// GPIO_Init(GPIOA, &GPIO_InitStructure);

// 	// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//pin6是MISO，对于STM32来说是输入，配置为上拉输入
// 	// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//pin6是MISO，对于STM32来说是输入，配置为上拉输入
// 	// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 	// GPIO_Init(GPIOA, &GPIO_InitStructure);

//     // //CS引脚初始化
//     GPIO_InitStructure.Pin = pSoftSPI->cs_pin;
//     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ;           //推挽输出
//     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
//     HAL_GPIO_Init(pSoftSPI->cs_port, &GPIO_InitStructure);

//     //SCK和MOSI引脚初始化
//     GPIO_InitStructure.Pin = pSoftSPI->sclk_pin ;
//     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ;           //推挽输出
//     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
//     HAL_GPIO_Init(pSoftSPI->sclk_port, &GPIO_InitStructure);


//     //MISO引脚初始化
//     GPIO_InitStructure.Pin = pSoftSPI->miso_pin;
//     // GPIO_InitStructure.Mode = GPIO_Mode_IPU ;               //浮空输入
//     GPIO_InitStructure.Mode = GPIO_MODE_INPUT ;               //浮空输入
// 	GPIO_InitStructure.Pull = GPIO_PULLUP;
//     HAL_GPIO_Init(pSoftSPI->miso_pin, &GPIO_InitStructure);

//    // MOSI引脚初始化
//     GPIO_InitStructure.Pin =  pSoftSPI->mosi_pin;
//     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ;           //推挽输出
//     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
//     HAL_GPIO_Init(pSoftSPI->mosi_port, &GPIO_InitStructure);

// 	//  初始化
// 	HAL_GPIO_WritePin(pSoftSPI->mosi_port, pSoftSPI->mosi_pin, GPIO_PIN_RESET);
// 	HAL_GPIO_WritePin(pSoftSPI->cs_port, pSoftSPI->cs_pin, GPIO_PIN_SET);
// 	HAL_GPIO_WritePin(pSoftSPI->mosi_port, pSoftSPI->mosi_pin, GPIO_PIN_SET);
// }

 
