<div dir="ltr"><div dir="ltr"></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 5, 2023 at 7:55 AM Bo Berglund via fpc-pascal <<a href="mailto:fpc-pascal@lists.freepascal.org">fpc-pascal@lists.freepascal.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Wed, 05 Apr 2023 00:33:50 +0200, Bo Berglund via fpc-pascal<br><br>
I *can* write a sequence of bytes into the EEPROM succsessfully using an<br>
i2c-tools command like this:<br>
<br>
i2ctransfer -y 1 w18@0x50 0x00 0x38 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08<br>
0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f<br>
<br>
This writes data starting towards the end of the page and wraps around such that<br>
part of the data gets to the start of the page.<br></blockquote><div><br></div><div>Looking at the i2ctransmit transaction data:<br></div>$ i2ctransfer 1 w18@0x50 0x00 0x38 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f<div>WARNING! This program can confuse your I2C bus, cause data loss and worse!<br>I will send the following messages to device file /dev/i2c-1:<br>msg 0: addr 0x50, write, len 18, buf 0x00 0x38 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f<br> </div><div>This can be simulated by calling the WriteBytes method, see new example: <a href="https://github.com/ccrause/rpiplc_pas/blob/main/native/examples/i2c_write_test.lpr">https://github.com/ccrause/rpiplc_pas/blob/main/native/examples/i2c_write_test.lpr</a></div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
It shows:<br>
- It is possible to write the data in one go<br>
- If the data length is past the end of the page it wraps around to the<br>
beginning<br>
<br>
So if the problem cannot be solved then I could either use the loop with delay<br>
or call the i2c-tools command i2ctransfer as a TProcess execution to write<br>
multiple bytes in one command.<br>
<br>
But I would rather not use the TProcess method at all since it relies on an<br>
external tool being present and the argument list can be pretty long and tedious<br>
to build...<br></blockquote><div><br></div><div>Looking at the datasheet for CAT24C128, Fig. 6 Byte Write Sequence, shows no repeated start condition between register address and data bytes. I suspect that the second i2c message should contain the I2C_M_NOSTART flag, else the address and data parts of the transaction will be separated by a repeated start signal. I have modified the <span class="gmail-pl-en">WriteBytesToReg methods in i2c.pas, please feel free to pull from Github and test this again.<br></span></div></div></div>