/**
  *****************************************************************************
  * 						PSIICؿ
  *****************************************************************************
  *
  * @File   : PS_IIC.c
  * @By     : Sun
  * @Version: V1.4
  * @Date   : 2022 / 06 / 09
  * @Shop	: https://xiaomeige.taobao.com/
  *
  *****************************************************************************
**/


#include "PS_IIC.h"

XIicPs IIC0;/**IIC豸ʵ**/


/************************************************************************************************************
**  @brief	ʼIIC豸
**  @param	InstPtr IIC豸ʵ
**  @param	DeviceId	豸ID
**  @param	FsclHz		IICʱƵ
**	Sample:	PS_IIC_Init(&IIC0,XPAR_XIICPS_0_DEVICE_ID,100000);	//ʼ豸IIC0ʱƵΪ100kHz
************************************************************************************************************/
void PS_IIC_Init(XIicPs *InstPtr,uint16_t DeviceId,uint32_t FsclHz)
{
	XIicPs_Config *Config;

	//ʼIIC
	Config = XIicPs_LookupConfig(DeviceId);
	XIicPs_CfgInitialize(InstPtr, Config, Config->BaseAddress);

	//IICʱʡ
	XIicPs_SetSClk(InstPtr, FsclHz);
}

/************************************************************************************************************
**  @brief	дһֽݵI2C豸ָĴַ
**  @param	SlaveID	ӻַ(7λַ)
**  @param	RegBIT	ӻĴλREG88λREG1616λ
**  @param	reg		ӻĴַ
**  @param	Data	Ҫд
**	Sample:	PS_IIC_Write_Reg(&IIC0,0x12,REG8, 0x34,6);	//豸IIC0д60x34ַӻַ0x12
************************************************************************************************************/
void PS_IIC_Write_Reg(XIicPs *InstPtr,uint8_t SlaveID, uint8_t RegBIT, uint16_t reg, uint8_t dat)
{
	uint8_t WR_Buffer[3];
	if(RegBIT == REG8)
	{
		WR_Buffer[0] = reg;
		WR_Buffer[1] = dat;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,2, SlaveID);
	}
	else if(RegBIT == REG16)
	{
		WR_Buffer[0] = reg>>8;		//ȡ߰λ
		WR_Buffer[1] = reg&0x00FF;	//ȡͰλ
		WR_Buffer[2] = dat;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,3, SlaveID);
	}

	//ȴݴ
	while (XIicPs_BusIsBusy(InstPtr));
}

/************************************************************************************************************
**  @brief	ȡI2C豸ַָĴ
**  @param	InstPtr	IICʵ
**  @param	SlaveID	ӻַ(7λַ)
**  @param	RegBIT	ӻĴλREG88λREG1616λ
**  @param	reg		ӻĴַ
**  @return			Ҫȡ
**  Sample:	uint8_t value = PS_IIC_Read_Reg(&IIC0, 0x12,REG8, 0x34);//ӻ豸ַΪ0x12ȡӻĴַΪ0x34
************************************************************************************************************/
uint8_t PS_IIC_Read_Reg(XIicPs *InstPtr,uint8_t SlaveID, uint8_t RegBIT, uint16_t reg)
{
	uint8_t RD_Buffer[1],WR_Buffer[2];

	if(RegBIT == REG8)
	{
		WR_Buffer[0] = reg;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,1, SlaveID);
	}
	else if(RegBIT == REG16)
	{
		WR_Buffer[0] = reg>>8;		//ȡ߰λ
		WR_Buffer[1] = reg&0x00FF;	//ȡͰλ
		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,2, SlaveID);
	}
	//ȴݴ
	while (XIicPs_BusIsBusy(InstPtr));

	XIicPs_MasterRecvPolled(InstPtr, RD_Buffer,1, SlaveID);

	//ȴֱеݱ
	while (XIicPs_BusIsBusy(InstPtr));

	return RD_Buffer[0];
}

/************************************************************************************************************
**  @brief	дֽݵI2C豸ָĴַ
**  @param	InstPtr	IICʵ
**  @param	SlaveID	ӻַ(7λַ)
**  @param	RegBIT	ӻĴλREG88λREG1616λ
**  @param	reg		ӻĴַ
**  @param	send_dat	Ҫд
**  @param	send_len	Ҫдݳ
**	Sample:	PS_IIC_SeqWrite_Reg(&IIC0,0x12,REG8, 0x34,senddata,8);
			//豸IIC0дsenddata[0]~senddata[7]0x34ַӻַ0x12
************************************************************************************************************/
void PS_IIC_SeqWrite_Reg(XIicPs *InstPtr,uint8_t SlaveID, uint8_t RegBIT,
		uint16_t reg, uint8_t *send_dat, uint32_t send_len)
{
	uint8_t WR_Buffer[send_len+2];

	if(RegBIT == REG8)
	{
		WR_Buffer[0] = reg;
		memcpy(WR_Buffer+1,send_dat,send_len);

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,send_len+1, SlaveID);
	}
	else if(RegBIT == REG16)
	{
		WR_Buffer[0] = reg>>8;		//ȡ߰λ
		WR_Buffer[1] = reg&0x00FF;	//ȡͰλ
		memcpy(WR_Buffer+2,send_dat,send_len);

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,send_len+2, SlaveID);
	}

	//ȴݴ
	while (XIicPs_BusIsBusy(InstPtr));
}

/************************************************************************************************************
**  @brief	ȡI2C豸ַָĴ
**  @param	InstPtr	IICʵ
**  @param	SlaveID	ӻַ(7λַ)
**  @param	RegBIT	ӻĴλREG88λREG1616λ
**  @param	reg		ӻĴַ
**  @param	recv_data	ȡݴrecv_data
**  @param	recv_len	ȡݵĳ
**  Sample:	PS_IIC_SeqRead_Reg(&IIC0, 0x12,REG8, 0x34,recv_data,8);
**  		//ӻ豸ַΪ0x12ȡӻĴַΪ0x34ݣ8浽recv_data[0]~recv_data[7]
************************************************************************************************************/
void PS_IIC_SeqRead_Reg(XIicPs *InstPtr,uint8_t SlaveID, uint8_t RegBIT,
		uint16_t reg,uint8_t *recv_data, uint32_t recv_len)
{
	uint8_t WR_Buffer[2];

	if(RegBIT == REG8)
	{
		WR_Buffer[0] = reg;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,1, SlaveID);
	}
	else if(RegBIT == REG16)
	{
		WR_Buffer[0] = reg>>8;		//ȡ߰λ
		WR_Buffer[1] = reg&0x00FF;	//ȡͰλ
		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,2, SlaveID);
	}
	//ȴݴ
	while (XIicPs_BusIsBusy(InstPtr));

	XIicPs_MasterRecvPolled(InstPtr, recv_data,recv_len, SlaveID);

	//ȴֱеݱ
	while (XIicPs_BusIsBusy(InstPtr));

}


/************************************************************************************************************
**  @brief	дһֽݵI2C豸ָĴַ
**  @param	SlaveID	ӻַ(7λַ)
**  @param	RegBIT	ӻĴλREG88λREG1616λ
**  @param	reg		ӻĴַ
**  @param	Data	Ҫд
**	Sample:	PS_IIC_Write_Reg(&IIC0,0x12,REG8, 0x34,6);	//豸IIC0д60x34ַӻַ0x12
************************************************************************************************************/
void PS_IIC_Write_Reg(XIicPs *InstPtr,uint8_t SlaveID, uint8_t RegBIT, uint16_t reg, uint8_t dat)
{
	uint8_t WR_Buffer[3];
	if(RegBIT == REG8)
	{
		WR_Buffer[0] = reg;
		WR_Buffer[1] = dat;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,2, SlaveID);
	}
	else if(RegBIT == REG16)
	{
		WR_Buffer[0] = reg>>8;		//ȡ߰λ
		WR_Buffer[1] = reg&0x00FF;	//ȡͰλ
		WR_Buffer[2] = dat;

		//
		XIicPs_MasterSendPolled(InstPtr, WR_Buffer,3, SlaveID);
	}

	//ȴݴ
	while (XIicPs_BusIsBusy(InstPtr));
}
