zoukankan      html  css  js  c++  java
  • STM32-使用软件模拟I2C读写外部EEPROM(AT24C02)

    一、硬件电路

    二、代码实现

      I2C驱动程序链接:https://www.cnblogs.com/wenhao-Web/p/14151229.html

      1、软件延时

    void at24cxx_init(void) 
    {
        bsp_analog_i2c_init();
    }

      2、初始化

    void at24cxx_init(void) 
    {
        bsp_analog_i2c_init();
    }

      3、写一个字节

    int8_t at24cxx_write_one_byte(uint16_t reg, uint8_t data)
    {
        bsp_analog_i2c_start();
        /* 发送设备地址 */
        bsp_analog_i2c_send_byte(0xA0);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -1;
        }
        /* 发送寄存器地址 */
        bsp_analog_i2c_send_byte(reg);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -2;
        }
        /* 发送数据 */
        bsp_analog_i2c_send_byte(data);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -3;
        }
        bsp_analog_i2c_stop();
    
        at24cxx_delay(0xFFFF);
    
        return 0;
    }

      4、读多个字节

    int8_t at24cxx_read_byte(uint8_t reg, uint8_t *pdata, uint16_t size)
    {
        uint16_t i;
    
        bsp_analog_i2c_start();
        /* 发送设备地址 */
        bsp_analog_i2c_send_byte(0xA0);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -1;
        }
        /* 发送寄存器地址 */
        bsp_analog_i2c_send_byte(reg);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -1;
        }
        bsp_analog_i2c_start();
        /* 发送设备地址 */
        bsp_analog_i2c_send_byte(0XA1);
        if(bsp_analog_i2c_wait_ack() == 0)
        {
            bsp_analog_i2c_stop();
            return -1;
        }
        /* 接收数据 */
        for(i = 0; i < size; i++)
        {
            pdata[i] = bsp_analog_i2c_read_byte();
            if(i != size - 1 )
            {
                bsp_analog_i2c_ack();
            }
            else
            {
                bsp_analog_i2c_nack();
            }
        }
    
        bsp_analog_i2c_stop();
    
        return 0;
    }

      5、写多个字节

    int8_t at24cxx_write_byte(uint8_t reg, uint8_t *pdata, uint16_t size)
    {
        int8_t ret = 0 ;
        uint16_t i;
    
        for(i = 0; i < size; i++)
        {
            ret = at24cxx_write_one_byte(reg+i, pdata[i]);
            if(ret < 0)
                break;
        }
    
        return ret;
    }

    #endif

  • 相关阅读:
    给a标签加样式的写法
    IE6、IE7下不支持overflowy:hidden;
    fontfamily:微软雅黑
    文字加下划线
    IE8下按钮与右边的距离比IE7和IE6的多了一倍
    在button(div)里设置背景图后,在IE6下背景图的高度被撑开了
    li中包含span,在IE6、IE7下会有3pxbug
    事件冒泡
    [LeetCode] Insert Interval 解题报告
    [LeetCode] Generate Parentheses 解题报告
  • 原文地址:https://www.cnblogs.com/wenhao-Web/p/14151263.html
Copyright © 2011-2022 走看看