⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drviic.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
BOOLEAN MDrv_IIC_ReadByte ( U8 u8SlaveID, U8 u8RegAddr, U8 *pu8Data )
{
#if 1
	return MDrv_IIC_ReadBytes(u8SlaveID,1,&u8RegAddr,1,pu8Data);
#else
	IIC_Start();

	if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
		return FALSE;

	if(IIC_SendByte(u8RegAddr)==FALSE)
		return FALSE;

	IIC_Start();

	if(IIC_SendByte(u8SlaveID|0x1)==FALSE)
		return FALSE;

	IIC_NoAck();

	if(IIC_GetByte(pu8Data)==FALSE)
    	return FALSE;

	IIC_Stop();

	return TRUE;
#endif

}

/******************************************************************************/
///Write 1 byte through IIC
///@param u8SlaveID \b IN: Slave ID
///@param u8RegAddr \b IN: Target register offset to write
///@param u8Data \b IN: 1 byte data to write
///@return BOOLEAN:
///- TRUE: Success
///- FALSE: Fail
/******************************************************************************/
BOOLEAN MDrv_IIC_WriteByte ( U8 u8SlaveID, U8 u8RegAddr, U8 u8Data )
{
#if 1
	return MDrv_IIC_WriteBytes(u8SlaveID,1,&u8RegAddr,1,&u8Data);
#else
	IIC_Start();

	if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
		return FALSE;

	if(IIC_SendByte(u8RegAddr)==FALSE)
		return FALSE;

	if(IIC_SendByte(u8Data)==FALSE)
		return FALSE;

	IIC_Stop();

	return TRUE;
#endif

}
/******************************************************************************/
///Write one 16 bits data through IIC
///@param u8SlaveID \b IN: Slave ID
///@param u8RegAddr \b IN: Target register offset to write
///@param u16Data \b IN: one 16 bits data to write
///@return BOOLEAN:
///- TRUE: Success
///- FALSE: Fail
/******************************************************************************/
BOOLEAN MDrv_IIC_Write2Bytes(U8 u8SlaveID, U8 u8addr, U16 u16data)
{
    U8 u8Data[2];
    u8Data[0] = (u16data>>8) & 0xFF;
    u8Data[1] = (u16data) & 0xFF;
    return (MDrv_IIC_WriteBytes(u8SlaveID, 1, &u8addr, 2, u8Data));
}
/******************************************************************************/
///Read one 16bits data through IIC
///@param u8SlaveID \b IN: Slave ID
///@param u8RegAddr \b IN: Target register offset to write
///@return U16 data read fron IIC.
/******************************************************************************/
U16 MDrv_IIC_Read2Bytes(U8 u8SlaveID, U8 u8addr)
{
    U8 u8Data[2];
    MDrv_IIC_ReadBytes(u8SlaveID, 1, &u8addr, 2, u8Data);

    return ( (((U16)u8Data[0])<<8)|u8Data[1] );
}

#if 0
/******************************************************************************/
///Write Slave ID and one 8 bits data through IIC
///@param u8SlaveID \b IN: Slave ID
///@param u16Data \b IN: one 16 bits data to write
///@return BOOLEAN:
///- TRUE: Success
///- FALSE: Fail
/******************************************************************************/
BOOLEAN MDrv_IIC_WriteByteDirectly(U8 u8SlaveID, U8 u8Data)
{
    IIC_Start();

    if (IIC_SendByte(u8SlaveID & 0xFE)==FALSE)
        return FALSE;

    if (IIC_SendByte(u8Data)==FALSE)
    	return FALSE;

    IIC_Stop();
    return TRUE;
}
/******************************************************************************/
///Read Slave ID and get one 8 bits data through IIC
///@param u8SlaveID \b IN: Slave ID
///@return one U8 data from IIC.
/******************************************************************************/
U8 MDrv_IIC_ReadByteDirectly(U8 u8SlaveID)
{
    U8 pu8Data;

    IIC_Start();

    if(IIC_SendByte(u8SlaveID|0x1)==FALSE)
        return FALSE;

    IIC_NoAck();

    if(IIC_GetByte(&pu8Data)==FALSE)
        return FALSE;

    IIC_Stop();

    return pu8Data;
}
#endif
/******************************************************************************/
///Write 4 bytes sub_address and 1 byte data through IIC
///Application on RF_tunner registers interface.
///@param u8SlaveID \b IN: Slave ID
///@param U32RegAddr \b IN: Target register offset to write
///@param u8Data \b IN: 1 byte data to write
///@return BOOLEAN:
///- TRUE: Success
///- FALSE: Fail
/******************************************************************************/
BOOLEAN MDrv_IIC_Write4Bytes(U8 u8SlaveID, U32 u32Data, U8 u8EndData)
{
#if 1
	BOOLEAN flag=TRUE;
	IIC_StartW(u8SlaveID);

    if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
        flag=FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>24) ) == FALSE )
        flag=FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>16) ) == FALSE )
        flag=FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>8) ) == FALSE )
        flag=FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>0) ) == FALSE )
        flag=FALSE;

    if(IIC_SendByte(u8EndData)==FALSE)
        flag=FALSE;

    IIC_Stop();
	return flag;

#else
    IIC_Start();

    if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
        return FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>24) ) == FALSE )
        return FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>16) ) == FALSE )
        return FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>8) ) == FALSE )
        return FALSE;

    if(IIC_SendByte( (U8)(((U32)u32Data)>>0) ) == FALSE )
        return FALSE;

    if(IIC_SendByte(u8EndData)==FALSE)
        return FALSE;

    IIC_Stop();
#endif

}
/******************************************************************************/
///Write 1 byts sub_group, one 16bits sub_address and one 16 bits data through IIC
///Application on RF_tunner registers interface.
///@param u8SlaveID \b IN: Slave ID
///@param u8SubGroup \b IN: Target sub_group to write
///@param U16RegAddr \b IN: Target register offset to write
///@param u16Data \b IN: 0ne 16 bits data to write
///@return BOOLEAN:
///- TRUE: Success
///- FALSE: Fail
/******************************************************************************/
BOOLEAN MDrv_IIC_WriteGroupBytes(U8 u8SlaveID, U8 u8SubGroup, U16 u16Addr, U16 u16Data)
{
#if 1
	BOOLEAN flag=TRUE;
    IIC_Start();

    if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
        flag=FALSE;

    if(IIC_SendByte(u8SubGroup)==FALSE)
        flag=FALSE;

    if(IIC_SendByte((u16Addr>>8)&0xFF)==FALSE)
        flag=FALSE;

    if(IIC_SendByte(u16Addr&0xFF)==FALSE)
        flag=FALSE;

    if(IIC_SendByte((u16Data>>8)&0xFF)==FALSE)
        flag=FALSE;

    if(IIC_SendByte(u16Data&0xFF)==FALSE)
        flag=FALSE;

    IIC_Stop();
	return flag;
#else
    IIC_Start();

    if(IIC_SendByte(u8SlaveID&0xFE)==FALSE)
        return FALSE;

    if(IIC_SendByte(u8SubGroup)==FALSE)
        return FALSE;

    if(IIC_SendByte((u16Addr>>8)&0xFF)==FALSE)
        return FALSE;

    if(IIC_SendByte(u16Addr&0xFF)==FALSE)
        return FALSE;

    if(IIC_SendByte((u16Data>>8)&0xFF)==FALSE)
        return FALSE;

    if(IIC_SendByte(u16Data&0xFF)==FALSE)
        return FALSE;

    IIC_Stop();
#endif
}
/******************************************************************************/
///Read one 16 bits data through IIC by Write 1 byts sub_group, one 16bits sub_addres
///Application on RF_tunner registers interface.
///@param u8SlaveID \b IN: Slave ID
///@param u8SubGroup \b IN: Target sub_group to write
///@param U16RegAddr \b IN: Target register offset to write
///@return 0ne 16 bits data
/******************************************************************************/
U16 MDrv_IIC_ReadGroupBytes(U8 u8SlaveID, U8 u8SubGroup, U16 u16Addr)
{
    U16 u16Data;
    U8 u8Address[3];

    u8Address[0] = u8SubGroup;
    u8Address[1] = (u16Addr>>8)&0xFF;
    u8Address[2] = u16Addr&0xFF;

    MDrv_IIC_ReadBytes(u8SlaveID, 3, u8Address, 2, (U8 *)&u16Data);

    return u16Data;
}

//------------------------------------------------------------------------
//HW IIC test loop
//------------------------------------------------------------------------
/*
#define	EE_TEST_SLAVE_ADDR	0xA4
#define	EE_512_SLAVE_ADDR	0xA0
#define INFORM(x)   x

void HwI2cAccessTest(void)
{
	U8 i;  U8 x;
	code U8  IicTestData[8]={0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0};
	code U8  IicTestData2[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
	U8   ReadIn[8];
	U8 Addr[2];

	//-----------------------------------
	//test 0
	x=MDrv_IIC_WriteByte( EE_TEST_SLAVE_ADDR, 0x20,0x55 );
	if ( x == FALSE ) IIC_Stop();
    printf("start read.........\r\n");
	i=0;
	x=MDrv_IIC_ReadByte (	EE_TEST_SLAVE_ADDR, 0x20,&i );
	if ( x == FALSE ) IIC_Stop();

	if ( i == 0x55 )
		   INFORM(printf("Pass 1 byte read/write[%02bx]\r\n",i));
	else
		   INFORM(printf("Fail 1 byte read/write[%02bx]\r\n",i));

	//-----------------------------------
	//test 1
	MDrv_IIC_WriteByte( EE_TEST_SLAVE_ADDR, 0x20,0xAA );
    INFORM(printf("start read 0xAA.........\r\n"));
	i=0;
	MDrv_IIC_ReadByte (	EE_TEST_SLAVE_ADDR, 0x20,&i );
	if ( i == 0xAA )
		   INFORM(printf("Pass 1 byte read/write[%02bx]\r\n",i));
	else
		   INFORM(printf("Fail 1 byte read/write[%02bx]\r\n",i));

	//-----------------------------------
	//test 2
	MDrv_IIC_WriteBytes(EE_TEST_SLAVE_ADDR, 1, 0x10, 8, IicTestData);
	INFORM(printf("start read data array.........\r\n"));

	MDrv_IIC_ReadBytes( EE_TEST_SLAVE_ADDR, 1, 0x10, 8,	 ReadIn);

	for ( i=0;i<8;i++ )
	{
  		if (  IicTestData[i]!= ReadIn[i] )
		{
    		INFORM(printf("Iic write series bytes error[%02bx]=%02bx\n",i,ReadIn[i]));
			break;
		 }
	}
	if ( i == 8 )
		   INFORM(printf("Read write BYTES Pass\n",i));

	//-----------------------------------
	//test 3
	Addr[0]=0x80;
	Addr[1]=0x01;
	MDrv_IIC_WriteBytes(EE_512_SLAVE_ADDR,2,Addr,8,IicTestData);
	//delay loop;
	INFORM(printf("start read data 24c32.........\r\n"));
	MDrv_IIC_ReadBytes(EE_512_SLAVE_ADDR,2,Addr,8,ReadIn);
	for ( i=0;i<8;i++ )
	   printf("%02bx,  ",ReadIn[i]);
	printf("\r\n\n");

	Addr[0]=0x40;
	Addr[1]=0x01;
	MDrv_IIC_WriteBytes(EE_512_SLAVE_ADDR,2,Addr,8,IicTestData2);
	//delay loop;
	INFORM(printf("start read data 24c32.........\r\n"));
	MDrv_IIC_ReadBytes(EE_512_SLAVE_ADDR,2,Addr,8,ReadIn);
	for ( i=0;i<8;i++ )
	   printf("%02bx,  ",ReadIn[i]);
	printf("\r\n\n");

//iiC test loop end
}//*/

/******************************************************************************/
///I2C Speed: set I2C Speed, u8Speed = 1 ~ 9, Speed up IIC by decrease u8Speed.
/******************************************************************************/
void MDrv_IIC_SetSpeed(U8 u8Speed)
{
    if(u8Speed >= 1 && u8Speed <= 9)
    {
    	XBYTE[IIC0_CTRL] &= ~0x80;	    // Enable IIC
    	XBYTE[IIC0_CLK_SEL] = u8Speed;	// IIC clock = (sysclk / 4T) / 16
    	XBYTE[IIC0_CTRL] |= 0x80;	    // Enable IIC
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -