我正在研究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.
有人可以确认这是不可能的,或告诉我该怎么做?
除了可能呼吸,我是一个完整的新手,所以对不起,如果我不清楚,但这里是:
我在C中有一个函数,它通过I2C总线将字节写入电路,在头文件中它看起来像这样:
BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen);
Run Code Online (Sandbox Code Playgroud)
如果我只想将一个字节写入地址为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,它不会.那么如何制作一个指向两个字节而不是一个字节的指针呢?
谢谢
我有一个温度传感器,该温度传感器使用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个传感器。但是我不知道如何列出可用传感器的地址。
有人可以给我一些提示吗?提前致谢
我一直在研究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) 我有一个带有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) 由于我是嵌入式领域的新手,因此在理解i2c设备/驱动程序与平台设备/驱动程序之间的明显差异时遇到了困难。
我已阅读此链接:
表示平台设备/驱动程序用于不可发现的设备,例如在i2c总线上连接的设备,并且平台设备通过匹配名称绑定到驱动程序。
我浏览了一个电路板文件,其中使用i2c API(i2c_register_board_info,omap_i2c_add_bus等)注册了在i2c总线上连接的音频编解码器(不可发现的设备),因此我的问题是
我最近的项目要求使用单个主机和多个从机的i2c通信。我知道从主机发送的每个数据字节(实际数据),从机都会响应Nack \ Ack(1,0)。我对如何解释此Nack和ACK感到困惑。我在网上搜索,但没有清楚的图片。我的理解是这样的。
确认-我已成功接收数据。向我发送更多数据。NACK-我尚未收到数据。请重新发送。这是这样还是我错了。请澄清并提出正确答案。
谢谢阿米特·库马尔
我有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) 我必须使用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)