?? i2c.c
字號:
/*****************************************************************/
/**Objective:IIC Module **/
/*****************************************************************/
/**Auther :Seal Luo **/
/**Date :2004-04-06 **/
/**CopyRight:C*Core 2004 **/
/*****************************************************************/
#include "IICReg.h"
extern void Delayms(uint16 uiTime);
/*--
Function:Generate a start signal on I2C bus
Input:Mode 0:slave 1:master
return void
--*/
void I2C_Start(UCHAR8 ucMode,UCHAR8 ucFistAddr)
{
UCHAR8 ucReg;
/* Slave mode */
if(ucMode == SLAVE_MODE)
{
/* enable control */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg |=0x01;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
Delayms(10);
/* enable interrupt */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg |=0x02;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
}
/*Master Mode */
if(ucMode == MASTER_MODE)
{
/* enable control */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg |=0x01;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
Delayms(10);
/* enable interrupt */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg |=0x02;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
/* config I2CSA */
ucReg = SLAVE_ADDRESS;
write_port_byte( I2C_BASE_ADDRESS + I2C_SLAVE_ADDRESS_REG , ucReg);
/*config I2CCP */
ucReg = CLOCK_PRESCALER;
write_port_byte( I2C_BASE_ADDRESS + I2C_CLOCK_PRESCALAR_REG , ucReg);
/* write slave address */
ucReg = ucFistAddr;
write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucReg);
/* check bus whether IDLE */
do
{
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
}while((ucReg>>3)==1);
/* change MSMODE 1 to 0 */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg |= 0x04;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
}
}
/*--
Function:I2C Check ACK
Input: void
Return:1->no receive ACK 2->receive ACK 4->receive AACK
--*/
UCHAR8 I2C_Check_ACK(void)
{
UCHAR8 bRet = 0x01;
UCHAR8 ucReg;
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
if((ucReg & 0x01)==0x01)
{
bRet <<=1;
}
if((ucReg & 0x02)==0x02)
{
bRet <<=2;
}
return bRet;
}
/*--
Function:I2C generate a stop signal
Input: void
Return:void
--*/
void I2C_Stop(void)
{
UCHAR8 ucReg;
/* change MSMODE 1 to 0 */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
ucReg &= 0xfb;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
}
/*--
Function:I2C write data to slave
Input:
--*/
void I2C_Write(UCHAR8 ucFistAddr,UCHAR8 ucData[],uint16 uiLength)
{
UCHAR8 ucReg;
uint16 i;
ucFistAddr &= 0xfe;
/* send start signal */
I2C_Start(MASTER_MODE,ucFistAddr);
do
{
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
if((ucReg & I2C_AACK)!=0 )
goto Exit;
}while((ucReg & I2C_TF) != I2C_TF);
/* check whether receive ack */
for(i=0;i<uiLength;i++)
{
write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucData[i]);
do
{
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
if((ucReg & I2C_AACK)!=0 )
goto Exit;
}while((ucReg & I2C_TF) != I2C_TF);
}
Exit:
/* send stop signal */
I2C_Stop();
}
/*--
Function:I2C read data from slave
Input:
--*/
void I2C_Read(UCHAR8 ucFistAddr,UCHAR8 ucLength)
{
UCHAR8 ucReg,tmp;
uint16 i;
ucFistAddr |= 0x01;
/* send start signal */
I2C_Start(MASTER_MODE,ucFistAddr);
do
{
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
if((ucReg & I2C_AACK)!=0 )
goto Exit;
}while((ucReg & I2C_RC)!=I2C_RC );
/* read control register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
if(ucLength>1)
ucReg |= 0x08;
else
{
ucReg &= 0xf7;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
do
{
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
}while((ucReg & I2C_TF)!= I2C_TF);
// pI2cBuf[0] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
write_port_byte(PMC_DATA_REG,tmp);
goto Exit;
}
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
/* check whether receive ack */
for(i=0;i<ucLength;i++)
{
do
{
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
}while((ucReg & I2C_TF)!= I2C_TF);
/*read data form bus when tf = 1 */
// pI2cBuf[i] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
write_port_byte(PMC_DATA_REG,tmp);//Write data into PMC port
/* read status register */
ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
if(i== ucLength -1)
goto Exit;
if(i == (ucLength - 2))
ucReg &= 0xf7;
else
ucReg |= 0x08;
write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
}
Exit:
/* send stop signal */
I2C_Stop();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -