STM32-使用軟件模擬I2C讀寫外部EEPROM(AT24C02)


一、硬件電路

二、代碼實現

  I2C驅動程序鏈接:https://www.cnblogs.com/wenhao-Web/p/14151229.html

  1、軟件延時

void at24cxx_delay(uint32_t t)
{
    uint32_t i, j;
for(i = 0; i < t; i++) { for(j = 100; j > 0; j--); } }

 

 

  2、初始化

void at24cxx_init(void) 
{
    bsp_analog_i2c_init();
}

 

  3、寫一個字節

int8_t at24cxx_write_one_byte(uint8_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM