- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试读写 Atmel 24C256 EEPROM使用基于 I2C 的 Raspberry Pi B+,但我无法使其正常工作。
这是我目前的代码:
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <linux/i2c.h>
#define DEVICE_PATH "/dev/i2c-1"
#define PAGE_SIZE 64
#define DEVICE_ADDR 0x50 // 0b1010xxxx
int file_desc;
char buffer[PAGE_SIZE + 2]; // 64 bytes + 2 for the address
void teardownI2C()
{
int result = close(file_desc);
}
void setupI2C()
{
file_desc = open(DEVICE_PATH, O_RDWR);
if(file_desc < 0)
{
printf("%s\n", strerror(errno));
exit(1);
}
if(ioctl(file_desc, I2C_SLAVE, DEVICE_ADDR) < 0)
{
printf("%s\n", strerror(errno));
teardownI2C();
exit(1);
}
}
int write_to_device(char addr_hi, char addr_lo, char * buf, int len)
{
struct i2c_rdwr_ioctl_data msg_rdwr;
struct i2c_msg i2cmsg;
char my_buf[PAGE_SIZE + 2];
if(len > PAGE_SIZE + 2)
{
printf("Can't write more than %d bytes at a time.\n", PAGE_SIZE);
return -1;
}
int i;
my_buf[0] = addr_hi;
my_buf[1] = addr_lo;
for(i= 0; i < len; i++)
{
my_buf[2+i] = buf[i];
}
msg_rdwr.msgs = &i2cmsg;
msg_rdwr.nmsgs = 1;
i2cmsg.addr = DEVICE_ADDR;
i2cmsg.flags = 0;
i2cmsg.len = 2+len;
i2cmsg.buf = my_buf;
if(ioctl(file_desc,I2C_RDWR,&msg_rdwr)<0)
{
printf("write_to_device(): %s\n", strerror(errno));
return -1;
}
return 0;
}
int read_from_device(char addr_hi, char addr_lo, char * buf, int len)
{
struct i2c_rdwr_ioctl_data msg_rdwr;
struct i2c_msg i2cmsg;
if(write_to_device(addr_hi, addr_lo ,NULL,0)<0)
{
printf("read_from_device(): address reset did not work\n");
return -1;
}
msg_rdwr.msgs = &i2cmsg;
msg_rdwr.nmsgs = 1;
i2cmsg.addr = DEVICE_ADDR;
i2cmsg.flags = I2C_M_RD;
i2cmsg.len = len;
i2cmsg.buf = buf;
if(ioctl(file_desc,I2C_RDWR,&msg_rdwr)<0)
{
printf("read_from_device(): %s\n", strerror(errno));
return -1;
}
return 0;
}
void fill_buffer(char *buf)
{
int i = 0;
while(i < PAGE_SIZE && *buf)
{
buffer[i+2] = *buf++;
}
while(i++ < PAGE_SIZE-1)
{
buffer[i+2] = '*'; // fill the buffer with something
}
}
int main()
{
setupI2C(); //setup
fill_buffer("Here are some words.");
write_to_device(0x01, 0x00, buffer, PAGE_SIZE);
char newbuf[PAGE_SIZE];
if(read_from_device(0x01, 0x00, newbuf, PAGE_SIZE)>0)
{
printf("%s\n", newbuf);
}
teardownI2C(); //cleanup
return EXIT_SUCCESS;
}
像 write_to_device(0x01, 0x00, buffer, PAGE_SIZE);
这样的行写入设备不会产生任何错误,但是当我尝试从设备读取时,我必须写一个根据规范表“虚拟”字节,然后尝试从设备读取,但由于某种原因写入虚拟字节会导致错误“输入/输出错误”。我不知道这是怎么回事。我正在使用两个资源来指导我,Linux I2C-Dev documentation和来自 similar EEPROM device. 的示例我有点被困在这里,不知道该尝试什么。非常感谢任何建议或指示!
最佳答案
或者,如果您能够为 Raspberry Pi 编译和安装不同的内核设备树,则可以通过内核 at24.c
驱动程序访问它。
内核设备树需要指定 EEPROM 的类型和地址,以及它连接到哪条 I²C 总线。我不确定 Raspberry Pi,但对于 BeagleBone Black EEPROM,它是这样的:
&i2c0 {
eeprom: eeprom@50 {
compatible = "at,24c32";
reg = <0x50>;
};
};
对于您的设备,您将指定 compatible = "at,24c256";
确保内核配置指定CONFIG_EEPROM_AT24=y
(或=m
)。
然后您应该能够从用户空间访问 EEPROM 内存,例如 /sys/bus/i2c/devices/0-0050/eeprom
或 /sys/bus/i2c/drivers/at24/0-0050/eeprom
.
关于c - 使用 Linux 通过 I2C 读写 EEPROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932003/
我有一个带有定制 I2C Master 硬件的 X86 CPU。我的 Linux 是 Ubuntu 14.04,内核 3.13。 我为我的自定义 I2C 主硬件编写了一个 I2c 驱动程序。 当我加载
我已经在串行监视器上显示输出,但我想要将输出保存到 EEPROM。我如何循环10次并收集10个数据并将10个数据存储到EEPROM?据我了解,我需要创建一个计数器来计数到 10。我需要为我的变量使用数
我正在尝试将 M95M02-DR 256KB EEPROM 存储芯片与 MSP430 微 Controller 连接起来。作为示例测试,我尝试向其中写入以下字符串: CHAPTER I. Down t
我有一些代码可以将配置数据存储到 EEPROM。变量配置中的数据可以打印到串行控制台,但不能保存到 EEPROM。我正在使用 ESP32(Arduino 框架)。以下代码是此 link 中代码的简化版
我正在编写一个类来将数据保存到 Arduino 的 EEPROM。该类称为内存。 该类包含不同的函数和变量。 char serverdefault[15] = "0032484716340"; int
我正在使用 Arduinos(Nano 板)进行 DIY 项目。我在第一个和第二个 Arduinos 之间的串行通信有问题。第一个 Arduino 向第二个发送一个字符(字母 r),这就是第二个 Ar
我正在团队中使用 stm32 f100 系列开发板进行一个项目。我应该使用外部 I2C eeprom 来存储一些数据,eeprom 如下:CAT24C512WI-GT3 我也有这个 I2C eepro
我为自己的 PC 桥使用 Teensy++ 2.0 为自己构建了一个基本的 EEPROM 刻录机,它运行良好,但当我希望扩展其兼容性时,我的代码变得相当笨拙。我正在寻找一些建议,以进行适当的设计以使此
我最近发现需要将不经常更新的配置变量存储在微 Controller 的 EEPROM 中。将状态添加到程序中会立即迫使人们担心 检测 EEPROM 中未初始化的数据(即首次启动), 转换旧固件版本的数
我正在开发一个项目,其中我需要能够将值存储到 PIC 的 EEPROM 中,我已设法使读取工作正常,但到目前为止我无法让 PIC 写入内存使用PIC汇编。这是我一直在使用的代码,它源自数据手册中的示例
我正在做我的大学项目,需要将数据存储在AtMega32的EEPROM中。我能够在内存的任何特定位置写入和读取数据。但是当我尝试从地址 0 到 1023 顺序写入数据时,我得到了错误的值。 这是我编写的
我正在现有板上开发一个应用程序。应用程序需要频繁的数据(仅10字节)存储,所以我想将外部闪存模拟为 EEPROM因为我的主板没有 EEPROM。我们有外部 spi 闪存。任何人都可以在这个模拟中帮助我
当我从 eeprom 接收数据时遇到问题。 首先我编写了以下代码: #include #include char NAME[5] EEMEM = "a001"; char
我正在尝试使用 atmega324p 从外部 eeprom 读取数据。问题出在 for 循环上。我无法读取 4 页 (4 x 64B) 的 EEPROM 数据。如果我将循环计数器从 4 增加到 5,我
我使用以下代码来访问 eeprom : void EEPROM_write(unsigned int uiAddress,unsigned char ucData) { while(EECR &
我正在尝试为 AVR STK600 板编写一个程序,其中循环显示 LED。当按下开关时,相应的 LED 会亮起(到目前为止,一切顺利)。现在正在向开发板添加另一个功能,尝试使用 USART(RS232
我收到警告: Initialization makes pointer from integer without a cast 这是我的代码: case 4: { uint8_t* adr =
我卡在这里了。我正在尝试使用我的修改版本 this 将板配置保存/加载到 ESP8266 中的 EEPROM示例。 这是我的实际代码: char ssid[32] = ""; char passwor
我想按照 Arduino 函数从 EEPROM 地址读取并返回一个字符串,我可以在我的串行监视器上打印该字符串。 char EEPROM_read(int addr, int length_str)
我正在使用 Arduino Uno 将几个变量保存到 EEPROM 中。我的解决方案是创建一个自定义结构,在其中存储所有需要的变量,然后使用 EEPROM.put 将它们存储到内置 EEPROM 中。
我是一名优秀的程序员,十分优秀!