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

📄 iic.c

📁 smdk40100 40mhz test code
💻 C
字号:
#include <string.h>
#include "..\include\k401.h"
#include "..\include\k401lib.h"
#include "..\include\def.h"
#include "..\include\iic.h"

#define WRDATA	    (1)
#define POLLACK     (2)
#define RDDATA	    (3)
#define SETRDADDR   (4)

#define IICBUFSIZE 0x20

U8 _iicData[IICBUFSIZE];
volatile int _iicDataCount;
volatile int _iicStatus;
int _iicPt;
volatile int _iicMode;

void __irq IicInt(void);

#define iicclk (100000)

int Test_Iic(void)
{
    int i,j,isYes;
    static U8 data[256];

    Uart_Printf("[IIC Raed/Write Test using KS24C080]\n");
    pISR_IIC=(unsigned)IicInt;
    rSYSCON|=BIT_GLOBAL;
    rINTMSK=BIT_IIC;

    // Initialized IIC Bus Controller
    rIICCON=0x10;
    rIICPS=((int)(MCLK/(4. * iicclk) - 1));

    Uart_Printf("Write test data into KS24C080\n");

    for(i=0;i<256;i++)Wr24C080(0xa0, (U8)i, i);

}

void Wr24C080(U32 slaveAddr, U32 addr, U8 data)
{
    _iicMode=WRDATA;
    _iicPt=0;
    _iicData[0]=(U8)addr;
    _iicData[1]=data;
    _iicDataCount=2;

    rIICDS=slaveAddr;
    rIICCON=0x3e;

    while(_iicDataCount!=-1);

    _iicMode=POLLACK;

    while(1)
    {
	rIICDS=slvAddr;
	_iicStatus=0x100;
	rIICSTAT=0x0; //MasTx,Start
	rIICCON=0xaf;  //resumes IIC operation. 
	while(_iicStatus==0x100);
	if(!(_iicStatus&0x1))break; // when ACK is received
    }
    rIICSTAT=0xd0;  //stop MasTx condition 
    rIICCON=0xaf;   //resumes IIC operation. 
    Delay(1);	    //wait until stop condtion is in effect.

    //write is completed.
}

void __irq IicInt(void)
{
    U32 iicSt,i;

    iicSt=rIICSTAT; 
    if(iicSt&0x8){} // when bus arbitration is failed.
    if(iicSt&0x4){} // when a slave address is matched with IICADD
    if(iicSt&0x2){} // when a slave address is 0000000b
    if(iicSt&0x1){} // when ACK isn't received

    switch(_iicMode)
    {
    case POLLACK:
	_iicStatus=iicSt;
	break;

    case RDDATA:
	if((_iicDataCount--)==0)
	{
	    _iicData[_iicPt++]=rIICDS;
	    
	    rIICSTAT=0x90;  //stop MasRx condition 
	    rIICCON=0xaf;   //resumes IIC operation.
	    Delay(1);	    //wait until stop condtion is in effect.
				//too long time... 
	    break;    
	}	     
	_iicData[_iicPt++]=rIICDS;
			    
					     //The last data has to be read with no ack.
	if((_iicDataCount)==0)rIICCON=0x2f;  //resumes IIC operation with NOACK.  
	else rIICCON=0xaf;		     //resumes IIC operation with ACK
	break;

    case WRDATA:
	if((_iicDataCount--)==0)
	{
	    rIICSTAT=0xd0;  //stop MasTx condition 
	    rIICCON=0xaf;  //resumes IIC operation.
	    Delay(1);	    //wait until stop condtion is in effect.
	    break;    
	}
	rIICDS=_iicData[_iicPt++];  //_iicData[0] has dummy.
	for(i=0;i<10;i++);	    //for setup time until rising edge of IICSCL
	rIICCON=0xaf;		    //resumes IIC operation.
	break;

    case SETRDADDR:
	//Uart_Printf("[S%d]",_iicDataCount);
	if((_iicDataCount--)==0)
	{
	    break;  //IIC operation is stopped because of IICCON[4]    
	}
	rIICDS=_iicData[_iicPt++];
	for(i=0;i<10;i++);  //for setup time until rising edge of IICSCL
	rIICCON=0xaf;	    //resumes IIC operation.
	break;

    default:
	break;	  
    }
}

⌨️ 快捷键说明

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