I’ve put together a simple PCB to test the RS9110 wifi with the G120 SoM for a project we’re doing with work and I’ve made up 6 boards so far. The first PCB I put together worked fine, I used the example code for setting up a WiFi network and have been running tests for a few weeks and that board is stable and working. The next 5 PCBs however program fine and then get stuck inside the WiFiRS9110 constructor.
For reference the code is:
NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAvailabilityChanged;
NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged;
Debug.Print(“Connecting to RS9110 WiFi Transceiver…”);
_wifiNetworkInterface = new WiFiRS9110(SPI.SPI_module.SPI2, GHI.Pins.G120.P0_4, GHI.Pins.G120.P0_5, GHI.Pins.G120.P0_6, 1000);
Debug.Print(“Opening RS9110 WiFi Transceiver…”);
_wifiNetworkInterface.Open();
…
…
I first though it must be a soldering problem but I have meticulously gone through each pin on the 5 boards and they all check out (no shorts, all wifi pins connected correctly to the processors, power connections are all fine, etc etc).
My next thought was obviously the WiFi chips were damaged, although this seems unlikely that all 5 were, they had the same treatment as the first working module after all. I scoped the SPI pins and everything seems to check out, there is a reply from the RS9110, albeit a short one, but it’s responding to commands.
Stepping into the constructor obviously doesn’t step into the code as it’s closed source but you do get the following trace output, which appears to be waiting to get the MAC address from the transceiver and then hangs??
Connecting to RS9110 WiFi Transceiver…
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkChange.NetworkAddressChanged.add’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkChange.NetworkAddressChanged.add’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged.add’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged.add’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.RefreshNetworkInterface’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.RefreshNetworkInterface’
Step into: Stepping over non-user code 'GHI.Networking.BaseInterface.BaseInterface’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'Microsoft.SPOT.Hardware.OutputPort.OutputPort’
Step into: Stepping over non-user code 'Microsoft.SPOT.Hardware.OutputPort.OutputPort’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.WiFiRS9110’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.UpdateInternalMacAddress’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.Reset’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.Reset’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.Reset’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.Reset’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.Reset’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.UpdateInternalMacAddress’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.UpdateInternalMacAddress’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.UpdateInternalMacAddress’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.UpdateInternalMacAddress’
Step into: Stepping over non-user code ‘GHI.Networking.WiFiRS9110.WaitOn’
After a little while you get a series of exceptions thrown:
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code 'GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
Step into: Stepping over non-user code ‘GHI.Networking.WiFiRS9110.RecoverFromHardwareException’
I’ve started to check communications directly using SPI commands but obviously I don’t want to have to rewrite the whole interface stack. Sending the RS9110 it’s initialise command 0x15 followed by 0x00 returns the correct response 0x00 followed by 0x58 (as per page 83 of ftp://www.aegroup.com/Jim/Redpine%20Radio/Documents/RS9110-N-11-22_24_28-Software_PRM.pdf). So communication is definetly ok!
If it wasn’t for the first board working flawlessly I would put the whole thing down to an incorrectly designed board but they are identical. The boards are very simple, purely G120, RS9110, relevant pullup/down resistors, 3.3V regulator, LEDs for power and status and the USB connector. Nothing else to interfere so far.
Any help in debugging this would be greatly appreciated, I’m hoping to get this batch of board up and running ready for a run of 100 boards in a few months.