I have written an I2C master for the DE10-Nano FPGA which is meant to communicate with the SSD1306 OLED display driver.
The issue I'm having is that it simply is not working when I actually test it on hardware. According to my debug lights the slave (SSD1306) is not sending the ack signal after receiving its address causing the master to go back to the 'idle' state. I know its the correct address (0x3C/0b00111100) because when I use the same address to control this display with an Arduino it works just fine.
I was wondering if anyone who is familiar with I2C could look at my waveforms and check for any glaring mistakes. The DE10-Nano has a 50 MHz clock which is down sampled to 10 KHz for the scl signal. I've also made sure to only change sda when scl is low and made sure I'm meeting all the timing requirements of the I2C spec.
sda goes low:
- scl starts after sda has been low for 5 clock cyles (10 Khz)
- Ack state where cursor is checks if sda is pulled low (code was edited to pull low for the sim, would normally be set to 'H' so the slave can pull it low its self)
Another thing to note is that I'm supplying the SSD1306 with 3.3 V and the sda and scl pins are 3.3 V. When this display is working on the Arduino the sda and scl pins are 5 V as well as the supply but I know the display is able to operate with a 3.3 V supply.
If anyone wants to see any part of the VHDL I will post it.
PresentState
changes fromstart sequence
totransmit address
. What do you think? \$\endgroup\$