标签: i2c

设置I2C地址而不连接设备

我今天一直在努力学习I2C,我花了一些时间来设置,但我现在已经配置了一个i2c-tools已安装的Raspberry Pi ,我可以看到/dev/i2c-0.

但是,当我运行时,i2cdetect -y 0我得到一个空的地址表.这是有道理的,因为我没有任何设备连接到I2C总线.我想做的是能够写入I2C引脚并使用我的示波器观察输出,甚至连接LED,这样我就能看到状态变化.

这是否可能,如果是这样,我该怎么办?提前致谢.

linux embedded i2c

3
推荐指数
1
解决办法
1558
查看次数

I2C Master到Master通信可能吗?

I2C主设备是否可以与另一个I2C主设备通信?

谢谢

embedded fpga i2c digital-logic xilinx

3
推荐指数
1
解决办法
537
查看次数

I2c bit banging使用C编程

我正在尝试使用bit banging为I2c编写ac代码.我修改了维基代码(http://en.wikipedia.org/wiki/I%C2%B2C).但我无法得到结果.根据我的理解,维基中的代码不正确.我做了很多改变,但是我所做的一个重大改变,wiki失败告诉了正确的标记/标记该行与/ TBN /.我的代码如下,//必须定制的特定于硬件的支持功能:

#define I2CSPEED 135
#define SCL P0_0
#define SDA P0_1

void I2C_delay() { volatile int v; int i; for (i=0; i < I2CSPEED/2; i++) v; }
bool read_SCL(void); // Set SCL as input and return current level of line, 0 or 1
bool read_SDA(void); // Set SDA as input and return current level of line, 0 or 1
void clear_SCL(void); // Actively drive SCL signal low
void clear_SDA(void); // Actively drive SDA signal low
void …
Run Code Online (Sandbox Code Playgroud)

c i2c

3
推荐指数
1
解决办法
1万
查看次数

使用Linux通过I2C读写EEPROM

我尝试通过I2C 读取和写入带有Raspberry Pi B + 的Atmel 24C256 EEPROM,但是我无法正常工作.

这是我到目前为止的代码:

#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); …
Run Code Online (Sandbox Code Playgroud)

c linux i2c eeprom raspberry-pi

3
推荐指数
2
解决办法
2万
查看次数

为什么linux中不支持重复启动的i2c操作?

我想从i2c slave读取,需要多次启动操作才能读取其寄存器值.

在某种程度上,我已经在Linux内核3.18.21中跟踪了I2C驱动程序,我发现它不支持多启动操作,我无法读取此I2C从设备(以太网供电管理器PD69104B1).

如果需要这个i2c从站或其他任何需要,我仍然可以找到扩展驱动程序的方法.

我使用i2c-tools 3.2.1.我试着

$ i2cdump -y 0 0x20 
Run Code Online (Sandbox Code Playgroud)

但我可以看到相同的值,这意味着它每次都会读取第一个寄存器.

$ i2cget -y 0 0x20 0x12
Run Code Online (Sandbox Code Playgroud)

或任何其他寄存器地址返回与第一个寄存器相同的值.

这个slave支持两个读操作:

  • 字节读 - 写地址获取其值但这需要多次启动
  • 块读 - 开始读取,i2c slave将按顺序给出寄存器值,如0x00 0x01 ....(第一个寄存器,第二个,第三个,第四个......等)

我尝试了所有可能的方法:

  • i2c_smbus_access()
  • i2c_smbus_write_byte()
  • i2c_smbus_read_block_data()
  • write()
  • read()

但是大部分时间i2c总线都会进入超时错误并挂起情况.

任何人都知道如何在Linux中实现这一目标?

Update0:

这个I2C从器件需要独特的读周期:

  • 方向改变:S Addr Wr [A] RegAddress [A] S Addr Rd [A] [RegValue] P

  • 简短阅读:S Addr Rd [A] [RegValue] P.

这里从i2c slave返回的最后一个值不期望ACK.

我尝试使用I2C_M_NO_RD_ACK但没有多大帮助.我读了一些值,然后得到FF.

这个POE I2C从器件在SCL上有超过14ms的i2c时间,这有点让人怀疑.这看起来像i2c非标准,因为i2c可以在0HZ上工作,即SCL可以被主人拉伸,只要它想要.Linux绝对不是实时操作系统,因此无法保证实现此时间,并且可能会发生i2c slave SCL超时复位.这就是我目前的结论!

使用的I2C消息表示法来自:https: //www.kernel.org/doc/Documentation/i2c/i2c-protocol

linux driver device i2c linux-kernel

3
推荐指数
1
解决办法
4854
查看次数

Docker容器中的I2C

我正在尝试在docker容器内的树莓派上使用i2c引脚。我使用RUN安装所有模块,但是当我使用CMD运行python程序时,出现错误提示

Trackback (most recent call last):
file "test.py", line 124, in <module>
bus = smbus.SMBus(1)
IOError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我在树莓派上而不是在我的容器中运行它,则可以正常工作。但是,当我关闭树莓派上的i2c引脚时,在运行时会出现相同的错误。所以我知道这与我的i2c引脚被激活有关。有谁知道如何解决这个问题?

i2c raspberry-pi docker

3
推荐指数
1
解决办法
2071
查看次数

读取时不返回写入 I2C 的缓冲区

我试图在写入后从 I2C 总线上的内存位置读取一个值。当我在终端中运行它时,我得到了奇怪的输出。

这是我的程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <inttypes.h>

    #include <errno.h>
    #include <string.h>

    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>

    #include <linux/i2c.h>
    #include <linux/i2c-dev.h>
    #include <sys/ioctl.h>

    #define I2C_ADAPTER "/dev/i2c-0"
    #define I2C_DEVICE  0x00


    int main (int argc, char *argv[])
    {
        int file;
        int addr = 0X00; /* XGPIOPS_DATA_LOW_OFFSET */

        if((file = open(I2C_ADAPTER, O_RDWR)) < 0) {
            printf("Failed to open the bus");
            return -1;
        }

        if(ioctl(file, I2C_SLAVE, addr) < 0) {
            printf("Unable to open device as slave %s", strerror(errno));
            return …
Run Code Online (Sandbox Code Playgroud)

c linux embedded qemu i2c

3
推荐指数
1
解决办法
2005
查看次数

I2C 写入协议:如何写入寄存器?

我正在使用 FT4222 器件以 I2c 方式对 MAX77651 进行编程。我希望能够在寄存器中写入。

我能够读取寄存器,所以我知道我没有任何硬件问题。要读取寄存器,我会这样进行:我首先发送我想要读取的寄存器,然后我只读取里面的内容。

要写入,我尝试将寄存器发送到我想要写入的位置,然后发送我想要放入寄存器中的数据。但是当我通过阅读之后进行检查时,我没有得到预期的结果。

这是我尝试编写和阅读的程序部分:

uint8 resultat=0x11;
uint8 *p_resultat=&resultat;
int chiffre = 8;
uint16 bytesToWrite2 = 1;
uint16 bytesWritten2=1;
uint8 valeur= 0x06;     // Adress of register
uint8 *p_valeur=&valeur;    
uint16         slaveAddr = 0x48;

// ***** reading test of 0x06 : expected value : 0xFF
FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur,
bytesToWrite2,&bytesWritten); 

chiffre = FT4222_I2CMaster_Read(ftHandle,slaveAddr,p_resultat,1, &bytesRead);
printf("The content of the register %02X is : %02X \n " , valeur , resultat);
printf("reading success if : %d = 0 \n " , chiffre); …
Run Code Online (Sandbox Code Playgroud)

microcontroller i2c

3
推荐指数
1
解决办法
9958
查看次数

面试题-如何连续读取缓冲区而不丢失数据

我是一名嵌入式工程师,经验不多。我在接受采访时被问到了一个问题,我想这并不新鲜,并且已经有了答案:

您有一个不断接收来自外部世界的输入的外设,该外设有一个缓冲区。输入的速率时不时地发生变化。外设需要读取输入缓冲区并对其进行处理。它检查输入消息并查看其是否与配置的过滤器匹配。如果匹配则转发,否则丢弃。

问题如下:

  1. 你如何处理这个问题?
  2. 如果缓冲区满了怎么办?您的缓冲区大小有限?外设仅具有一定的处理缓冲消息的速度。
  3. 如何使缓冲区适应不同的输入速度?

感谢你的帮助。谢谢。

c can-bus spi i2c embedded-linux

3
推荐指数
1
解决办法
378
查看次数

STM32硬件I2C有什么bug?

我来自中国,听说STM32硬件I2C有bug。所以我总是使用带有两个普通GPIO引脚的软件模拟I2C。我想知道这个bug到底是什么?这是谣言,还是真的?我希望从国外网站获得意见,因为你会说英语,你可能会得到更多第一手信息。谢谢。

stm32 i2c

3
推荐指数
1
解决办法
1027
查看次数