S3C2440的IIC官方测试代码

S3C2440的IIC官方测试代码

#include "2440addr.h"

/*-----------------------函数声明----------------------------*/
extern void Uart_Printf(char *fmt,...);
void Wr24C02(U32 slvAddr,U32 addr,U8 data);
void Rd24C02(U32 slvAddr,U32 addr,U8 *data);
void Run_IicPoll(void);
void IicPoll(void) ;
void Delay(int x) ;
static U8 iicData[IICBUFSIZE]; 
static volatile int iicDataCount;
static volatile int iicStatus;
static volatile int iicMode;
static int iicPt;

/*------------------------------------------------------------/
函数名称: iicMain
功能描述: 入口函数
传    参: int count
返 回 值: 无
-------------------------------------------------------------*/
void iicMain(void)
{
 unsigned int i,j; 
 static U8 data[256]; 
 Uart_Printf("IIC Test(Polling) using AT24C02\n");

 //设置GPE15->IICSDA 和 GPE14->IICSCL 
 rGPEUP  |= 0xc000;   //关断上拉 
 rGPECON &= ~0xf0000000; 
 rGPECON |= 0xa0000000;  //GPE15:IICSDA , GPE14:IICSCL

 //使能ACK, 预分频 IICCLK=PCLK/16, 使能中断, 发送时钟 Tx clock=IICCLK/16 
 rIICCON  = (1<<7) | (0<<6) | (1<<5) | (0xf);
 rIICADD  = 0x10;   //2440 从地址 = [7:1] 
 rIICSTAT = 0x10;   //IIC总线数据输出使能(Rx/Tx)
  
 Uart_Printf("Write test data into AT24C02\n");

    for(i=0;i<256;i++) 
  Wr24C02(0xa0,(U8)i,i); //U32 slvAddr,U32 addr,U8 data
        for(i=0;i<256;i++)    //初始化data数组的值为0。
        data[i] = 0; 
    Uart_Printf("Read test data from AT24C02\n"); 
      for(i=0;i<256;i++)    //读24C02的0xa0地址中数据到data数组中。
        Rd24C02(0xa1,(U8)i,&(data[i]));  
    for(i=0;i<16;i++)   //输出data数组接收数据的值
    {
        for (j=0;j<16;j++)
         Uart_Printf("%2x ",data[i*16+j]); 
        Uart_Printf("\n"); 
    } 
    
    Uart_Printf("OK! Write data is same to Read data!\n"); 
    while(1);
}

/*------------------------------------------------------------/
函数名称: Wr24C02
功能描述: 写24c02
传    参: U32 slvAddr,U32 addr,U8 data
返 回 值: 无
-------------------------------------------------------------*/
void Wr24C02(U32 slvAddr,U32 addr,U8 data)

 iicMode      = WRDATA; 
 iicPt        = 0; 
 iicData[0]   = (U8)addr; 
 iicData[1]   = data; 
 iicDataCount = 2;

               //8-bit data shift register for IIC-bus Tx/Rx operation. 
 rIICDS        = slvAddr;            //0xa0

                //Master Tx mode, Start(Write), IIC-bus data output enable 
                       //Bus arbitration sucessful, Address as slave status flag Cleared, 
                     //Address zero status flag cleared, Last received bit is 0 
 rIICSTAT      = 0xf0;      

               //Clearing the pending bit isn't needed because the pending bit has been cleared. 
 while(iicDataCount!=-1) 
  Run_IicPoll(); 
 
 iicMode = POLLACK;
    while(1) 
    { 
  rIICDS     = slvAddr; 
  iicStatus = 0x100;                 //To check if _iicStatus is changed   
  rIICSTAT   = 0xf0;           //Master Tx, Start, Output Enable, Sucessful, Cleared, Cleared, 0 
  rIICCON    = 0xe0;//0xaf;     //Resumes IIC operation. //hzh 
  while(iicStatus==0x100)   
   Run_IicPoll(); 
               
        if(!(iicStatus & 0x1)) 
            break;                      //When ACK is received 
    } 
    rIICSTAT = 0xd0;                     //Master Tx condition, Stop(Write), Output Enable 
    rIICCON  = 0xe0;//0xaf;              //Resumes IIC operation.  //hzh 
    Delay(1);                           //Wait until stop condtion is in effect. 
}

/*------------------------------------------------------------/
函数名称: Rd24C02
功能描述: 读24c02
传    参: U32 slvAddr,U32 addr,U8 *data
返 回 值: 无
-------------------------------------------------------------*/
void Rd24C02(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) 
        Run_IicPoll(); 
 
    iicMode      = RDDATA; 
    iicPt        = 0; 
    iicDataCount = 1; 
     
    rIICDS   = slvAddr; 
    rIICSTAT = 0xb0; //主接收开始
    rIICCON  = 0xe0; //Resumes IIC operation.   
    while(iicDataCount!=-1) 
        Run_IicPoll(); 
 
    *data = iicData[1]; 
}

/*------------------------------------------------------------/
函数名称: Run_IicPoll
功能描述: 
传    参: 无
返 回 值: 无
-------------------------------------------------------------*/
void Run_IicPoll(void) 

    if(rIICCON & 0x10) //Tx/Rx Interrupt Enable 
       IicPoll(); 
}

/*------------------------------------------------------------/
函数名称: IicPoll
功能描述: 
传    参: 无
返 回 值: 无
-------------------------------------------------------------*/       
void IicPoll(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  = 0xe0;   //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 = 0x60;//0x2f;       //Resumes IIC operation with NOACK.     
      else  
    rIICCON = 0xe0;//0xaf;      //Resumes IIC operation with ACK 
   break;
        
  case WRDATA: 
   if((iicDataCount--)==0) 
   { 
    rIICSTAT = 0xd0;   //stop MasTx condition  
    rIICCON  = 0xe0;//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 = 0xe0;//0xaf;   //resumes IIC operation.   
   break; 
          
  case SETRDADDR: 
   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 = 0xe0;//0xaf;             //resumes IIC operation.   
            break; 
  default: 
            break;       
    } 
}

/*------------------------------------------------------------/
函数名称: Delay
功能描述: 延时函数
传    参: int x
返 回 值: 无
-------------------------------------------------------------*/
void Delay(int x)  
{
  int k, j;
  while(x)
  {
   for (k=0;k<=0xff;k++)
    for(j=0;j<=0xff;j++);
    
   x--;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值