LPC2103开发板I2C测试试验

工程下载地址:http://blog.chinaunix.net/u3/106835/showart_2389150.html
#include "config.h" //相关头文件

 


#define C02MasterAddr 

0xa0//C02的器件地址
#define C02SlaveAddr  0   //读写数据的起始地址
#defineLED           (1 << 19)//LED IO口号
#defineLED2          (1 << 20)

 

#defineAA            (1 << 2)//I2CONSET的各位定义
#defineSI            (1 << 3)
#defineSTO           (1 << 4)
#defineSTA           (1 << 5)
#defineI2EN          (1 << 6)

#defineWRMode        0    //写模式
#defineRDMode        1    //读模式

#definelastbyte      1    //是否为最后一个字节

 

uint8 I2C_buf1 = 5;
uint8 I2C_buf2 = 0;
//延时函数
void Delay(uint32 dly)
{
    uint32i;
    
    for(; dly> 0; dly--)
    {
      for(i = 0; i < 50000; i++);
    }
}

//I2C初始化函数
void I2C_Init(uint32 Fi2c)
{
    if(Fi2c> 400000)
    {
      Fi2c =400000;
    }
    
    PINSEL0 =(PINSEL0 & (~0xf0)) |0x50;//这里是让P02,P03选第二功能,即I2C总线
    
    I2SCLH =(Fpclk/Fi2c + 1) / 2;//设置I2C速度为400K
    I2SCLL =(Fpclk/Fi2c) / 2;
    
    I2CONCLR =0x2c; //主发送模式对STA,AA,SI清零
    I2CONSET =0x40;//使用I2C总线
    
//    I2CONCLR =STA|AA|SI;
//    I2CONSET =I2EN;
    
}
//I2C bus start function
void I2C_Start(void)
{
    I2CONSET =STA;//set start condition
   do{}while(0x08 != I2STAT);//A start condition hasbeen transmitted
    I2CONCLR =STA;//clear start condition
}

//I2C bus stop function
void I2C_Stop(void)
{
    I2CONSET =STO; //set STO condition
    I2CONCLR =SI; //clear SI condition
}
//write byte function
void WriteByte(uint8 data)
{
    I2DAT =data;// data transmitted
    I2CONCLR =SI;//clear SI condition
}
//wirte I2C bus address mode is RDMode or WRMode
void WriteAddr(uint8 Mode)
{
   WriteByte(C02MasterAddr + Mode);//transmite theI2C address and R/W mode
    
   if(Mode)
    {
      do{}while(0x40 != I2STAT);//SLA+R has beentransmitted;ACK has been recevied
    }
    else
    {
      do{}while(0x18 != I2STAT);//SLA+W has beentransmitted;ACK has been received
    }
}
//write data to I2C
void WriteData(uint8 data)
{
   WriteByte(data);// data is will transmiteddata
   do{}while(0x28 != I2STAT);//Data byte in I2DAThas been transmitted;ACK has been received
}
//read i2c byte
uint8 ReadByte(uint8 last)
{
   if(last)
    {
      I2CONCLR = AA;
      I2CONCLR = SI;
      
      do{} while(0x58 != I2STAT);//data byte has beenreceived;NOT ACK has been returned
    }
    else
    {
      I2CONSET = AA;//transmited ACK
      I2CONCLR = SI;
      do{}while(0x50 != I2STAT);//data byte has beenreceived;ACK has been returned.
   }   
    
    returnI2DAT;//return read data
}
//write data into 24c02
void WriteC02(void)
{
//    uint8i;//define unsigned char i
   I2C_Start();
   WriteAddr(WRMode);
   WriteData(C02SlaveAddr);//the data storaddress
    
   WriteData(I2C_buf1);
   I2C_Stop();
}

//read I2C data
void ReadC02(void)
{
//    uint8i;
   I2C_Start();
   WriteAddr(WRMode);
   WriteData(C02SlaveAddr);
   I2C_Stop();
    
   I2C_Start();
   WriteAddr(RDMode);
    
    I2C_buf2 =ReadByte(lastbyte);
    
   I2C_Stop();
}

int main(void)
{
    
    PINSEL0 =0x00000000;
    PINSEL1 =0x00000000;
    
    IODIR =LED|LED2;
    IOSET =LED|LED2;

    
   I2C_Init(400000);
    
   WriteC02();
   Delay(1000);
   ReadC02();
    
    if(I2C_buf2== I2C_buf1)
    {
   while(1){
      IOCLR = LED;//correct LED1 light
      Delay(50);
      IOSET = LED;
      Delay(50);
      }
    }
    else
    {
      while(1)
      {
         IOCLR = LED2;//error LED2 light
         Delay(50);
         IOSET = LED2;
         Delay(50);
      }
    }
    
    


return 0;   
}

posted @ 2010-11-14 22:35  hnrainll  阅读(744)  评论(0编辑  收藏  举报