• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

求一份lpc1768单片机GPIO模拟I2C读写AT24C512的程序

那是我的最爱 2015-12-25 浏览量:1800
如果有哪位高人知道,还请不吝指点啊,小弟已经没有办法了,求一份lpc1768单片机GPIO模拟I2C读写AT24C512的程序
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 哦哦 ,

    #include "lpc17xx.h"
    //=============================================================================
    #define  READ    1
    #define  WRITE   1
    //=============================================================================
    //SDA=P0.0
    //SCL=P0.1

    #define U8  unsigned char 
    #define U16 unsigned short
    #define U32 unsigned int

    #define SDA_H  { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<0); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN | (1<<0);}
    #define SDA_L  { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<0); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN & (~(1<<0));}

    #define SCL_H  { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<1); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN | (1<<1);}
    #define SCL_L  { LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | (1<<1); LPC_GPIO0->FIOPIN =LPC_GPIO0->FIOPIN & (~(1<<1));}
    /******************************************************************************
    函数:I2C_Delay()
    功能:模拟I2C总线延时
    说明:请根据具体情况调整延时值
    ******************************************************************************/
    void I2C_Delay(){
    unsigned int t;
    t = 10;
    while ( --t != 0 ); //延时2*t个机器周期
    }
    //=============================================================================
    U8 SDA(){
        LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) & (~(1<<0));
    return ((LPC_GPIO0->FIOPIN & (0x01))>>0);
    }
    /******************************************************************************
    函数:I2C_Init()
    功能:I2C总线初始化,使总线处于空闲状态
    说明:在main()函数的开始处,应当执行一次本函数
    ******************************************************************************/
    void I2C_Init(){
    LPC_GPIO0->FIODIR=(LPC_GPIO0->FIODIR) | ((1<<0)|(1<<1));

    SCL_H;
    I2C_Delay();
    SDA_H;
    I2C_Delay();
    }


    /******************************************************************************
    函数:I2C_Start()
    功能:产生I2C总线的起始条件
    说明:
    SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
    本函数也用来产生重复起始条件
    ******************************************************************************/
    void I2C_Start(){
    SDA_H;
    I2C_Delay();
    SCL_H;
    I2C_Delay();
    SDA_L;
    I2C_Delay();
    SCL_L;
    I2C_Delay();
    }


    /******************************************************************************
    函数:I2C_Write()
    功能:向I2C总线写1个字节的数据
    参数:dat是要写到总线上的数据
    ******************************************************************************/
    void I2C_Write(unsigned char dat){
    unsigned char t = 8;
    do{
    if(dat&0x80)SDA_H
    else SDA_L
    dat <<= 1;
    SCL_H;
    I2C_Delay();
    SCL_L;
    I2C_Delay();
    } while ( --t != 0 );
    }
    /******************************************************************************
    函数:I2C_GetAck()
    功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
    返回:
    0:从机应答
    1:从机非应答
    说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
    ******************************************************************************/
    U8 I2C_GetAck(){
    U8 ack;
    SDA_H;
    I2C_Delay();
    SCL_H;
    I2C_Delay();
    ack = SDA();
    SCL_L;
    I2C_Delay();
    return ack;
    }
    /******************************************************************************
    函数:I2C_Stop()
    功能:产生I2C总线的停止条件
    说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
    ******************************************************************************/
    void I2C_Stop(){
    unsigned int t;
    SDA_L;
    I2C_Delay();
    SCL_H;
    I2C_Delay();
    SDA_H;
    I2C_Delay();
        //对于某些器件来说,在下一次产生Start之前,额外增加一定的延时是必须的
    t = 15;
    while ( --t != 0 );
    }

    /******************************************************************************
    函数:I2C_Puts()
    功能:主机通过I2C总线向从机发送1个字节的数据
    参数:
    SlaveAddr:从机地址(高7位是从机地址,最低位是读写标志)
    SubAddr:从机的子地址
    size:数据大小(以字节计)
    dat:要发送的数据
    返回:
    0:发送成功
    1:在发送过程中出现异常
    ******************************************************************************/
    U8 I2C_Puts(unsigned char dat){
    I2C_Write(dat);
    if ( I2C_GetAck() ){
    I2C_Stop();
    return 1;
    }
    return 0;

    }
    /******************************************************************************
    函数:I2C_PutAck()
    功能:主机产生应答位(应答或非应答),用于通知从机:主机是否成功接收从机数据
    参数:
    ack=0:主机非应答
    ack=1:主机应答
    说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答
    ******************************************************************************/
    void I2C_PutAck(U8 ack){
        if(ack)SDA_H
    else SDA_L
    I2C_Delay();
    SCL_H;
    I2C_Delay();
    SCL_L;
    I2C_Delay();
    }
    /******************************************************************************
    函数:I2C_Read()
    功能:从从机读取1个字节的数据
    返回:读取的1个字节数据
    ******************************************************************************/
    unsigned char I2C_Read(){
    unsigned char dat;
    unsigned char t = 8;
    SDA_H; //在读取数据之前,要把SDA拉高,使之处于输入状态
    do{
    SCL_H;
    I2C_Delay();
    dat <<= 1;
    if( SDA() ) dat++;
    SCL_L;
    I2C_Delay();
    } while ( --t != 0 );
    return dat;
    }


    • 发布于 2015-12-25
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3

相关问题

问题达人换一批

求一份lpc1768单片机GPIO模拟I2C读写AT24C512的程序