• stm32f030 模拟IIC


    #define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA
    #define set_SDA GPIO_SetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
    #define clr_SDA GPIO_ResetBits(GPIOA, GPIO_Pin_10) //PA10 SDA
    #define set_SCL GPIO_SetBits(GPIOA, GPIO_Pin_9) //PA9 SCL
    #define clr_SCL GPIO_ResetBits(GPIOA, GPIO_Pin_9) //PA9 SCL

    /*******************************************************************************
    ** IO¿ÚÅäÖÃ
    *******************************************************************************/
    void IO_Confing(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;//Òý½ÅÑ¡Ôñ
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//Êä³öģʽ
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³öģʽ
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//´øÉÏÀ­µç×è
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//Êä³öËÙ¶È
    GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);

    }
    /*******************************************************************************
    ** SDA¿ÚÅäÖÃ
    *******************************************************************************/
    void SDA_MODE_IN(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//Òý½ÅÑ¡Ôñ
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//ÊäÈëģʽ
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ
    }
    void SDA_MODE_OUT(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//Òý½ÅÑ¡Ôñ
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//Êä³öģʽ
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//²»´øÉÏÀ­µç×è
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//Êä³öËÙ¶È
    GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯ÅäÖÃ
    }

    //*******************************************************************
    // Æð¶¯×ÜÏߺ¯Êý
    //º¯ÊýÔ­ÐÍ: void Start_I2c();
    //¹¦ÄÜ: Æô¶¯I2C×ÜÏß,¼´·¢ËÍI2CÆðʼÌõ¼þ.
    //*******************************************************************
    void Start_I2c(void)
    {
    SDA_MODE_OUT();
    clr_SDA; //·¢ËÍÆðʼÐźÅ
    delay_us(2); //ÑÓʱ2us
    clr_SCL; //ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
    delay_us(2); //ÑÓʱ2us
    }
    //*******************************************************************
    // ½áÊø×ÜÏߺ¯Êý
    //º¯ÊýÔ­ÐÍ: void Stop_I2c();
    //¹¦ÄÜ: ½áÊøI2C×ÜÏß,¼´·¢ËÍI2C½áÊøÌõ¼þ.
    //*******************************************************************
    void Stop_I2c(void)
    {
    SDA_MODE_OUT();
    clr_SDA; //·¢ËÍÆðʼÐźÅ
    delay_us(2); //ÑÓʱ2us
    set_SCL;
    delay_us(2); //ÑÓʱ2us
    set_SDA; //·¢ËÍI2C×ÜÏß½áÊøÐźÅ
    delay_us(5); //ÑÓʱ5us
    }
    //********************************************************************
    // Ó¦´ð×Óº¯Êý
    //º¯ÊýÔ­ÐÍ: void Ack_I2c(bit a);
    //¹¦ÄÜ: Ö÷¿ØÆ÷½øÐÐÓ¦´ðÐźÅ(¿ÉÒÔÊÇÓ¦´ð»ò·ÇÓ¦´ðÐźţ¬ÓÉλ²ÎÊýa¾ö¶¨)
    //********************************************************************
    void Ack_I2c(u8 a) //Ó¦´ð»òÕß²»Ó¦´ð SDA=0Ó¦´ð£¬SDA=1·ÇÓ¦´ð
    {
    SDA_MODE_OUT();
    clr_SCL; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ
    delay_us(2); //ÑÓʱ2us
    if(a==0)
    clr_SDA; //ÔÚ´Ë·¢³öÓ¦´ð»ò·ÇÓ¦´ðÐźÅ
    else
    set_SDA;
    delay_us(2); //ÑÓʱ2us
    set_SCL;
    delay_us(2); //ÑÓʱ2us
    clr_SCL; //ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ
    delay_us(2); //ÑÓʱ2us
    clr_SDA; //·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźÅ
    delay_us(2); //ÑÓʱ2us
    }
    //*******************************************************************
    // ×Ö½ÚÊý¾Ý·¢Ëͺ¯Êý
    //¹¦ÄÜ: ½«Êý¾Ýc·¢ËͳöÈ¥,¿ÉÒÔÊǵØÖ·,Ò²¿ÉÒÔÊÇÊý¾Ý,·¢ÍêºóµÈ´ýÓ¦´ð,²¢¶Ô
    // ´Ë״̬λ½øÐвÙ×÷.(²»Ó¦´ð»ò·ÇÓ¦´ð¶¼Ê¹ack=0)
    // ·¢ËÍÊý¾ÝÕý³££¬ack=1; ack=0±íʾ±»¿ØÆ÷ÎÞÓ¦´ð»òË𻵡£
    //*******************************************************************
    void SendByte(unsigned char dat)
    {
    unsigned char BitCnt;
    for(BitCnt=0;BitCnt<8;BitCnt++) //Òª´«Ë͵ÄÊý¾Ý³¤¶ÈΪ8λ
    {
    if((dat<<BitCnt)&0x80)
    set_SDA; //ÅжϷ¢ËÍλ
    else
    clr_SDA;

    delay_us(2); //ÑÓʱ2us
    set_SCL; //ÖÃʱÖÓÏßΪ¸ß£¬Í¨Öª±»¿ØÆ÷¿ªÊ¼½ÓÊÕÊý¾Ýλ
    delay_us(2); //ÑÓʱ3us
    clr_SCL;
    delay_us(2); //ÑÓʱ1us
    }
    SDA_MODE_IN();
    set_SCL;
    delay_us(2); //ÑÓʱ2us
    if(read_SDA==1)
    ack=0;
    else
    ack=1; //ÅжÏÊÇ·ñ½ÓÊÕµ½Ó¦´ðÐźÅ
    clr_SCL;
    delay_us(2); //ÑÓʱ2us
    SDA_MODE_OUT();
    delay_us(2); //ÑÓʱ2us
    clr_SDA;
    }

    //*******************************************************************
    // ×Ö½ÚÊý¾Ý½ÓÊÕº¯Êý
    //º¯ÊýÔ­ÐÍ: UCHAR RcvByte();
    //¹¦ÄÜ: ÓÃÀ´½ÓÊÕ´ÓÆ÷¼þ´«À´µÄÊý¾Ý,²¢ÅжÏ×ÜÏß´íÎó(²»·¢Ó¦´ðÐźÅ)£¬
    // ·¢ÍêºóÇëÓÃÓ¦´ðº¯ÊýÓ¦´ð´Ó»ú¡£
    //*******************************************************************
    unsigned char RcvByte(void)
    {
    unsigned char retc=0;
    unsigned char BitCnt;
    SDA_MODE_IN();
    delay_us(1);
    for(BitCnt=0;BitCnt<8;BitCnt++)
    {
    clr_SCL; //ÖÃʱÖÓÏßΪµÍ£¬×¼±¸½ÓÊÕÊý¾Ýλ
    delay_us(2); //ÑÓʱ5us
    set_SCL; //ÖÃʱÖÓÏßΪ¸ßʹÊý¾ÝÏßÉÏÊý¾ÝÓÐЧ
    delay_us(2); //ÑÓʱ2us
    retc=retc<<1;
    if(read_SDA==1)
    retc=retc+1; //¶ÁÊý¾Ýλ,½ÓÊÕµÄÊý¾Ýλ·ÅÈëretcÖÐ
    delay_us(2); //ÑÓʱ2us
    }
    clr_SCL;
    delay_us(2); //ÑÓʱ2us
    return(retc);
    }
    //*******************************************************************
    // ÏòÓÐ×ÓµØÖ·Æ÷¼þ¶ÁÈ¡¶à×Ö½ÚÊý¾Ýº¯Êý
    //º¯ÊýÔ­ÐÍ: bit RecndStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);
    //¹¦ÄÜ: ´ÓÆô¶¯×ÜÏßµ½·¢Ë͵ØÖ·£¬×ÓµØÖ·,¶ÁÊý¾Ý£¬½áÊø×ÜÏßµÄÈ«¹ý³Ì,´ÓÆ÷¼þ
    // µØÖ·sla£¬×ÓµØÖ·suba£¬¶Á³öµÄÄÚÈÝ·ÅÈësÖ¸ÏòµÄ´æ´¢Çø£¬¶Áno¸ö×Ö½Ú¡£
    // Èç¹û·µ»Ø1±íʾ²Ù×÷³É¹¦£¬·ñÔò²Ù×÷ÓÐÎó¡£
    //×¢Ò⣺ ʹÓÃÇ°±ØÐëÒѽáÊø×ÜÏß¡£
    //********************************************************************
    u8 IRcvStr(unsigned char sla,unsigned char *s,unsigned char no)
    {
    unsigned char i;

    Start_I2c(); //Æô¶¯×ÜÏß
    SendByte(sla); //·¢ËÍÆ÷¼þµØÖ·
    if(ack==0)//ÎÞÓ¦´ð
    {
    Stop_I2c();
    return 0;
    }
    for(i=0;i<no-1;i++)
    {
    *s=RcvByte(); //
    Ack_I2c(0); //½ÓÊվʹðλ
    s++;
    }
    *s=RcvByte();
    Ack_I2c(1); //·¢ËÍ·ÇӦλ
    Stop_I2c(); //½áÊø×ÜÏß
    return 1;
    }

  • 相关阅读:
    jenkins(5): jenkins邮件报警配置
    Hive(二)—— 架构设计
    Flume(三) —— 断点续传 与 事务
    Flume(二) —— 自定义拦截器、Source、Sink
    Canal —— 基本概念及使用
    Kafka(五) —— Kafka源码本地调试
    Hadoop(五)—— HDFS NameNode、DataNode工作机制
    Cloudera-Manage —— 基本概念及使用
    【系统设计&解决方案】秒杀系统设计
    HBase(一) —— 基本概念及使用
  • 原文地址:https://www.cnblogs.com/yuandongtao1989/p/6912275.html
Copyright © 2020-2023  润新知