zoukankan      html  css  js  c++  java
  • 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;   
    }

  • 相关阅读:
    mongodb的sql例子(简单版)
    git上传github上
    git中的版本库,暂存区和工作区
    进程与线程的区别
    mysql 在linux 修改账号密码
    linux 下 yum 安装mysql
    linux 下 修改mysql账号密码
    linux 下开放端口问题
    linux 下安装tomcat
    Ubuntu 配置Tomcat环境(转载)
  • 原文地址:https://www.cnblogs.com/hnrainll/p/1877232.html
Copyright © 2011-2022 走看看