Hi,
Note: ANG stands for “ACCEPT, No GoodCRC”
Equipment:
- FW16 laptop
- USB-C external NVME enclosure.
- Non-FW16 laptop.
- A usb-c cable with breakout.
The problem I see is that with the same NVME enclosure and USB-C, it works reliably on a Non-FW16 laptop. e.g. A HP laptop, but keeps cycling, about every 1 second, and never connects to the FW16 laptop.
I have done some analysis with USB-C sniffers/testers and a data capture oscilloscope.
Some details can be found here:
In summary, the SRC (FW laptop) sends a “Accept” on CC1 but the the SNK (device, NVME enclosure) never sends a GoodCRC back.
I have looked in detail at the content of the “Accept” message and compared the oscilloscope data captures between the FW16 laptop and the Non-FW laptop.
The CC messages themselves are all pretty much the same.
So, why is the SNK never replying to the “Accept”.
After a lot of testing, I think the best theory I have is that the SNK (device,NVME enclosure) is not detecting the IDLE between CC messages, and thus never cuts in and tries to transmit the GoodCRC.
I have found one major difference between the two.
- FW16 laptop idles at about 0.88 Volts.
- Non-FW laptop idles at about 1.67 Volts.
The normal swing (peak-to-peak) of CC messages is between 0V and 1.2V.
The idle is supposed to be when the output is set to “high impedance”.
As far as I can tell, the only thing different that can affect the idle volts is the value of “Rd” and “Rp” in the laptop.
Note: Another observation is that changing the USB-C cable changes the outcome. I.e. some cables work, some do not work on the FW16, but all the same cables work on a Non-FW laptop.
There are possibly other causes for the NVME not responding to “Accept”, but I need more time to look into those. E.g. 1) As the idle volts is only 0.88V, the first bit of the 64bit preamble is not detected or an extra one is added so not 100% reliable. With idle volts at 1,67V, the 64bits are very reliably detected. But that is why one has the “Sync-1” tokens, so the receiver can get back into sync event if there are not exactly 64 bits of preamble. E.g. 2) The SNK (NVME device) does not have enough power to respond. Needs further investigation. The SNK has been able to send a “GoodCRC” and “Request” messages prior to receiving the SRC “Accept” messages.
The USB-PD R3.2 standard sections relating to “Idle” are:
5.7 Collision Avoidance
5.8.5.4 Inter-Frame Gap
5.8.6.1 Definition of Idle.
From those sections, an endpoint detects idle by detecting less than nTransitionCount transitions in time window tTransmissionWindow. Thus “idle” detection is due to a lack of transitions rather than any idle voltage level. So, I don’t think the 1.67 vs 0.88 Volts is a problem unless the “high impedance” requirement is missing.
I am hoping that someone else, with more knowledge of USB-PD than me, can let me know if these differences are significant or not.