/*******************************************************************************
* Function Name  : APS6404L-3SQR SRAM -- 8M*8bit
* Description    : SRAM驱动程序
*******************************************************************************/

#include "includes.h"

/*******************************************************************************
* Function Name  : SPI_SRAM_Init
* Description    : SRAM初始化
* Input          : None
* Return         : None
*******************************************************************************/
void SPI_SRAM_Init(void)
{
#if (USE_CORE_TYPE == 1)    //使用C1F核心板

	//设置SPI GPIO
	GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_20mA);					//CS
	
	GPIOA_SetBits( GPIO_Pin_13 );
	GPIOA_ModeCfg(GPIO_Pin_13|GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
	GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);							//MISO
	//SPI 主机模式
	SPI0_MasterDefInit( );   
	SPI0_DataMode(Mode0_HighBitINFront);

	SRAM_CE_L;     //SRAM和flash使用同一片选脚，默认选SRAM
#elif (USE_CORE_TYPE == 2)   //使用C1核心板
	
	//设置SPI GPIO
	GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
	//SPI 主机模式
	SPI0_MasterDefInit( );   
	SPI0_DataMode(Mode0_HighBitINFront);

	SRAM_CE_H;
	
#endif  //USE_CORE_TYPE == CORE_TYPE_C1F
	
}

/*******************************************************************************
* Function Name  : SRAM_Write_Byte
* Description    : SRAM写字节
* Input          : 
			wdate : 需要写入的字节
			add 	：字节写入的地址
* Return         : None
*******************************************************************************/
void SRAM_Write_Byte(uint8_t wdate,uint32_t add)
{
	uint8_t Hadd16=0x00,Hadd8=0x00,Ladd=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	if(add >= SRAM_ADDRESS_MAX) return ;

	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Write);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	SPI0_MasterSendByte(wdate);
	
	SRAM_CE_H;
	DelayUs(10);
}

/*******************************************************************************
* Function Name  : SRAM_Read_Byte
* Description    : SRAM读字节
* Input          : 
			add 	：读取字节的地址
* Return         : 返回读取字节
*******************************************************************************/
uint8_t SRAM_Read_Byte(uint32_t add)
{
	uint8_t Hadd8=0x00,Hadd16=0x00,Ladd=0x00,rdate=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	if(add >= SRAM_ADDRESS_MAX) return 0x00;
	
	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Read);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	rdate = SPI0_MasterRecvByte();
	SRAM_CE_H;
//	if(rdate == 0xFF)
//	{
//		if(GPIOB_ReadPortPin(GPIO_Pin_3) == 0x00)
//		{
//			GPIOB_SetBits(GPIO_Pin_3);
//		}else{
//			GPIOB_ResetBits(GPIO_Pin_3);
//		}
//	}
	DelayUs(10);
	return rdate;
	
}

/*******************************************************************************
* Function Name  : SRAM_Write_Word
* Description    : SRAM写uint16_t数据 -- 采用小端模式保存数据
* Input          : 
			wdate : 需要写入的字节
			add 	：字节写入的地址
* Return         : 返回读取字节
*******************************************************************************/
void SRAM_Write_Word(uint16_t wdate,uint32_t add)
{
	SRAM_Write_Byte((uint8_t)(wdate & 0xFF),add);
	SRAM_Write_Byte((uint8_t)((wdate >> 8) & 0xFF),add + 1);
}	

/*******************************************************************************
* Function Name  : SRAM_Read_Word
* Description    : SRAM写uint16_t数据 -- 采用小端模式保存数据
* Input          : 
			add 	：读取字的地址
* Return         : 返回读取字
*******************************************************************************/
uint16_t SRAM_Read_Word(uint32_t add)
{
	uint16_t rev = 0;
	rev = SRAM_Read_Byte(add + 1);
	rev <<= 8;
	rev |= SRAM_Read_Byte(add);
	return rev;
}

/*******************************************************************************
* Function Name  : SRAM_Write_DW
* Description    : SRAM写uint32_t数据 -- 采用小端模式保存数据
* Input          : 
			wdate : 需要写入的双字
			add 	：双字写入的地址
* Return         : 返回读取双字
*******************************************************************************/
void SRAM_Write_DW(uint32_t wdate,uint32_t add)
{
	SRAM_Write_Byte((uint8_t)(wdate & 0xFF),add);
	SRAM_Write_Byte((uint8_t)((wdate >> 8) & 0xFF),add + 1);
	SRAM_Write_Byte((uint8_t)((wdate >> 16) & 0xFF),add + 2);
	SRAM_Write_Byte((uint8_t)((wdate >> 24) & 0xFF),add + 3);
}	

/*******************************************************************************
* Function Name  : SRAM_Read_DW
* Description    : SRAM写uint32_t数据 -- 采用小端模式保存数据
* Input          : 
			add 	：读取双字的地址
* Return         : 返回读取双字
*******************************************************************************/
uint32_t SRAM_Read_DW(uint32_t add)
{
	uint32_t rev = 0;
	
	rev = SRAM_Read_Byte(add + 3);
	rev <<= 8;
	rev |= SRAM_Read_Byte(add + 2);
	rev <<= 8;
	rev |= SRAM_Read_Byte(add + 1);
	rev <<= 8;
	rev |= SRAM_Read_Byte(add);
	
	return rev;
}

/*******************************************************************************
* Function Name  : SRAM_Write_Buff
* Description    : SRAM FIFO方式写入数据
* Input          : 
			wbuff : 需要写入的数据
			len 	: 写入数据的长度 -- 最大4095字节长度
			add 	：字节写入的地址
* Return         : None
*******************************************************************************/
void SRAM_Write_Buff(uint8_t* wbuff,uint16_t len,uint32_t add)
{
	uint8_t Hadd16=0x00,Hadd8=0x00,Ladd=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	//超过范围
	if(add + len >= SRAM_ADDRESS_MAX) return ;

	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Write);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	SPI0_MasterTrans(wbuff,len);
	SRAM_CE_H;
	DelayUs(10);
}

/*******************************************************************************
* Function Name  : SRAM_Read_Buff
* Description    : SRAM FIFO方式读取数据
* Input          : 
			rbuff : 需要读取的数据
			len 	: 读取数据的长度 -- 最大4095字节长度
			add 	：字节写入的地址
* Return         : None
*******************************************************************************/
void SRAM_Read_Buff(uint8_t* rbuff,uint16_t len,uint32_t add)
{
	uint8_t Hadd16=0x00,Hadd8=0x00,Ladd=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	if(add + len >= SRAM_ADDRESS_MAX) return ;

	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Read);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	SPI0_MasterRecv(rbuff,len);
	SRAM_CE_H;
	DelayUs(10);
}


/*******************************************************************************
* Function Name  : SRAM_DMA_Write_Buff
* Description    : SRAM DMA方式写入数据
* Input          : 
			wbuff : 需要写入的数据
			len 	: 写入数据的长度 -- 最大4095字节长度
			add 	：字节写入的地址
* Return         : None
*******************************************************************************/
void SRAM_DMA_Write_Buff(uint8_t* wbuff,uint16_t len,uint32_t add)
{
	uint8_t Hadd16=0x00,Hadd8=0x00,Ladd=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	if(add + len >= SRAM_ADDRESS_MAX) return ;

	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Write);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	SPI0_MasterDMATrans(wbuff,len);
	SRAM_CE_H;
	DelayUs(10);
}

/*******************************************************************************
* Function Name  : SRAM_DMA_Read_Buff
* Description    : SRAM DMA方式读取数据
* Input          : 
			rbuff : 需要读取的数据
			len 	: 读取数据的长度 -- 最大4095字节长度
			add 	：字节写入的地址
* Return         : None
*******************************************************************************/
void SRAM_DMA_Read_Buff(uint8_t* rbuff,uint16_t len,uint32_t add)
{
	uint8_t Hadd16=0x00,Hadd8=0x00,Ladd=0x00;
	Ladd=add;
	Hadd8=add>>8;
	Hadd16=add>>16;
	
	if(add + len >= SRAM_ADDRESS_MAX) return ;

	SRAM_CE_L;
	SPI0_MasterSendByte(SRAM_CMD_Read);
	SPI0_MasterSendByte(Hadd16);
	SPI0_MasterSendByte(Hadd8);
	SPI0_MasterSendByte(Ladd);
	SPI0_MasterDMARecv(rbuff,len);
	SRAM_CE_H;
	DelayUs(10);
}


