1. 程式人生 > >RT-Thread使用I2C讀寫eeprom例程(24c02)

RT-Thread使用I2C讀寫eeprom例程(24c02)

實驗準備:

開發板:正點原子探索者

RT-Thread原始碼

env工具

env配置:

使能相關的uart,用於開啟控制檯

開啟I2C裝置:

實驗原始碼:

#include <rtthread.h>
#include <rtdevice.h>

#ifndef EEP_I2CBUS_NAME
#define EEP_I2CBUS_NAME          "i2c2"  /* 連線的I2C匯流排裝置名稱 */
#endif

#define EEP_ADDR             0x50  //從裝置晶片地址

rt_uint8_t wr_data = 0x15;
#define SIZE sizeof(wr_data)	


static struct rt_i2c_bus_device *eep_i2c_bus = RT_NULL;

//寫EEPROM
//write_addr:開始寫入的地址 對24c02為0~255
//data:寫入的資料
//number:資料個數
rt_err_t eeprom_iic_write(rt_uint8_t write_addr, rt_uint8_t data, rt_uint32_t number)
{
   rt_uint8_t buf[2];

    buf[0] = write_addr;
    buf[1] = data;
    rt_size_t result;
  
    result = rt_i2c_master_send(eep_i2c_bus, EEP_ADDR, RT_I2C_WR, buf, 2);
    rt_thread_mdelay(10);  //必須延時
    if (result == 2)
    {
        rt_kprintf("EEP write ok \r\n");
        return RT_EOK;       
    }
    else
    {
        rt_kprintf("EEP write failed ,ERR is: %d \r\n",result);
        return -RT_ERROR;       
    }
}

//讀EEPROM
//read_addr:開始讀出的地址 對24c02為0~255
//number:資料個數
rt_err_t eeprom_iic_read(rt_uint8_t read_addr, rt_uint32_t len, rt_uint8_t *buf)
{   
    //通知要讀哪個裝置的哪個記憶體地址的內容,(告知是需要讀read_addr)
    rt_i2c_master_send(eep_i2c_bus, EEP_ADDR, RT_I2C_WR, &read_addr, 1);
    
    //讀取到的內容存入buf
    rt_i2c_master_recv(eep_i2c_bus, EEP_ADDR, RT_I2C_RD, buf, len);//地址讀資料
}

int i2c_eeprom_sample(void)
{
    rt_uint8_t buf;
    //尋找裝置
     eep_i2c_bus = rt_i2c_bus_device_find(EEP_I2CBUS_NAME);
     rt_kprintf("EEP set i2c bus to %s\r\n", EEP_I2CBUS_NAME);
    
     eeprom_iic_write(0x00,wr_data,SIZE);//0x00地址寫資料wr_data
     
     eeprom_iic_read(0x00, 1, &buf);//0x00地址讀資料
     if(buf == wr_data)
     {
        rt_kprintf("EEP read ok ,data is: 0x%02x \r\n",buf);
     }
}

/* 匯出到 msh 命令列表中 */
MSH_CMD_EXPORT(i2c_eeprom_sample, i2c_eeprom sample);

注意事項:

①EEP_I2CBUS_NAME一定是要註冊的,由於系統已經註冊了“i2c2”,所以就直接使用了

②EEP_ADDR是0x50,不含讀寫位的。(rt-thread中在傳送的程式中做了移位)

③在讀之前,先要告訴讀哪裡,就是使用

//通知要讀哪個裝置的哪個記憶體地址的內容,(告知是需要讀read_addr)
    rt_i2c_master_send(eep_i2c_bus, EEP_ADDR, RT_I2C_WR, &read_addr, 1);

④在寫完之後不能馬上讀,中間一定要延時。

實驗結果: