RT-Thread使用I2C讀寫eeprom例程(24c02)
阿新 • • 發佈:2018-12-16
實驗準備:
開發板:正點原子探索者
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);
④在寫完之後不能馬上讀,中間一定要延時。