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

📄 iic.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
// 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 + -