Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++
12596 Discussions

Problems with 16-bit DDR2-SDRAM connected to Nios

Altera_Forum
Honored Contributor II
1,081 Views

Hi, 

 

I am trying to implement a nios system(cyclone III) with 16-bit DDR2 SDRAM and 16-bit Flash device.  

 

While try to erase the flash device using the routine listed below 

 

unsigned int32 flashoffset; 

unsigned int16 noofblockstoerase; 

unsigned int16 erasesize; 

 

flashutils_eraseflash(flashoffset,noofblockstoerase*erasesize); 

 

it could only erase 64K locations. I assumed that the argument passed was only the lower 16 bits of the noofblockstoerase*erasesize value, as only a 16-bit RAM is connected. 

 

Please let me know if there is a solution where, even if i dont explicitly declare a variable it would still work as normally as 32-bit RAM.
0 Kudos
5 Replies
Altera_Forum
Honored Contributor II
328 Views

Not sure what your problem is? 

 

The flash sector size could well be 64k bytes (except maybe for 'boot' sectors at one end of the device), so you can only erase multiples of that size. 

 

As a general point, don't use int16 (or short) unless you really want wrapping at 2^16, are saving space in a structure, or mapping actual hardware registers into a structure. All you do is cause the compiler to generate extra instructions every time you do any maths. 

 

In the above, both your int16 items will be promoted to 'int' (32 bits) before the multiply - so that shouldn't be relevant. 

 

The size of the flash chips data bus is mostly irrelevant - apart from the problems in generating the required single cycles during the programming operation.
0 Kudos
Altera_Forum
Honored Contributor II
328 Views

The actual problem is that, when i dont declare a 32 bit int variable to store the result of noofblockstoeras e*erasesize and use it as 

 

flashutils_eraseflash(flashoffset,noofblockstoeras e*erasesize); 

 

the flash erase is executed only till 2^16 locations, even when i try erasing a larger block, but this works when i explicitly declare a 32 bit int variable to store the multiplied value. 

 

This may cause problems in my software application where i havent declared variables explicitly.
0 Kudos
Altera_Forum
Honored Contributor II
328 Views

hmmm.... the multiply SHOULD be done (in C) as if the two variables are 'int'. 

So using an extra variable shouldn't matter. 

Something very strange must be going on with the generated code. 

I'd also verify what happens if you pass a length of zero - it is possible that causes a single flash sector be erased! 

 

I am presuming that the 'noofblockstoeras e*erasesize' is a typo! (no space). 

 

I also don't quite understand your comment about 'explicitly declaring variables'.
0 Kudos
Altera_Forum
Honored Contributor II
328 Views

Sorry for the confusion, 'explicitly declaring variables' just means that i had declared a variable 

 

unsigned int 32 tempnoofblockstobeerased

 

tempnoofblockstobeerased = noofblockstoerase*erasesize; 

 

flashutils_eraseflash(flashoffset,tempnoofblockstobeerased); 

 

This works. 

 

the other one is just a typo..
0 Kudos
Altera_Forum
Honored Contributor II
328 Views

Try adding -Wall (and maybe -Werror) to the compiler options - it might show something that is wrong. 

I normally use -O2 -pipe -Wall -Wshadow -Wcast-qual -Wmissing-prototypes -Wpointer-arith -Wwrite-strings -fmessage-length=0 -Werror 

The only troublesome one is -Wsign-compare (migth be included by -Wall) since 'fixing' things is difficult without a cast, and I try to limit the number of casts since they can hide bigger problems.
0 Kudos
Reply