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

📄 iicdrv.c

📁 IIC驱动程序
💻 C
字号:


#include "StdAfx.h"
#include "IICDrv.h"
#include "CPU_S3C44B0x.h"
//#define UINT    U16
//#define UINT32  U32
//#define BYTE	unsigned char

//------------------------------------------------------------------------------
// 初始化IIC总线
void IIC_init(void)
{
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
    //disable interrupt, IICCLK=MCLK/512, Enable ACK
    //40Mhz/512/(0+1) = 117Khz
    *(volatile UINT32 *)CN_CPU_IICSTAT=0xd0;
    *(volatile UINT32 *)CN_CPU_IICADD=0x10;
}


//=======================================================
// 函数名称:IIC_WaitBus
// 函数功能:等待IIC总线操作结束
// 输入参数:
// 输出参数:
// 返回值:若操作等待超时返回false,正确则返回true
// 说明:
//=======================================================
char IIC_WaitBus(void)
{
    UINT i=0;

    while(!((*(volatile UINT32*)CN_CPU_IICCON)&0x10))    //等待发送中断
    {
        i++;
        if(i>1000)
            return(FALSE);
    }
    return(TRUE);// added by wy 2005.08.30
}

//=======================================================
// 函数名称:IIC_WaitBus
// 函数功能:等待IIC总线应答信号
// 输入参数:
// 输出参数:
// 返回值:若操作等待超时或得不到应答信号,返回false,正确则返回true
// 说明:先等待操作结束信号,然后判断是否有应答
//=======================================================
char IIC_WaitAck(void)
{
    UINT i=0;

    while(!((*(volatile UINT32*)CN_CPU_IICCON)&0x10))    //等待发送中断
    {
        i++;
        if(i>1000)
            return(FALSE);
    }
    if((*(volatile UINT32*)CN_CPU_IICSTAT)&0x1)
        return(FALSE);
    return(TRUE);
}

//=======================================================
// 函数名称:IIC_WaitEnd
// 函数功能:等待写操作结束
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================

char IIC_WaitEnd(void)
{
    int i,k;

    for (i=0;i<100;i++)
    {
        *(volatile UINT32*)CN_CPU_IICDS =AT24128256_w;  // 地址字节
        for(k=0;k<100;k++);
        *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
//        for(j=0;j<100;j++);
        *(volatile UINT32*)CN_CPU_IICSTAT =0xf0;        // 启动发送
        k=0;
    	if(IIC_WaitAck()==TRUE)
    	    return(TRUE);
    }
//    *(volatile UINT32*)CN_CPU_IICSTAT =0xd0;                    //产生停止信号
//    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
    return(FALSE);
}

//=======================================================
// 函数名称:IIC_Read
// 函数功能:读定值芯片
//
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================

//读24C128
void IIC_Read(UINT start,UINT length,char * buf)
{
    int i,iicbusy,k;

    //读出地址大于芯片容量则退出
    if( (start+length) > CN_IIC_VOLUME ) return;

    iicbusy=IIC_WaitEnd();

    for(k=0;k<100;k++);
//	*(volatile UINT32*)CN_CPU_IICSTAT =0xf0;	//启动发送
//	*(volatile UINT32*)CN_CPU_IICDS =AT24128256_w;
//    for(k=0;k<100;k++);
//    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
//	iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
//	while((iicSt&0x1))
//	//等待应答位
//		iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;

    *(volatile UINT32*)CN_CPU_IICDS =(BYTE)(start/256);    //地址高字节
    for(k=0;k<100;k++);
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
	if(IIC_WaitAck()==FALSE)
	    return;

    *(volatile UINT32*)CN_CPU_IICDS =(BYTE)(start%256);    //地址低字节
    for(k=0;k<100;k++);
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
//    for(k=0;k<100;k++);
	if(IIC_WaitAck()==FALSE)
	    return;

//    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(0<<5)|3;//resumes IIC operation.

    *(volatile UINT32*)CN_CPU_IICSTAT =0xb0;                //设置为主机接收方式
    *(volatile UINT32*)CN_CPU_IICDS =AT24128256_r;      //发读命令
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
	if(IIC_WaitAck()==FALSE)
	    return;

//    buf[0]=*(volatile UINT32*)CN_CPU_IICDS;
//
//    iicSt=0;
//    while(!(iicSt&0x10))    //等待接收中断
//    {
//        iicSt=*(volatile UINT32*)CN_CPU_IICCON;
//    }

    for(i=0;i<length;i++)
    {
        if(i==length-1)
        {
            *(volatile UINT32*)CN_CPU_IICCON =0xe3;
            *(volatile UINT32*)CN_CPU_IICCON =0x63;     //禁止ACK信号
//            for(k=0;k<100;k++);
        }
//        else if(i==length-1)
//        {
//            buf[i]=*(volatile UINT32*)CN_CPU_IICDS;
//            *(volatile UINT32*)CN_CPU_IICSTAT =0x90;        //发出停止信号,退出接收状态
//            for(k=0;k<100;k++);
//            *(volatile UINT32*)CN_CPU_IICCON =0xe3;
//            break;
//        }
        else
            *(volatile UINT32*)CN_CPU_IICCON =0xe3;
    	if(IIC_WaitBus()==FALSE)
    	    return;
        buf[i]=*(volatile UINT32*)CN_CPU_IICDS;
    }
    *(volatile UINT32*)CN_CPU_IICSTAT =0x90;        //发出停止信号,退出接收状态
    for(k=0;k<100;k++);
    *(volatile UINT32*)CN_CPU_IICCON =0xe3;
}

//=======================================================
// 函数名称:IIC_Write
// 函数功能:写定值芯片
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================

void IIC_Write( UINT start, UINT length, char *buf )
{
    int i,j,iicbusy,k,addr=start;

    //写入地址大于芯片容量则退出
    if( addr+length > CN_IIC_VOLUME )  return;


    iicbusy = IIC_WaitEnd();


    *(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr/256);    //地址高字节
    for(k=0;k<100;k++);
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
//    for(k=0;k<100;k++);
	if(IIC_WaitAck()==FALSE)
	    return;

    *(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr%256);    //地址低字节
    for(k=0;k<100;k++);
    *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
	if(IIC_WaitAck()==FALSE)
	    return;

    j=FALSE;
    for (i=0;i<length;i++)
    {
        if(j)
        {
   			j=FALSE;
			iicbusy = IIC_WaitEnd();
//            *(volatile UINT32*)CN_CPU_IICSTAT =0xd0;                    //产生停止信号
//            *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
//
//			*(volatile UINT32*)CN_CPU_IICDS =AT24128256_w;
////            *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
//        	*(volatile UINT32*)CN_CPU_IICSTAT =0xf0;	//启动发送
//			iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
//			while((iicSt&0x1))
//			//等待应答位
//			iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;

            for(k=0;k<100;k++);
            *(volatile UINT32*)CN_CPU_IICDS =(BYTE)((addr+i)/256);    //地址高字节
            for(k=0;k<100;k++);
            *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
        //    for(k=0;k<100;k++);
        	if(IIC_WaitAck()==FALSE)
        	    return;

            *(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr+i);    //地址低字节
            for(k=0;k<100;k++);
            *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
        //    for(k=0;k<100;k++);
        	if(IIC_WaitAck()==FALSE)
        	    return;
        }

        *(volatile UINT32*)CN_CPU_IICDS =buf[i];
        for(k=0;k<100;k++);
        *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
//        for(k=0;k<100;k++);
    	if(IIC_WaitAck()==FALSE)
    	    return;

        if((i<length)&&(((addr+i+1) % pagelength)==0))
        {
            *(volatile UINT32*)CN_CPU_IICSTAT =0xd0;                    //产生停止信号
            *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
//            addr=i+1;
//        	iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
//        	while((iicSt&0x1))
//        	//等待应答位
//        		iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
            taskDelay(1);
            j=TRUE;
        }
    }
    if(!j)
    {
        *(volatile UINT32 *)CN_CPU_IICSTAT =0xd0;                            //产生停止信号
        *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
    }
    taskDelay(1);

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -