📄 iic.c
字号:
#include "iic.h"
XLLP_BOOL_T XllpPI2cInit(P_XLLP_PI2C_T I2C_regs,
P_XLLP_GPIO_T gpio,
P_XLLP_CLKMGR_T clkMgr,
XLLP_UINT32_T dev_id)
{
clkMgr->cken |= XLLP_CLKEN_PWRI2C;
I2C_regs->PCFR |= 0x40;
I2C_regs->ICR = 0;
/* Setup I2C slave address */
I2C_regs->ISAR = dev_id;
I2C_regs->ICR = XLLP_ICR_SCLEA;
I2C_regs->ICR |= XLLP_ICR_UIE;
return(XLLP_FALSE);
}
/*
* Wait for Receive empty status
*
* RETURNS: 0 success
* 1 failure
*/
XLLP_BOOL_T XllpI2cRxFull(P_XLLP_PI2C_T I2C_regs,
XLLP_OST_T *pOSTRegs,
XLLP_INT32_T timeout)
{
XLLP_UINT32_T temp;
XLLP_UINT32_T i,j;
while (timeout--)
{
temp = I2C_regs->ISR;
if ((temp & XLLP_ISR_IRF) == XLLP_ISR_IRF)
{
I2C_regs->ISR = temp | XLLP_ISR_IRF;
return XLLP_FALSE;
}
// delay 1 ms here
//XllpOstDelayMilliSeconds(pOSTRegs, 1);
for(i=0;i<10000;i++)
for(j=0;j<10000;j++)
;
}
return XLLP_TRUE;
}
/* Wait for transmit empty status
*
* RETURNS: 0 success
* 1 failure
*/
XLLP_BOOL_T XllpI2cTxEmpty(P_XLLP_PI2C_T I2C_regs,
XLLP_OST_T *pOSTRegs,
XLLP_INT32_T timeout)
{
XLLP_UINT32_T temp;
XLLP_UINT32_T i,j;
while (timeout--)
{
temp = I2C_regs->ISR;
if((temp & XLLP_ISR_ITE) == XLLP_ISR_ITE)
{
I2C_regs->ISR = temp | XLLP_ISR_ITE;
if ((temp & XLLP_ISR_ALD) == XLLP_ISR_ALD)
{
I2C_regs->ISR |= XLLP_ISR_ALD;
}
return XLLP_FALSE;
}
// delay 1 ms here
//XllpOstDelayMilliSeconds(pOSTRegs, 1);
for(i=0;i<10000;i++)
for(j=0;j<10000;j++)
;
}
return XLLP_TRUE;
}
XLLP_BOOL_T XllpI2CWrite(P_XLLP_PI2C_T I2C_regs,
XLLP_OST_T *pOSTRegs,
XLLP_UINT8_T slaveAddr,
const XLLP_UINT8_T * bytesBuf,
XLLP_UINT32_T bytesCount,
XLLP_BOOL_T bSendStop)
{
XLLP_UINT32_T reg;
//int timer = 0;
I2C_regs->IDBR = (slaveAddr << 1) & ~XLLP_IDBR_MODE;
reg = I2C_regs->ICR;
reg |= (XLLP_ICR_START | XLLP_ICR_TB);
reg &= ~(XLLP_ICR_STOP | XLLP_ICR_ALDIE);
I2C_regs->ICR = reg;
if (XllpI2cTxEmpty(I2C_regs, pOSTRegs,20) == XLLP_TRUE)
{
//RETAILMSG(1, (TEXT("XllpI2CWrite:send addr failed!\r\n")));
return XLLP_TRUE;
}
// Send all the bytes
while (bytesCount--)
{
I2C_regs->IDBR = (XLLP_UINT32_T)(*bytesBuf++);
reg = I2C_regs->ICR;
reg &= ~XLLP_ICR_START;
reg |= (XLLP_ICR_ALDIE | XLLP_ICR_TB);
if ((bytesCount == 0) && bSendStop)
reg |= XLLP_ICR_STOP;
else
reg &= ~XLLP_ICR_STOP;
I2C_regs->ICR = reg;
if (XllpI2cTxEmpty(I2C_regs, pOSTRegs, 250) == XLLP_TRUE)
{
//RETAILMSG(1, (TEXT("XllpI2CWrite:send data failed!\r\n")));
return XLLP_TRUE;
}
}
// Clear the STOP bit always
I2C_regs->ICR &= ~XLLP_ICR_STOP;
return XLLP_FALSE;
}
XLLP_BOOL_T XllpI2CRead(P_XLLP_PI2C_T I2C_regs,
XLLP_OST_T *pOSTRegs,
XLLP_UINT8_T slaveAddr,
XLLP_UINT8_T * bytesBuf,
XLLP_UINT32_T bytesCount,
XLLP_BOOL_T bSendStop)
{
XLLP_UINT32_T reg;
I2C_regs->IDBR = (slaveAddr << 1) | XLLP_IDBR_MODE;
reg = I2C_regs->ICR;
reg |= (XLLP_ICR_START | XLLP_ICR_TB);
reg &= ~(XLLP_ICR_STOP | XLLP_ICR_ALDIE);
I2C_regs->ICR = reg;
if (XllpI2cTxEmpty(I2C_regs, pOSTRegs,20) == XLLP_TRUE)
{
//RETAILMSG(1, (TEXT("XllpI2CRead:send addr failed!\r\n")));
return XLLP_TRUE;
}
while (bytesCount--)
{
reg = I2C_regs->ICR;
reg &= ~XLLP_ICR_START;
reg |= XLLP_ICR_ALDIE | XLLP_ICR_TB;
if (bytesCount == 0)
{
reg |= XLLP_ICR_ACKNACK;
if (bSendStop)
reg |= XLLP_ICR_STOP;
else
reg &= ~XLLP_ICR_STOP;
} else
{
reg &= ~XLLP_ICR_ACKNACK;
}
I2C_regs->ICR = reg;
if (XllpI2cRxFull(I2C_regs, pOSTRegs, 60) == XLLP_TRUE)
{
//RETAILMSG(1, (TEXT("XllpI2CRead:Read data failed!\r\n")));
return XLLP_TRUE;
}
reg = I2C_regs->IDBR & 0xFF;
*bytesBuf++ = (XLLP_UINT8_T)reg;
}
I2C_regs->ICR &= ~(XLLP_ICR_STOP | XLLP_ICR_ACKNACK);
return XLLP_FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -