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

📄 iic.c

📁 ARM7开发板44B0的无操作系统测试程序。
💻 C
字号:
#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
#include "..\inc\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;
volatile int _iicMode;
int _iicPt;

void __irq IicInt(void);

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

  Uart_Printf("[IIC Test using KS24C02]\n");

  pISR_IIC=(unsigned)IicInt;
  rINTMSK=~(BIT_GLOBAL|BIT_IIC);

  rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
  //Enable interrupt, IICCLK=MCLK/16, Enable ACK
  //40Mhz/16/(15+1) = 257Khz	
  rIICADD=0x10;   // AT24C02 IIC slave address

  rIICSTAT=0x10;

  Uart_Printf("First we write 0x00~0xFF into AT24C02.\n");
  
  //将0~255写入到AT24C02中
  for(i=0;i<256;i++)
	{
	  Wr24C040(0xa0,(U8)i,(255-i));
	}
	
	//将数据Buffer清空,待会从AT24C02读取数据到这里
  for(i=0;i<256;i++)
	{
	  data[i]=0;
	}

  //从AT24C02中读取数据到data buffer里面
  Uart_Printf ("Now, We read test data from AT24C02.\n");
  for(i=0;i<256;i++)
	{
	  Rd24C040(0xa0,(U8)i,&(data[i]));
	}

  Uart_Printf ("The returned data are :.\n");
  for(i=0;i<16;i++)
  {
	  for(j=0;j<16;j++)
	  {
	    Uart_Printf("%2x ",data[i*16+j]);
	  }
	  Uart_Printf("\n");
  }
}


void Wr24C040(U32 slvAddr,U32 addr,U8 data)
{
  _iicMode=WRDATA;
  _iicPt=0;
  _iicData[0]=(U8)addr;
  _iicData[1]=data;
  _iicDataCount=2;
    
  rIICDS=slvAddr;//0xa0
  rIICSTAT=0xf0; //MasTx,Start
  //Clearing the pending bit isn't needed because the pending bit has been cleared.
  while(_iicDataCount!=-1);

  _iicMode=POLLACK;

  while(1)
  {
	  rIICDS=slvAddr;
	  _iicStatus=0x100;
	  rIICSTAT=0xf0; //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 Rd24C040(U32 slvAddr,U32 addr,U8 *data)
{
    _iicMode=SETRDADDR;
    _iicPt=0;
    _iicData[0]=(U8)addr;
    _iicDataCount=1;

    rIICDS=slvAddr;
    rIICSTAT=0xf0; //MasTx,Start  
    //Clearing the pending bit isn't needed because the pending bit has been cleared.
    while(_iicDataCount!=-1);

    _iicMode=RDDATA;

    _iicPt=0;
    _iicDataCount=1;
    
    rIICDS=slvAddr;
    rIICSTAT=0xb0; //MasRx,Start
    rIICCON=0xaf;  //resumes IIC operation.   
    while(_iicDataCount!=-1);

    *data=_iicData[1];
}



void __irq IicInt(void)
{
    U32 iicSt,i;
    rI_ISPC=BIT_IIC;

    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... 
		//The pending bit will not be set after issuing stop condition.
		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.
		//The pending bit will not be set after issuing stop condition.
		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 + -