标签: i2c

如何使用文件描述符刷新写入?

事实证明,对open()与fopen()的整体误解源于ARM上Linux 2.6.14内核中的错误I2C驱动程序.向后移动一个工作位捣乱的驱动程序解决了我试图解决的问题的根本原因.

我试图弄清楚Linux(I2C)中串行设备驱动程序的问题.似乎通过在设备上的写入和读取之间添加定时OS暂停(休眠),事情起作用......(更好).

旁白:I2C的本质是主机读取或写入的每个字节都由线路另一端的设备(从机)确认 - 暂停改进的事情鼓励我将驱动程序视为异步工作 - 这是我的意思无法调和公交车的运作方式.Anyhoo ......

我想无论是想刷新写可以肯定(而不是使用固定的工期暂停),以某种方式测试读/写事务已完成在多线程友好的方式.

使用的麻烦fflush(fd);是它需要'fd'是流指针(不是文件描述符),即

FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要使用,ioctl()而不使用流指针.即

int fd = open("filename",O_RDWR);
ioctl(fd,...);
Run Code Online (Sandbox Code Playgroud)

建议?

c linux stdio i2c

35
推荐指数
4
解决办法
11万
查看次数

UART与I2C对SPI,用于微控制器之间的处理器间通信

我正在研究一种连接两个微控制器的方法.在序列化的层面上,我正在考虑使用Nano protobuffers(http://code.google.com/p/nanopb/).这样我就可以编码/解码消息并在两个处理器之间发送它们.

基本上,一个小型处理器将是RPC服务器,能够执行多个功能.较大的处理器将通过发送的消息调用RPC,然后当数据准备好时,它将从较小的处理器读取它.

使用UART,I2C或SPI的优缺点是什么?

邮件将在发送之前放入邮箱中.

最好的问候,Drasko

embedded microcontroller spi i2c uart

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

I2C_SLAVE ioctl目的

我正在编写i2c使用通用linux i2c驱动程序实现简单读/写功能的代码linux/i2c-dev.h

我很困惑ioctl:I2C_SLAVE

内核文档说明如下:

您可以使用read(2)和write(2)调用执行普通的i2c事务.您不需要传递地址字节; 相反,在尝试访问设备之前,请通过ioctl I2C_SLAVE进行设置

但是,我正在使用ioctl I2C_RDWR我再次设置从属地址的地方i2c_msg.addr.

内核文档还提到了以下内容:

一些ioctl()调用用于管理任务,由i2c-dev直接处理.示例包括I2C_SLAVE

所以必须使用ioctl I2C_SLAVE?如果是这样,我只需要设置一次或每次执行读写操作?

如果我有一个i2c设备,我可以在设备上测试代码并且不会打扰你们,但不幸的是我现在没有.

谢谢您的帮助.

linux driver i2c

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

在Linux上使用I2C读/写

我正在尝试读取/写入FM24CL64-GTR FRAM通过地址上的I2C总线连接的芯片0b 1010 011.

当我试图写3个字节(数据地址2个字节,+数据一个字节)时,我得到一个内核消息([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.),以及写返回!= 3.参见下面的代码:

#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>

int file;
char filename[20];
int addr = 0x53; // 0b1010011; /* The I2C address */
uint16_t dataAddr = 0x1234;
uint8_t val = 0x5c;
uint8_t buf[3];

sprintf(filename,"/dev/i2c-%d",0);
if ((file = open(filename,O_RDWR)) < 0)
    exit(1);

if (ioctl(file,I2C_SLAVE,addr) < 0)
    exit(2);

buf[0] = dataAddr >> 8;
buf[1] = dataAddr & 0xff;
buf[2] = val;

if (write(file, buf, 3) …
Run Code Online (Sandbox Code Playgroud)

c linux ioctl i2c

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

Linux中的I2C驱动程序

我知道I2C在一个非常基本的层面,它依赖于Linux内核,但没有线索来实现一个基本的I2C驱动程序.

尝试在I2C 设备驱动程序中启动.你有没有可以建议任何有源代码映射的初学者教程!

i2c linux-device-driver linux-kernel

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

无法通过Raspberry Pi Python SMBus接收的I2C字节

我正在设置Raspberry Pi来记录Sensirion SCD30传感器的数据(CO2,湿度和温度).我的代码在python3中,使用SMBus库通过Pi的GPIO中的I2C引脚与传感器通信.有一个命令可以确定传感器是否准备好发送数据.

链接到SCD30接口数据表

通过Sparkfun链接到arduino的SCD30库

该值0x0202通过I2C发送,并返回3个字节​​的数据:

0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready
Run Code Online (Sandbox Code Playgroud)

前两个字节是MSB和数据就绪值的LSB.正确结合他们应该0x00000x0001.第三个字节是前两个字节的CRC8.这是用多项式0x31和初始化计算的0xFF.

大约一半的时间,字节以错误的顺序发送.而不是MSB LSB CRC发送MSB CRC LSB.例如,如果数据准备就绪,则可能发送0x00, 0xB0, 0x01而不是0x00, 0x01, 0xB0.我无法弄清楚为什么会发生这种情况,我担心发送数据时会出现一些损坏或问题.我可以更改代码以识别CRC是否是第二个字节,但我想找到潜在的问题.

我正在使用smbus库发送和接收I2C数据.这是我发送命令和读取数据的代码:

bus = smbus.SMBus(0)
I2C_ADDRESS = 0x61

def sendCommand(self, cmd):  # sends a 2 byte command (cmd)
    data = [0]*2
    data[0] = cmd >> 8  # splits 2 byte command into MSB and …
Run Code Online (Sandbox Code Playgroud)

python sensor i2c raspberry-pi smbus

11
推荐指数
1
解决办法
1058
查看次数

如何使用带有I2C的Raspberry Pi从Arduino读取数据

我正在尝试使用python smbus模块从Arduino UNO读取数据到Raspberry Pi.我在smbus模块上找到的唯一文档就在这里.我不确定cmd在模块中的含义.我可以使用write将数据发送到Arduino.我写了两个简单的程序,一个用于读取,一个用于写入

写的那个

import smbus
b = smbus.SMBus(0)
while (0==0):
    var = input("Value to Write:")
    b.write_byte_data(0x10,0x00,int(var))
Run Code Online (Sandbox Code Playgroud)

阅读的那个

import smbus
bus = smbus.SMBus(0)
var = bus.read_byte_data(0x10,0x00)
print(var)
Run Code Online (Sandbox Code Playgroud)

Arduino代码是

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(8,9,4,5,6,7);

int a = 7;

void setup() 
{ 
  Serial.begin(9600);
  lcd.begin(16,2);
  // define slave address (0x2A = 42)
  #define SLAVE_ADDRESS 0x10

  // initialize i2c as slave
  Wire.begin(SLAVE_ADDRESS);

  // define callbacks for i2c communication
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData); 
}
void loop(){
}

// callback for received …
Run Code Online (Sandbox Code Playgroud)

arduino i2c python-2.7

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

是什么让SPI比I2C协议更快

我知道I2C和SPI通信的基本知识.由于两者都是同步协议.我想知道是什么让SPI比I2C更快.如果我没有使用I2C,我们可以使用400kbps,而在SPI中我们也可以达到10mbps.是因为硬件变化了吗?在一次采访中我问过这个问题.如果我错了,请告诉我.

c embedded spi i2c

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

如何编写多个slave i2c客户端设备驱动程序?

我正在尝试为嵌入式主板开发驱动程序.驱动程序应该为v4l2打开一个接口,并使用i2c与2个设备通信.司机将充当主人.

我似乎无法理解i2c_device_id数组和i2c_add_driver函数是如何工作的.我阅读了内核源代码中的文档,但它对多个从属客户端没有帮助.

  • 我必须有两个独立的探头功能吗?
  • 我必须打i2c_add_driver两次电话吗?
  • 如果不是,我将如何能够保存两个不同的客户端,以便能够将不同的字节发送到不同的地址.

我在这里粘贴我的代码.我试图实例化两个i2c_drivers,调用i2c_driver_add两次并单独实现i2c探测.该代码无法正常工作,告诉我第二次foo1 调用时已经注册i2c_add_driver.

i2c1在我的dts文件中定义了两个块,如:

&i2c1 {

...
    foo0: foo0@00 {
        compatible = "bar,foo0";
        reg = <0x00>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ipu1_2>;
        clocks = <&clks IMX6QDL_CLK_CKO>;
        clock-names = "csi_mclk";
        DOVDD-supply = <&vgen4_reg>; /* 1.8v */
        AVDD-supply = <&vgen3_reg>;  /* 2.8v, on rev C board is VGEN3,
                        on rev B board is VGEN5 */
        DVDD-supply = <&vgen2_reg>;  /* …
Run Code Online (Sandbox Code Playgroud)

c linux client kernel i2c

10
推荐指数
1
解决办法
3581
查看次数

尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

我遇到了问题,在启动通过 I2C 从 Arduino 请求数据的脚本时,pyhton 有时会在我的 raspberry pi 3 上抛出这个 IOError 。

电气连接是完美的,所以这不是问题。此外,我在使用 i2cget -y 1 0x04 时也没有收到任何错误

有时只有 python 脚本很糟糕,我不知道为什么。

这是我的 Arduino 代码:

我注册了一个 onReceive 和一个 onRequestEvent。onReceive 回调将定义应该发送回树莓派的数据类型。onRequest 回调执行响应。

    #include <CommonFunction.h>
#include <Wire.h>

#define I2C_ADDRESS 0x4

commonFunc GetCountsEverySecond;
int g_iOnRequestActionCode = 0;
unsigned long g_lSecondsSinceStart = 0;

void setup() 
{
    Wire.begin(I2C_ADDRESS);
    Wire.onRequest(sendDataOverI2CGateway);
    Wire.onReceive(defineOnRequestAction);
}


void loop() 
{
    tickSeconds();
}

void tickSeconds()
{
    if (GetCountsEverySecond.TimeTriggerAt(1000))
    {
        g_lSecondsSinceStart++;
    }
}

void sendOperationTimeDataOverI2C()
{
    unsigned long longInt = g_lSecondsSinceStart;
    byte size = …
Run Code Online (Sandbox Code Playgroud)

python arduino i2c raspberry-pi smbus

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