📄 iic.c
字号:
// Output : NONE
// Version : v0.1
void IIC_Write(u8 cSlaveAddr, u8 cAddr, u8 cData)
{
u8 cD[2];
cD[0]=cAddr;
cD[1]=cData;
IIC_SetWrite(cSlaveAddr, cD, 2);
IIC_Wait();
do { // Polling for an ACK signal from SerialEEPROM.
IIC_SetWrite(cSlaveAddr, NULL, 0);
IIC_Wait();
} while(IIC_Status()&0x1);
}
//////////
// Function Name : IIC_Read
// Function Description : This function STARTs up read mode with 7-bit addresses
// Input : cSlaveAddr [8bit SlaveDeviceAddress],
// cAddr [8bit Address where you want to read],
// cData [pointer of Data which you want to read]
// Output : NONE
// Version : v0.1
void IIC_Read(u8 cSlaveAddr,u8 cAddr,u8 *cData)
{
IIC_SetWrite( cSlaveAddr, &cAddr, 1); // following EEPROM random address access procedure
IIC_SetRead( cSlaveAddr, cData, 1);
IIC_Wait(); // Waiting for read complete.
}
//////////
// Function Name : IIC_MasterWrP
// Function Description : This function do MasterTx mode by polling operation
// Input : cSlaveAddr [8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Tx]
// Output : NONE
// Version : v0.1
void IIC_MasterWrP(u8 cSlaveAddr,u8 * pData)
{
u32 uTmp0;
u32 uTmp1;
u8 cCnt;
s32 sDcnt = 100;
u32 uPT = 0;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
Outp32(rIICDS,cSlaveAddr);
Outp32(rIICSTAT,0xf0); // Master Tx Start.
while(!(sDcnt == -1))
{
if(Inp8(rIICCON)&0x10) //until Int Pending
{
if((sDcnt--) == 0)
{
Outp32(rIICSTAT,0xd0); // Stop Master Tx condition, ACK flag clear
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
Delay(1); // wait until Stop Condition is in effect
break;
}
Outp8(rIICDS,pData[uPT++]);
for(cCnt=0;cCnt<10;cCnt++); // for setup time (rising edge of IICSCL)
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
}
}
}
//////////
// Function Name : IIC_MasterRdP
// Function Description : This function do MasterRd mode by polling operation
// Input : cSlaveAddr [8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Rx]
// Output : NONE
// Version : v0.1
void IIC_MasterRdP(u8 cSlaveAddr,u8 * pData)
{
u32 uTmp0;
u32 uTmp1;
u8 cCnt;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
Outp32(rIICDS,cSlaveAddr);
Outp32(rIICSTAT,0xB0); // Master Rx Start.
while((Inp8(rIICSTAT)&0x1))
{
}
cCnt=0;
while(cCnt<101)
{
if(Inp8(rIICCON)&0x10)
{
pData[cCnt]=Inp8(rIICDS);
cCnt++;
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
}
}
Outp8(rIICSTAT,0x90); // stop bit gen.
}
//////////
// Function Name : IIC_SlaveRdP
// Function Description : This function do SlaveRx mode by polling operation
// Input : pSlaveAddr [pointer of 8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Rx]
// Output : NONE
// Version : v0.1
void IIC_SlaveRdP(u8 *pSlaveAddr,u8 *pData)
{
u32 uTmp0;
u32 uTmp1;
u8 cCnt;
// g_PcIIC_BUFFER = pData;
// g_uIIC_PT = 0;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
uTmp0 = Inp32(rIICSTAT);
uTmp0 &= ~(1<<4);
Outp32(rIICSTAT,uTmp0); // Disable Rx/Tx for setting SlaveAddr
Outp8(rIICADD,*pSlaveAddr);
Outp32(rIICSTAT,0x10); // Slave Rx Start.
printf("Wait for Slave Addr\n");
cCnt=0;
// while(!((Inp8(rIICSTAT)>>2)&(0x1)));
while(cCnt<101)
{
if(Inp8(rIICCON)&0x10)
{
// printf("IICSTAT = %x ",Inp32(rIICSTAT));
pData[cCnt]=Inp8(rIICDS);
cCnt++;
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
}
}
*pSlaveAddr = pData[0];
Outp8(rIICSTAT,0x0);
}
//////////
// Function Name : IIC_SlaveWrP
// Function Description : This function do SlaveTx mode by polling operation
// Input : pSlaveAddr [pointer of 8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Tx]
// Output : NONE
// Version : v0.1
void IIC_SlaveWrP(u8 *pSlaveAddr,u8 *pData)
{
u32 uTmp0;
u32 uTmp1;
u8 cCnt;
s32 sDcnt = 100;
u32 uPT = 0;
// g_PcIIC_BUFFER = pData;
// g_uIIC_PT = 0;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
uTmp0 = Inp32(rIICSTAT);
uTmp0 &=~(1<<4);
Outp32(rIICSTAT,uTmp0); // Disable Rx/Tx for setting SlaveAddr
Outp8(rIICADD,*pSlaveAddr);
Outp32(rIICSTAT,0x50); // Slave Tx Start.
// while(!((Inp8(rIICSTAT)>>2)&(0x1)));
while(!(sDcnt == -1))
{
if(Inp8(rIICCON)&0x10) //until Int Pending
{
// printf("IICSTAT = %x ",Inp32(rIICSTAT));
if((sDcnt--) == 0)
{
Outp32(rIICSTAT,0xd0); // Stop Master Tx condition, ACK flag clear
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
Delay(1); // wait until Stop Condition is in effect
break;
}
Outp8(rIICDS,pData[uPT++]);
for(cCnt=0;cCnt<10;cCnt++); // for setup time (rising edge of IICSCL)
uTmp0 = Inp32(rIICCON);
uTmp0 &= ~(1<<4); // Clear pending bit to resume
Outp32(rIICCON,uTmp0);
}
}
}
//////////
// Function Name : IIC_SlaveRdInt
// Function Description : This function do SlaveRx mode by Interrupt operation
// Input : pSlaveAddr [pointer of 8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Rx]
// Output : NONE
// Version : v0.1
void IIC_SlaveRdInt(u8 *pSlaveAddr,u8 *pData)
{
u32 uTmp0;
u32 uTmp1;
g_PcIIC_BUFFER = pData;
g_uIIC_PT = 0;
g_cIIC_SlaveRxDone = 0;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
uTmp0 = Inp32(rIICSTAT);
uTmp0 &= ~(1<<4);
Outp32(rIICSTAT,uTmp0); // Disable Rx/Tx for setting SlaveAddr
Outp8(rIICADD,*pSlaveAddr);
Outp32(rIICSTAT,0x10); // Slave Rx Start.
while(!(g_cIIC_SlaveRxDone));
}
//////////
// Function Name : IIC_SlaveWrInt
// Function Description : This function do SlaveTx mode by Interrupt operation
// Input : pSlaveAddr [pointer of 8bit SlaveDeviceAddress],
// pData [pointer of Data which you want to Tx]
// Output : NONE
// Version : v0.1
void IIC_SlaveWrInt(u8 *pSlaveAddr,u8 *pData)
{
u32 uTmp0;
u32 uTmp1;
g_PcIIC_BUFFER = pData;
g_uIIC_PT = 0;
g_cIIC_SlaveTxDone = 0;
uTmp0 = Inp32(rIICSTAT);
while(uTmp0&(1<<5)) // Wait until IIC bus is free.
{
uTmp0 = Inp32(rIICSTAT);
}
uTmp1 = Inp32(rIICCON);
uTmp1 |= (1<<7);
Outp32(rIICCON,uTmp1); // Ack generation Enable
uTmp0 = Inp32(rIICSTAT);
uTmp0 &=~(1<<4);
Outp32(rIICSTAT,uTmp0); // Disable Rx/Tx for setting SlaveAddr
Outp8(rIICADD,*pSlaveAddr);
Outp32(rIICSTAT,0x50); // Slave Tx Start.
while(!(g_cIIC_SlaveTxDone));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -