Provided by: i2c-tools_4.0-2_amd64
NAME
i2cset - set I2C registers
SYNOPSIS
i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] ... [mode]
i2cset -V
DESCRIPTION
i2cset is a small helper program to set registers visible through the I2C bus.
OPTIONS
-V Display the version and exit.
-f Force access to the device even if it is already busy. By default, i2cset will
refuse to access a device which is already under the control of a kernel driver.
Using this flag is dangerous, it can seriously confuse the kernel driver in
question. It can also cause i2cset to silently write to the wrong register. So use
at your own risk and only if you know what you're doing.
-y Disable interactive mode. By default, i2cset will wait for a confirmation from the
user before messing with the I2C bus. When this flag is used, it will perform the
operation directly. This is mainly meant to be used in scripts.
-m mask
The mask parameter, if specified, describes which bits of value will be actually
written to data-address. Bits set to 1 in the mask are taken from value, while bits
set to 0 will be read from data-address and thus preserved by the operation. Please
note that this parameter assumes that the read and write operations for the
specified mode are symmetrical for the device you are accessing. This may or may
not be the case, as neither I2C nor SMBus guarantees this.
-r Read back the value right after writing it, and compare the result with the value
written. This used to be the default behavior. The same limitations apply as those
of option -m.
There are three required options to i2cset. i2cbus indicates the number or name of the I2C
bus to be scanned. This number should correspond to one of the busses listed by i2cdetect
-l. chip-address specifies the address of the chip on that bus, and is an integer between
0x03 and 0x77. data-address specifies the address on that chip to write to, and is an
integer between 0x00 and 0xFF.
The value parameter, if specified, is the value to write to that location on the chip. If
this parameter is omitted, then a short write is issued. For most chips, it simply sets an
internal pointer to the target location, but doesn't actually write to that location. For
a few chips though, in particular simple ones with a single register, this short write is
an actual write. If the mode parameter is s or i, multiple values can be specified.
The mode parameter, if specified, is one of the letters b, w, s, or i, corresponding to a
write size of a single byte, a 16-bit word, a SMBus block write, or an I2C block write,
respectively. For SMBus and I2C block writes, the write size is determined by the number
of value parameters. Except for I2C block writes, a p can also be appended to the mode
parameter to enable PEC. If the mode parameter is omitted, i2cset defaults to byte mode
without PEC. The value provided must be within range for the specified data type
(0x00-0xFF for byte and block writes, 0x0000-0xFFFF for words). Another possible mode is
c, which doesn't write any value (so-called short write). You usually don't have to
specify this mode, as it is the default when no value is provided, unless you also want to
enable PEC.
WARNING
i2cset can be extremely dangerous if used improperly. It can confuse your I2C bus, cause
data loss, or have more serious side effects. Writing to a serial EEPROM on a memory DIMM
(chip addresses between 0x50 and 0x57) may DESTROY your memory, leaving your system
unbootable! Be extremely careful using this program.
EXAMPLES
Write value 0x42 to 8-bit register 0x11 of the I2C device at 7-bit address 0x2d on bus 1
(i2c-1), after user confirmation:
# i2cset 1 0x2d 0x11 0x42
Immediately clear the 3 least significant bits of 8-bit register 0x11 of the I2C device at
7-bit address 0x2d on bus 1 (i2c-1) (no user confirmation):
# i2cset -y -m 0x07 1 0x2d 0x11 0x00
Write value 0x5000 to 16-bit register 0x02 of the I2C device at 7-bit address 0x48 on bus
1 (i2c-1), after user confirmation:
# i2cset 1 0x48 0x02 0x5000 w
Also see i2cget(8) for examples of combined usage of i2cset and i2cget.
SEE ALSO
i2cdetect(8), i2cdump(8), i2cget(8), i2ctransfer(8), isaset(8)
AUTHOR
Frodo Looijaard, Mark D. Studebaker and Jean Delvare
This manual page was originally written by David Z Maze <dmaze@debian.org> for the Debian
GNU/Linux system.
October 2017 I2CSET(8)
///
How to write to a 16-bit I2C address using i2cset
Trying to write a byte to a 16-bit address on an I2C device (OV5640 camera) using i2cset. I can successfully read from the device registers using the following sequence (read byte from device address 0x3c and register address 0x3030): 'i2cset -v -f 1 0x3c 0x30 0x30' 'i2cget -v -f 1 0x3c'
To write to the device, I use this sequence (write byte 0x40 to device address 0x3c and register address 0x3030): 'i2cset -v -f 1 0x3c 0x30 0x30' 'i2cset -v -f 1 0x3c 0x40' This sequence does not show any errors but when the address is read again, the value is unchanged. Can anyone provide any insight on the correct i2cset syntax to use when writing to this device? Thanks for you input.
读寄存器地址:(register address 0x3030),iic总线1,设备地址0x3c:
i2cset -v -f 1 0x3c 0x30 0x30
i2cget -v -f 1 0x3c
尝试写寄存器地址(register address 0x3030),iic总线1,设备地址0x3c,写入值:0x40:
i2cset -v -f 1 0x3c 0x30 0x30 注:即是先写地址,在写值 无法写入
i2cset -v -f 1 0x3c 0x40
1
-
Your title seems a bit off. I2C addresses are either 7-bit or 10-bit. You seem to mean address of register inside this I2C device? Are you sure your write sequence is correct. Without looking at the datasheet (which you should paste the relevant info from), it seems to be it should be something like
i2cset -v -f 1 0x3c 0x30 0x30 0x40
(one write, instead of two writes). – domen Oct 9 '20 at 9:04
1 Answer
SOLVED! I found the solution for this and it requires using the i2cset block write option (i) as follows: i2cset -y -f 2 0x3c 0x30 0x30 0x40 i
This command writes the value 0x40 to register address 0x3030 at device address 0x3c.
成功的方法:
尝试写寄存器地址(register address 0x3030),iic总线1,设备地址0x3c,写入值:0x40:
i2cset -y -f 2 0x3c 0x30 0x30 0x40 i