Sorry, I didn't mean to offend anyone. It's just "I sing what I see, and I see what I sing" (C)
Can you please provide a code for controller with that reading over port A enabled, so that I would be able to see the code which actually has a problem.
Also, in general, all SDRAMs (including SDR and all DDRx ones) work the same way - you open a row, you work with it however long you need, then you close it. If at a time of issuing a read/write command you know for fact that you won't need to access that row anymore (or that you know that you will need to access a different row in the same bank), you can use auto precharge command. Also keep in mind that you can use different banks in parallel, as each bank can have it's own open row - just make sure you close them all before you do a refresh. You can so some very clever tricks with banks, for example - double-buffering - have your CPU write framebuffer into bank 1, while the video controller reads a previous frame off bank 0, then at some point you swap these around. Also consider using bursts at least for frame reads - this will give you much greater bandwidth and efficiency as you will better amortize initial access latency.
Finally, I'd highly recommend you to read through Micron's datasheet for SDRAM:
https://www.micron.com/products/dram/sdram/part-catalog/mt48lc32m8a2p-6a It's more detailed as far as timings are concerned. But more importantly - on the page I've linked there is a verilog simulation model for their memory chips - this way you can verify in simulation that your controller code's behavior is correct without the need to debug it in hardware, which is more complicated and is much slower. Also Micron's sim model will report errors if any timing parameters are violated. I know you don't use Micron part on your board, but I suspect all SDRAM chips operate sufficiently similar to one another that it shouldn't matter as long as timing parameters are correct.