1. 程式人生 > 實用技巧 >STM32-使用軟體模擬I2C讀寫外部EEPROM(AT24C02)

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