在此之前,在其他平台上应用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
来源:CSDN
作者:Acuity-
链接:https://blog.csdn.net/qq_20553613/article/details/104051673