We are currently implementing OAD Firmware updates for our Apps and Windows software and have discovered very odd behavior. We use custom boards with a CC2540 and on some of them the OAD update fails due to potential connection timeouts (I've attached sniffer logs to verify this).
All of the boards we are using are identical and we can successfully update all of them using the TI iOS App and also our own iOS/Android Apps. Right now it seems like only the Windows implementation has this problem and only on some devices (even though all of them are identical).
Here is what happens:
The device connects successfully and the OAD Header gets send to the device. The device answers by requesting the first Block via the Block Characteristic. Then the Windows App sends the first block of data. Now nothing happens and after 10secs the device disconnects and reconnects to repeat these steps indefinitely. This seems like the connection times out because to default connection timeout matches those 10secs.
Using the sniffer it seems like the device drops the connection. I've attached sniffer logs of the same code and firmware running on two different devices. On the first one it times out and on the second one it doesn't. Same firmware, same windows app, just different boards but both boards can be updated using the TI App or out own Apps.
I guess my question is, am I right in assuming the device drops the connection? And if yes how is it possible that the windows App causes the device to disconnect? I don't think there is a hardware malfunction since all boards can be updated via one method. Right now only the OAD Update on Windows causes this. The odd thing is, it seems like the device causes the timeout but the windows app causes this problem to occur, how can this be?
EDIT: I think this question might also apply to non OAD related behavior. I can write to the image identify characteristic just fine, the problem only happens after writing to the block characteristic. I am receiving something on that characteristic beforehand maybe this causes a hiccup or something?
This is the sniffer log for the time out. The first ATT_Write_Req is the header, the device answers by requesting block 0, then the ATT_Write_Command with Block 0 and then nothing but M -> S with no response from the device:
And this is a working case but here the device answers by requesting block 01 and so on. There seems to be a little bit of a problem as well with some ACK Status retries but maybe this isn't such a problem at all. This OAD however succeeds.

