RK3399—用户态操作EEPROM

  在此之前,在其他平台上应用i2c总线用户接口(ioctrl)进行访问EEPROM,具体可以参考“嵌入式Linux下 24系列EEPROM/FRAM驱动”文章。现将其移植到RK3399平台运行。


编译系统:Ubuntu16.04
ARM硬件:firefly RK3399
ARM系统:firefly Ubuntu16.04(SDK)
连接i2c:i2c4
EEPROM:AT24C02
电路原理图:

在这里插入图片描述

查看器件

  首先使用“i2ctools”工具查看硬件连接是否正常。
在这里插入图片描述

  i2c总线已经正确识别到到AT24C02,根据电路原理图地址线A0—A2接地,所以0x50是AT24C02的器件地址。0x51—0x57是24系列高容量型号芯片的地址(24c04—24c16)。


编译源码

clone源码

https://github.com/Prry/linux-drivers/tree/master/i2c-24cxx


文件目录结构:
在这里插入图片描述

  • 24cxx目录为EEPROM/FRAM用户态访问抽象公共接口
  • at24cxx为EEPROM读写测试程序
  • fm24cxx为FRAM读写测试程序

修改“at24cxx.c”源码

  本次硬件使用的是AT系列EEPROM,选择“at24cxx”目录源码。


/* 修改EEPROM数据结构描述 */

/**
 * @brief  device init
 */
const _24cxx_dev_t at24cxx_dev =
{
	"/dev/i2c-4",				/*i2c device name*/
	0x50,						/*eeprom address*/
	_24C02_E,					/*eeprom model,eg AT24C02*/
	0,							/*no write protect*/
	page_write_delay,			/*delay function*/
};

/* 修改测试数据大小 */
#define		WR_SIZE			(256)	/* 24c02容量 */
#define		WR_ADDR			0

修改Makefile

#
# Makefile for the AT24Cxx.
#


VERSION 	=1.00
CC			=aarch64-linux-gnu-gcc	#选择rk3399交叉编译器
DEBUG 		=
CFLAGS		=-Wall
SOURCES	 	=$(wildcard *.c) $(wildcard ../24cxx/*.c)
INCLUDES  	=-I../24cxx
LIB_NAMES 	=
LIB_PATH 	=
OBJ			=$(patsubst %.c, %.o, $(SOURCES))
TARGET		=at24

#links
$(TARGET):$(OBJ)
	@mkdir -p output
	$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o output/$(TARGET)$(VERSION)
	@rm -rf $(OBJ)
	
#compile
%.o: %.c
	$(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@

.PHONY:clean
clean:
	@echo "Remove linked and compiled files......"
	rm -rf $(OBJ) $(TARGET) output 

编译

  执行“make”编译,编译成功,在“output”目录生成执行文件“at241.00”。将文件拷贝到rk3399板子,执行“chmod 777 at241.00”更改执行属性。


执行

在这里插入图片描述

  程序执行符合预期,i2c用户态访问EEPROM正确。另外,也可以结合“i2ctools”工具验证程序读写正确性。


参考文章

【1】https://blog.csdn.net/qq_20553613/article/details/85332759

原创文章 128 获赞 147 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_20553613/article/details/104051673
今日推荐