I was hoping but not expecting the SDK Update to fix the Sigma Delta problem. So first thing I did this week was to test. Same failure as before. I had two Ideas this week that might be an answer to the problem. On another project, I was using the Arduino IDE to develop a little weather station project. In it, I was using old code that set certain pins as output. Those pins were/are tied to the SPI bus and was causing it to reboot. Maybe, there is a pin set to have Sigma Delta(ΣΔ) output that is also tied to a critical pin. My second thought is that if the ΣΔ is causing interrupts, I should disable them.
A good practice for microcontroller programming is to always set up all I/Os immediately after a reset. I have gotten sloppy and haven’t done that with this project. If a pin is connected to the ΣΔ that shouldn’t be, this will fix that.
I started by writing down what each pin will do in the design. I referred to the schematic for each pin.
Pin 18 GPIO0 -- Output -- controls analog switch Pin 22 GPIO1 -- Output -- TxD0 Pin 17 GPIO2 -- Output -- sets VPP output high Pin 21 GPIO3 -- Input -- RxD0 Pin 19 GPIO4 -- Output -- ΣΔ pulse stream to generate Vpp Pin 20 GPIO5 -- Output -- Sets Vpp output low Pin 14 GPIO6 -- Output -- SCLK (SPI and HSPI overlap) (need to verify Pin number for ESP12F) Pin 10 GPIO7 -- BiDir -- MISO (SPI and HSPI overlap) (need to verify Pin number for ESP12F) Pin 13 GPIO8 -- BiDir -- MOSI (SPI and HSPI overlap) (need to verify Pin number for ESP12F) Pin 11 GPIO9 -- BiDir -- QIO2 (SPI and HSPI overlap) (need to verify Pin number for ESP12F) Pin 12 GPIO10 -- BiDir -- QIO3 (SPI and HSPI overlap) (need to verify Pin number for ESP12F) Pin 9 GPIO11 -- Output -- CS0 (SPI) (need to verify Pin number for ESP12F) GPIO12 -- BiDir -- Data to target device GPIO13 -- BiDir -- Data to target device GPIO14 -- BiDir -- Data to target device GPIO15 -- Output -- Chip Select for HSPI GPIO16 -- Output -- Disables Vpp generation
I went into the user_init() function and removed all the commented out code leaving an example of the PIN_FUNC_SELECT() macro. I then set GPIO_PIN0 – 15 registers to 0 which disables interrupts and disconnects the ΣΔ output. I compiled the code and uploaded it and it crashed. To find the new problem I caused, I commented out all the new code except setting the GPIO registers to 0. I rebuilt and uploaded the code and … a continuous stream of reboots. I commented out setting the GPIO registers to 0 then put the PIN_FUNC_SELECT() back in. And … reboots slowly.
I removed the function selects that should be controlled by the API anyhow(GPIO6-11). And … I found a typo on the GPIO6 function select. I fixed the typo, rebuilt, uploaded and it ran at least as well as last week. I then started testing to see if it fixed the ΣΔ issue. The reset problem still exists.
Next I set a subset of the GPIO registers to a value of 0 I decided to go with the first 8 to see what would happen. Same failure, a stream of reboots. Then I noticed I wasn’t writing to the correct register locations. I fixed this and then recompiled, uploaded, and code is running, but ΣΔ is still causing a reboot if i set the prescaler to greater than 99.
Next I started looking at the ΣΔ interrupt structure. Unfortunately it has very little documentation that I have found so far. I used google to search for articles pertaining to the use of the Sigma Delta and found very little. My next step is to do a little experimentation. I decided to disable the ΣΔ while changing the prescaler. I got the same results. It’s time to make a Hello World program for a sanity check. It would be the minimum to set up and test functionality of the ΣΔ on GPIO4. If it works correctly, then I have to take a deeper look at my code, if it doesn’t, I’ll have something to post to Espressif’s forum for help.
Have you had similar problems with a chip you have never used before? I have uploaded the current code to GitHub. Use the link at the top of the right hand column to get the download.