s3c2440A操作24C08

我这里实现的是非中断模式下的IIC操作

数据手册和代码对照着很容易看懂,尤其是数据手册上IIC那一章的几张程序流程图,一目了然。

下面是代码:

//这里没有用精确延时
void delay1()
{
	int i = 0;
	int j = 0;

	for(i = 0; i < 100; i++)
	{
		for(j = 0; j < 100; j++);
	}
}
/*************************************************************
Function name:	 IIC_Init
Description:		Initialize IIC registers
Parameters:		None
Returns:			None
**************************************************************/
void IIC_Init()
{
	//GPE14:IICSCL  GPE15:IICSDA
	rGPECON = rGPECON & (~(0xf << 28)) | (0xa << 28);	
	//GPE14 GPE15 poll up function disabled
	rGPEUP = 0xc000;

	//rIICCON[7] = 1: enable IIC_bus acknowledge bit
	//rIICCON[6] = 0: IICCLK = fPCLK / 16
	//rIICCON[5] = 1: Tx/Rx interrupt enable
	//rIICCON[3..0]: Tx clock = IICCLK/(IICCON[3:0]+1)
	rIICCON = (1 << 7) | (0 << 6) | (1 << 5) | 0x0f;
	//rIICSTAT[4] = 1: enable Rx/Tx
	rIICSTAT = (1 << 4);
	rIICADD = 0x10;
}

/*************************************************************
Function name:	 Write24C08_nbyte
Description:		Write data to 24C08
Parameters:		slave_addr: the address of IIC device, often set to "0xa0"
				IIC_addr: 	exact data address
				IIC_data:		value of data
Returns:			None
**************************************************************/
void Write24C08_nbyte(unsigned int slave_addr, unsigned int IIC_addr, unsigned char IIC_data)
{
 	unsigned int i = 0;
	unsigned int j = 0;

	rIICDS = slave_addr;  //从设备地址

	//rIICSTAT[7:6]:11--master Tx mode
	//rIICSTAT[5]: 1--start signal
	//rIICSTAT[4]: 1--enable Rx/Tx
	rIICSTAT = 0xf0;  //开始写

	while(!(rIICCON & 0x10));  //等待应答信号,该位为1,收到应答

	rIICDS = IIC_addr; //向移位寄存器送数据:数据地址
	for(i = 0; i < 10; i++);
	rIICCON = 0xaf;
	while(!(rIICCON & 0x10));

	
	rIICDS = IIC_data;	  //向移位寄存器送数据
	rIICCON = 0xaf;   //rIICCON[4] = 0:清空挂起位
	while(!(rIICCON & 0x10));
	Uart_Printf("Send %d data %d to IIC\n", IIC_addr, IIC_data);

	rIICSTAT = 0xd0; //rIICSTAT[5] = 0:STOP signal generation when write,停止信号
	rIICCON = 0xaf;	 //清空挂起位
	for(i = 0; i < 10; i++);
}

/*************************************************************
Function name:	Read24C08_nbyte
Description:		Read data from 24C08
Parameters:		slave_addr: the address of IIC device, often set to "0xa0"
				IIC_addr: 	exact data address
				databuffer:		used to storage data value
Returns:			None
**************************************************************/
void Read24C08_nbyte(U32 slave_addr,U32 IIC_addr,U8 *databuffer)
{
        unsigned int i = 0;
		unsigned int j = 0;
		unsigned int add_in = IIC_addr;
        U32 temp = 0;
		U32 tt = 0;

        rIICDS   = slave_addr;//0xa0
        rIICSTAT = 0xf0;   			//开启IIC写功能,写IIC地址
		while(!(rIICCON & 0x10));

        rIICDS   = (U8)add_in;	  //数据具体地址
        for(i=0;i<10;i++);
        rIICCON  = 0xaf;			 //清空挂起标志位resumes IIC operation.
        while(!(rIICCON & 0x10));

		rIICDS   = slave_addr;
        rIICSTAT = 0xb0;      //bit[7:6]:10--master Rx mode,master receive mode
        rIICCON  = 0xaf;
        while(!(rIICCON & 0x10));
        
		temp = rIICDS;

      	rIICCON  = 0x2f;
 		for(i=0;i<10;i++);
		while(!(rIICCON & 0x10));

    	tt = rIICDS;
		Uart_Printf("databuffer = 0x%x, %d  IIC_addr = %d, temp = %d\n", tt, tt, IIC_addr, temp);  
        rIICSTAT = 0x90;      //停止读
        rIICCON  = 0xaf;
        delay1();
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值