我今天一直在努力学习I2C,我花了一些时间来设置,但我现在已经配置了一个i2c-tools已安装的Raspberry Pi ,我可以看到/dev/i2c-0.
但是,当我运行时,i2cdetect -y 0我得到一个空的地址表.这是有道理的,因为我没有任何设备连接到I2C总线.我想做的是能够写入I2C引脚并使用我的示波器观察输出,甚至连接LED,这样我就能看到状态变化.
这是否可能,如果是这样,我该怎么办?提前致谢.
I2C主设备是否可以与另一个I2C主设备通信?
谢谢
我正在尝试使用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) 我尝试通过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) 我想从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_smbus_access()i2c_smbus_write_byte()i2c_smbus_read_block_data()write()read()但是大部分时间i2c总线都会进入超时错误并挂起情况.
任何人都知道如何在Linux中实现这一目标?
这个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
我正在尝试在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 总线上的内存位置读取一个值。当我在终端中运行它时,我得到了奇怪的输出。
这是我的程序
#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) 我正在使用 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) 我是一名嵌入式工程师,经验不多。我在接受采访时被问到了一个问题,我想这并不新鲜,并且已经有了答案:
您有一个不断接收来自外部世界的输入的外设,该外设有一个缓冲区。输入的速率时不时地发生变化。外设需要读取输入缓冲区并对其进行处理。它检查输入消息并查看其是否与配置的过滤器匹配。如果匹配则转发,否则丢弃。
问题如下:
感谢你的帮助。谢谢。
我来自中国,听说STM32硬件I2C有bug。所以我总是使用带有两个普通GPIO引脚的软件模拟I2C。我想知道这个bug到底是什么?这是谣言,还是真的?我希望从国外网站获得意见,因为你会说英语,你可能会得到更多第一手信息。谢谢。