#define AT24C_ADDR  0x50    /// 注意这里是7bit地址
static struct rt_i2c_bus_device *at24c_dev = RT_NULL;

初始化设备:

void at24c_init(void)
{    
    /// 查找i2c总线
    at24c_dev = (void*)rt_device_find("i2c1");
    if(at24c_dev != RT_NULL)
    {
        rt_kprintf("i2c bus1 is found\r\n");      
    }
    else
    {
        rt_kprintf("i2c bus1 not found\r\n");  
    }     
}

读取数据:

int at24c_read(int addr, void *pdata,  int len)
{
    int ret;
    struct rt_i2c_msg msg[2];
    if(at24c_dev == RT_NULL)
    {
        return -1;
    }    
    msg[0].addr  = AT24C_ADDR;
    msg[0].flags = RT_I2C_WR;
    msg[0].buf   = (void*)&addr;
    msg[0].len   = 1;    
    
    msg[1].addr  = AT24C_ADDR;
    msg[1].flags = RT_I2C_RD;
    msg[1].buf   = pdata;
    msg[1].len   = len;
    
    ret = rt_i2c_transfer(at24c_dev, msg, 2); 
    if(ret == 2)
    {
        return 0;
    }
    else
    {
        return -1;
    }      
}

写操作:

int at24c_write_page(int addr, void *pdat, int len)

{
    rt_uint8_t buff[40];
    struct rt_i2c_msg msg;
    buff[0] = addr;
    rt_memcpy(&buff[1], pdat, len);    
    msg.addr  = AT24C_ADDR;
    msg.flags = RT_I2C_WR;
    msg.buf   = buff;
    msg.len   = len + 1;    
    if(rt_i2c_transfer(at24c_dev, &msg, 1) == 1)
    {
        return RT_EOK;
    }
    else
    {
        return RT_ERROR;
    }      
}
/// 写操作,需要进行分页处理
int at24c_write(int addr, void *pdat, int len)
{
    int wlen;
    char *p = pdat;
    if(at24c_dev == RT_NULL)
    {
        return -1;
    }
    while(len > 0)
    {
        wlen = 8 - (addr & 0x07);
        if(wlen > len)
        {
            wlen = len;
        }         
        at24c_write_page(addr, p, wlen);
        delayms(10);
        len  -= wlen;        
        addr += wlen;
        p    += wlen;         
    }        
    return 0;
}

添加I2C总线 修改board/Kconfig添加以下代码

 menuconfig BSP_USING_I2C1
        bool "Enable I2C1 BUS (software simulation)"
        default n
        select RT_USING_I2C
        select RT_USING_I2C_BITOPS
        select RT_USING_PIN
        if BSP_USING_I2C1
            config BSP_I2C1_SCL_PIN
                int "i2c1 scl pin number"
                range 1 100
                default 22
            config BSP_I2C1_SDA_PIN
                int "I2C1 sda pin number"
                range 1 100
                default 23
        endif

即可用menuconfig来配置


改进版的配置:

menuconfig BSP_USING_I2C
    bool "Enable I2C"
    select RT_USING_I2C
    select RT_USING_I2C_BITOPS
    default n
    if BSP_USING_I2C
        config BSP_USING_I2C1
            bool "Enable I2C1 BUS (software simulation)"
            default n               
            select RT_USING_PIN
            if BSP_USING_I2C1
                config BSP_I2C1_SCL_PIN
                    int "i2c1 scl pin number"
                    range 1 100
                    default 22
                config BSP_I2C1_SDA_PIN
                    int "I2C1 sda pin number"
                    range 1 100
                    default 23
        endif
        config BSP_USING_I2C2
            bool "Enable I2C2 BUS (software simulation)"
            default n
            select RT_USING_PIN
            if BSP_USING_I2C2
                config BSP_I2C2_SCL_PIN
                    int "i2c2 scl pin number"
                    range 1 100
                    default 48
                config BSP_I2C2_SDA_PIN
                    int "I2C2 sda pin number"
                    range 1 100
                    default 49
            endif
    endif