📄 i2c.c
字号:
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 + -