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

📄 i2c.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 2 页
字号:
    return FALSE;
}

////////////////////////////////////////////////////////////////////////////////
// I2C read bytes from device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            pBuf - pointer of buffer
//            ucBufLen - length of buffer
////////////////////////////////////////////////////////////////////////////////
#if (RM_EEPROM_TYPE == RM_TYPE_24C16)

void i2cBurstReadBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
{
    BYTE ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;

    while (ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
        {
            continue;
        }

        if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
        {
            continue;
        }

        while (ucBufLen--)  // loop to burst read
        {
            *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte

            pBuf++;         // next byte pointer
        }

        break;
    }

    i2c_Stop();
}

void i2cBurstReadBytes_2(BYTE ucSlaveAdr, BYTE *pBuf, BYTE ucBufLen)
{
    BYTE ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;

    while (ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
        {
            continue;
        }

        while(ucBufLen--) // loop to burst read
        {
            *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte

            pBuf++; // next byte pointer
        }

        break;
    }

    i2c_Stop();
}

////////////////////////////////////////////////////////////////////////////////
// I2C write bytes to device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            pBuf - pointer of buffer
//            ucBufLen - length of buffer
////////////////////////////////////////////////////////////////////////////////
void i2cBurstWriteBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
{
    BYTE ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;

    while (ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
        {
            continue;
        }

        if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        while (ucBufLen--) // loop of writting data
        {
            i2c_SendByte(*pBuf); // send byte

            pBuf++; // next byte pointer
        }

        break;
    }

    i2c_Stop();
}

#endif

#if (KEEP_UNUSED_FUNC == 1)

void i2cBurstWriteBytes_2(BYTE ucSlaveAdr, BYTE *pBuf, BYTE ucBufLen)
{
    i2cBurstWriteBytes( ucSlaveAdr, pBuf[0], pBuf+1, ucBufLen-1 );
}

/////////////////////////////////////////////////////////////////
// I2C read a current byte from device.
//
// Arguments: ucSlaveAdr - slave address
// Return value: read byte
/////////////////////////////////////////////////////////////////
BYTE i2cReadCurrent(BYTE ucSlaveAdr)
{
    BYTE ucByte; // byte buffer

	i2cBurstReadBytes_2(ucSlaveAdr,&ucByte,1);
    return ucByte;
}

#endif

/////////////////////////////////////////////////////////////////
// I2C read a byte from device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
// Return value: read byte
/////////////////////////////////////////////////////////////////
#if (RM_EEPROM_TYPE == RM_TYPE_24C16)

BYTE i2cReadByte(BYTE ucSlaveAdr, BYTE ucSubAdr)
{
    BYTE ucBuf; // byte buffer

    i2cBurstReadBytes(ucSlaveAdr, ucSubAdr, &ucBuf, 1);
    return ucBuf;
}

/////////////////////////////////////////////////////////////////
// I2C write a byte from device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            ucVal - write byte
/////////////////////////////////////////////////////////////////
void i2cWriteByte(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE ucVal)
{
    i2cBurstWriteBytes(ucSlaveAdr, ucSubAdr, &ucVal, 1);
}

#else

void i2cBurstReadBytes(BYTE ucSlaveAdr, unsigned int ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
{
    BYTE ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;

    while (ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
        {
            continue;
        }

        if (i2c_SendByte(HIBYTE(ucSubAdr)) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        if (i2c_SendByte(LOBYTE(ucSubAdr)) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
        {
            continue;
        }

        while (ucBufLen--) // loop to burst read
        {
            *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte

            pBuf++; // next byte pointer
        }

        break;
    }

    i2c_Stop();
}

////////////////////////////////////////////////////////////////////////////////
// I2C write bytes to device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            pBuf - pointer of buffer
//            ucBufLen - length of buffer
////////////////////////////////////////////////////////////////////////////////
void i2cBurstWriteBytes(BYTE ucSlaveAdr, unsigned int ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
{
    BYTE ucDummy; // loop dummy

    ucDummy = 1; //I2C_ACCESS_DUMMY_TIME;

    while (ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
        {
            continue;
        }

        if (i2c_SendByte(HIBYTE(ucSubAdr)) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        if (i2c_SendByte(LOBYTE(ucSubAdr)) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
        {
            continue;
        }

        while (ucBufLen--) // loop of writting data
        {
            i2c_SendByte(*pBuf); // send byte

            pBuf++; // next byte pointer
        }

        break;
    }

    i2c_Stop();
}

BYTE i2cReadByte(BYTE ucSlaveAdr, U16 ucSubAdr)
{
    BYTE ucBuf; // byte buffer

    i2cBurstReadBytes(ucSlaveAdr, ucSubAdr, &ucBuf, 1);

    return ucBuf;
}

/////////////////////////////////////////////////////////////////
// I2C write a byte from device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            ucVal - write byte
/////////////////////////////////////////////////////////////////
void i2cWriteByte(BYTE ucSlaveAdr, U16 ucSubAdr, BYTE ucVal)
{
    i2cBurstWriteBytes(ucSlaveAdr, ucSubAdr, &ucVal, 1);
}

#endif

//------------------------------------------------------------------------------
#if 0 // Software I2C Test
void SwI2cTest( void )
{
//	code unsigned char xxTest[8]={0x00,0x99,0x88,0x77,0x66,0x55,0x44,0x33};
//	code unsigned char yyTest[8]={0x10,0x19,0x18,0x17,0x16,0x15,0x14,0x13};
	unsigned int  SubAddr;
//	unsigned char read[8];
	unsigned char i,j;

   	printf("sw i2c test...\r\n");
	i=0x55;
    SubAddr=0x0150;
	i2cBurstWriteBytes(0xa0,SubAddr,&i,1);
	printf("1 byte write done\n");
	i2cBurstReadBytes(0xa0, SubAddr, &j, 1);
	printf("j=%02bx. \r\n",j);



	i=0xAA;
    SubAddr=0x0100;
	i2cBurstWriteBytes(0xa0,SubAddr,&i,1);
	printf("1 byte write done\n");
	i2cBurstReadBytes(0xa0, SubAddr, &j, 1);
	printf("j=%02bx. \r\n",j);


	SubAddr=0x120;
	i2cBurstWriteBytes(0xa0,SubAddr,8, xxTest);
	printf("8_1 byte write done\n");

	i2cBurstReadBytes(0xa0,SubAddr, 8, read );

	for ( i=0;i<8;i++ )
	   printf("%02bx ,",read[i]);
	printf("\r\n");


	addr[0]=0x02; addr[1]=0x80;
	MDrv_I2C_WriteBytes(0xa0,2,addr,8, yyTest);
	printf("8-2 byte write done\n");

	MDrv_I2C_ReadBytes(0xa0,2, addr, 8, read );
	for ( i=0;i<8;i++ )
	   printf("%02bx ,",read[i]);
	printf("\r\n");

}
#endif

#endif //_EEPROM_ACCESS == IIC_BY_SW


#endif // ENABLE_EEPROM

⌨️ 快捷键说明

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