标签: i2c

PIC I2C从机确认数据

我正在研究PIC16F88X的I2C协议.我想做的是根据I2C上接收的数据启用I2C从设备ACK或NACK.

PIC可以对线路上发送的I2C地址进行ACK或NACK,但根据我的读取,它将始终在后续接收的字节上进行ACK.那是对的吗?

在以下沟通中:

Start - I2c_Addr+write/ACK - Register_value/Nack
Run Code Online (Sandbox Code Playgroud)

我希望奴隶能够根据寄存器_值中的值来确认Ack或Nack .如果从站不理解寄存器_值,则不应该Ack.

有人可以确认这是不可能的,或告诉我该怎么做?

embedded pic i2c

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

制作指向两个字节的指针

除了可能呼吸,我是一个完整的新手,所以对不起,如果我不清楚,但这里是:

我在C中有一个函数,它通过I2C总线将字节写入电路,在头文件中它看起来像这样:

BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen);
Run Code Online (Sandbox Code Playgroud)
  • hJida:董事会处理.
  • dwType:I2C总线的从零开始的数字.
  • bAddr:I2C总线上器件的地址,写入总线时的全部8位.
  • pBytes:指向包含字节的位置的指针.
  • dwLen:要写入的字节数.

如果我只想将一个字节写入地址为0x98的电路,我会这样做:

unsigned char writing[1];
writing[0]=0x10;

unsigned char *pointer;
pointer = &writing[0];


JidaI2CWrite(hJida,0,0x98,pointer,1);
Run Code Online (Sandbox Code Playgroud)

这似乎工作,但如果我想写两个字节,比如0x10FF,它不会.那么如何制作一个指向两个字节而不是一个字节的指针呢?

谢谢

c pointers i2c

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

如何在Linux中通过USB从i2c设备检索数据

我有一个温度传感器,该温度传感器使用USB-I2C适配器(http://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm)连接,并将该设备连接到linux计算机(suse10)。我输入dmesg并看到

usb 3-3: new full speed USB device using ohci_hcd and address 10
usb 3-3: new device found, idVendor=0403, idProduct=6001
usb 3-3: new device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-3: Product: FT232R USB UART
usb 3-3: Manufacturer: FTDI
usb 3-3: SerialNumber: A7007K93
usb 3-3: configuration #1 chosen from 1 choice
ftdi_sio 3-3:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232BM
usb 3-3: FTDI USB Serial Device converter now attached to ttyUSB0
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何读取当前温度。

更新1:实际上,I2C总线最多可以连接127个传感器。但是我不知道如何列出可用传感器的地址。

有人可以给我一些提示吗?提前致谢

linux usb i2c

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

具有相同地址的i2c从设备

我正在开发一个STM32 F107上的嵌入式系统,它通过i2c与2个从属设备进行通信:一个rfid阅读器rfid手册和一个eeprom模块eeprom手册.这两个器件具有相同的从地址A0(用于写操作)和A1(用于读操作).如果只使用一个设备,它可以正常工作.但如果我同时使用它们,我就会遇到问题.首先我从rfid阅读器读取卡片ID,然后我在eeprom中写入它(直到这里一切都好),当我尝试从rfid阅读器再次读取时,我得到错误的输入数据,即使是我换了卡.发生了什么以及我可以做些什么来解决这个问题?

embedded rfid stm32 i2c eeprom

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

'i2c_get_clientdata'和"i2c_set_clientdata"有什么用?

我一直在研究I2C驱动程序(客户端)代码.我在每个地方看过这个函数"i2c_get_clientdata"和"i2c_set_clientdata".

我在这里看到了这个问题. 使用指针结构而不是创建静态本地副本

有时我觉得像"container_of"宏一样得到指向结构的指针.但我仍然没有正确理解为什么要使用它以及何时使用它.

下面我发布一个示例代码,我看到它的用法.如果有人可以帮助我理解为什么在那里使用它,当我们编写自己的驱动程序时我们将使用它.

struct max6875_data {
    struct i2c_client       *fake_client;
    struct mutex            update_lock;

    u32                     valid;
    u8                      data[USER_EEPROM_SIZE];
    unsigned long           last_updated[USER_EEPROM_SLICES];
};

static ssize_t max6875_read(struct file *filp, struct kobject *kobj,
                        struct bin_attribute *bin_attr,
                        char *buf, loff_t off, size_t count)
{
    struct i2c_client *client = kobj_to_i2c_client(kobj);
    struct max6875_data *data = i2c_get_clientdata(client);
    int slice, max_slice;

    if (off > USER_EEPROM_SIZE)
            return 0;

    if (off + count > USER_EEPROM_SIZE)
            count = USER_EEPROM_SIZE - off;

    /* refresh slices which contain requested bytes */
    max_slice = …
Run Code Online (Sandbox Code Playgroud)

i2c linux-device-driver linux-kernel embedded-linux

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

如何通过i2c从arduino发送4 Pot值到arduino?如何在接收这些值时区分这些值?

我有一个带有4个盆的Arduino.另一个Arduino通过i2c接收这4个值并将它们打印在显示器上.问题是我不知道如何发送奴隶所知道的4个值,知道哪个值属于哪个Pot.

奴隶代码:

#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  Wire.begin(5);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
  lcd.begin(16,2);

}

void loop()
{
}


void receiveEvent(int)
{

 while(Wire.available())
  {
           //How to create this part? How does the Slave know wich value belongs to which pot?
  }

}
Run Code Online (Sandbox Code Playgroud)

主码:

#include <Wire.h>

void setup()

{
  Serial.begin(9600);
  Wire.begin();
  delay(2000);
}

void loop()
{
  int sensor1 = analogRead(A1);
  Wire.beginTransmission(5);
  Wire.write(sensor1);
  Serial.print(sensor1);
  Wire.endTransmission();
  delay(100);

  int sensor2 = analogRead(A2);
  Wire.beginTransmission(5);
  Wire.write(sensor2);
  Serial.print(sensor2);
  Wire.endTransmission();

  delay(500);


}
Run Code Online (Sandbox Code Playgroud)

arduino i2c

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

平台设备/驱动程序与i2c设备/驱动程序

由于我是嵌入式领域的新手,因此在理解i2c设备/驱动程序与平台设备/驱动程序之间的明显差异时遇到了困难。

我已阅读此链接:

平台驱动程序和普通设备驱动程序有什么区别?

表示平台设备/驱动程序用于不可发现的设备,例如在i2c总线上连接的设备,并且平台设备通过匹配名称绑定到驱动程序。

我浏览了一个电路板文件,其中使用i2c API(i2c_register_board_info,omap_i2c_add_bus等)注册了在i2c总线上连接的音频编解码器(不可发现的设备),因此我的问题是

  1. i2c设备/驱动程序和平台设备/驱动程序有什么区别?
  2. 何时使用i2c相关API以及何时使用平台相关API(platform_driver_register,platform_device_register)在内核中注册设备/驱动程序。或者如果我们可以使用i2c相关的API进行不可发现的设备(在i2c上连接)的注册,则需要平台设备注册。

platform driver device i2c difference

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

I2c总线上的NACK和ACK响应

我最近的项目要求使用单个主机和多个从机的i2c通信。我知道从主机发送的每个数据字节(实际数据),从机都会响应Nack \ Ack(1,0)。我对如何解释此Nack和ACK感到困惑。我在网上搜索,但没有清楚的图片。我的理解是这样的。

确认-我已成功接收数据。向我发送更多数据。NACK-我尚未收到数据。请重新发送。这是这样还是我错了。请澄清并提出正确答案。

谢谢阿米特·库马尔

serial-communication i2c communication-protocol

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

从具有相同地址的i2c传感器读取值

我有4个SingleTact电容式传感器,每个传感器的i2c地址为0x04.我想找到传感器的平均值,以制作操纵杆.但是我不确定如何为每个传感器分配它自己的地址,因为它们都具有相同的地址,因为它们是相同的传感器.我有一个初始代码,但这只适用于一个传感器,因为它只有一个i2c地址字节.我已经使用在线教程将所有SDA和SCL线连接在一起,并包含了上拉电阻.

#include <Wire.h>
#define initializetime 4
byte serialToPCBuffer[77];
byte serialToPCBufferIndex = 0;

int data[4];
int databuffer[4][initializetime] = {0,0,0,0,0,0,0,0,0,0,0,0};
int base[4] = {0,0,0,0};
int ArduinoToPCBuffer[4] = {1000,2000,3000,4000};
byte outgoingI2CBuffer[32];
unsigned long timeStamp_;

void setup() {
  int i;
  Wire.begin();
  //TWBR = 12;
  Serial.begin(57600);
  Serial.flush();
  initializeSensors();

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("PPS UK: SingleTact sensor value in PSI. \n(resembles PC executable display)");
  Serial.println("Refer manual for any other calculation.");
  Serial.println("----------------------------------------");  
} …
Run Code Online (Sandbox Code Playgroud)

arduino i2c

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

STM32F4 I2C无库

我必须使用I2C为STM32F4发现和pcf8574连接代码.

我不能使用任何库函数.我尝试了一些我没做过的事.我在init代码后写了.

我的初始化代码

RCC->APB1ENR|=RCC_APB1ENR_I2C1EN ; // enable APB1 peripheral clock for I2C1
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOBEN; // enable clock for SCL and SDA pins

//SCL on PB6 and SDA on PB7 
GPIOB->MODER|=GPIO_MODER_MODER6; // set pin to alternate function
GPIOB->MODER|=GPIO_MODER_MODER7; // set pin to alternate function

GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR6; //set GPIO speed
GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7; //set GPIO speed

GPIOB-> OTYPER |= GPIO_OTYPER_OT_6; // set output to open drain --> the line has to be only pulled low, not driven high
GPIOB-> OTYPER |= GPIO_OTYPER_OT_7; // set …
Run Code Online (Sandbox Code Playgroud)

c microcontroller stm32 i2c

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