General Category > Discussion - Software
Multi-byte read fails in I2C_DeviceRead, LibMPSSE_1.0.3 - no NACK by FT2232H
bryantsorensen:
I'm using LibMPSSE_1.0.3 and encountered a problem doing multi-byte reads using I2C_DeviceRead on an FT2232H (FTDI-Click board). The FT2232H reads the first byte (from an EEPROM) correctly, but shows a NACK. This causes the following bytes to be read as 0xFF, 0xFF, etc. which also have NACKs.
I'm using the command:
FtStatus = I2C_DeviceRead(FtHandle, SlaveAddress, sizeof(ReadData), ReadData, &SizeXferred,
I2C_TRANSFER_OPTIONS_START_BIT | // Give repeated start after address write
I2C_TRANSFER_OPTIONS_STOP_BIT |
I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES );
I also tried:
FtStatus = I2C_DeviceRead(FtHandle, SlaveAddress, sizeof(ReadData), ReadData, &SizeXferred,
I2C_TRANSFER_OPTIONS_START_BIT | // Give repeated start
I2C_TRANSFER_OPTIONS_STOP_BIT |
I2C_TRANSFER_OPTIONS_NACK_LAST_BYTE);
This also reads the data back as <correct 1st byte>, 0xFF, 0xFF...
This appears to be related to an older post: http://www.ftdicommunity.com/index.php?topic=241.msg741#msg741
Given the age of the previous post, and that it refers to lib SW which I can no longer find (for example, the poster refers to changing an "if 1" statement to an "if 0" statement on line 1400 of ftdi_i2c.c - and there's no statement anything like that in the latest ftdi_i2c.c), I'm wondering the following:
* Did this bug get fixed going from previous version (0.6?) to 1.0.3?
* If not fixed, is anyone acquainted with this problem and have a solution?
* If fixed, what settings in the function call will properly read multiple bytes?
Thanks,
Bryant (just getting started with FTDI devices, appreciate the help)
bryantsorensen:
BTW - this happens at every speed I've tried - 100kHz, 400kHz, 1Mhz.
bryantsorensen:
There were 3 errors in the FTDI LibMPSEE.dll source code.
This is library release 1.0.3, in file LibMPSSE_1.0.3.zip found at https://ftdichip.com/software-examples/mpsse-projects/libmpsse-i2c-examples/
1. See http://www.ftdicommunity.com/index.php?topic=644.0 - post made August 16, 2022, 10:48:47 AM
I2C_Read8bitsAndGiveAck(...) function, in $\LibMPSSE_1.0.3\source\ftdi_i2c.c, around line 941 - change:
--- Code: ---buffer[noOfBytes++] = DIRECTION_SCLOUT_SDAOUT; // was DIRECTION_SCLOUT_SDAIN; make SDA output to provide read ACK
--- End code ---
2. Related to #1:
I2C_FastRead(...) function, in $\LibMPSSE_1.0.3\source\ftdi_i2c.c, around line 1314 - change:
--- Code: ---outBuffer[i++] = DIRECTION_SCLOUT_SDAOUT; // was DIRECTION_SCLOUT_SDAIN; make SDA output to provide read ACK
--- End code ---
3. I2C_FastRead(...) returns number of bits read always, not bytes
I2C_FastRead(...) function, in $\LibMPSSE_1.0.3\source\ftdi_i2c.c, around line 1324:
In the released code, it has the statement:
--- Code: ---*sizeTransferred = j;
--- End code ---
where 'j' is the number of bits to be read. However, this only is correct for option flag I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BITS if the actual bits read match the requested bits to read (this statement may be premature - may be better to wait for actual read), as I read the manual and the code comments.
(A) Put this statement behind something like:
--- Code: ---if (options & I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BITS)
--- End code ---
(B) Below this code, towards the bottom of the function, there is released code:
--- Code: ---if (options & I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES)
status = FT_Channel_Read(I2C, handle, bytesToTransfer, buffer, &bytesRead);
--- End code ---
Replace this with something like:
--- Code: ---if (options & I2C_TRANSFER_OPTIONS_FAST_TRANSFER_BYTES)
{
status = FT_Channel_Read(I2C, handle, bytesToTransfer, buffer, &bytesRead);
*sizeTransferred = bytesRead;
}
--- End code ---
FTDI Community:
Hi,
Thanks for the information. I will pass this on to the developers and raise a bug. It will be fixed in the next release of the library.
Best regards
FTDI Community
Petrov:
Is there any update on this issue?
When can we expect the next release of the library?
Navigation
[0] Message Index
[#] Next page
Go to full version