Reply by Vladimir Vassilevsky●November 17, 20062006-11-17
insecuritate wrote:
> no more suggestions!? :(
>
Well. Do you really expect anyone to check your initializations against
the manual? It is a hard and a very boring piece of work.
VLV
Reply by insecuritate●November 17, 20062006-11-17
no more suggestions!? :(
Reply by insecuritate●November 15, 20062006-11-15
>The DMA in BF should operate in the memory area which is not covered by
>the cache. If you are trying to do the DMA from/to the memory which is
>cached, the results will be arbitrary.
thanks!
but that doesn't explain the automatic increment of DMA6_CURR_ADDR?!
the mystifying thing in my eyes is, that the TX DMA increments itself but
the RX DMA works fine and only counts up, when i've written a value...
Reply by Vladimir Vassilevsky●November 15, 20062006-11-15
insecuritate wrote:
> Dear all,
>
> i'd like to use UART DMA to exchange data between EZ-Kit and Matlab.
> The following code-snippet should explain my initialisation. tx_buf is the
> data i'd like to read out, rx_buf is the data to write to:
>
[...]
> any idea?!
The DMA in BF should operate in the memory area which is not covered by
the cache. If you are trying to do the DMA from/to the memory which is
cached, the results will be arbitrary.
Vladimir Vassilevsky
DSP and Mixed Signal Design Consultant
http://www.abvolt.com
Reply by insecuritate●November 15, 20062006-11-15
Dear all,
i'd like to use UART DMA to exchange data between EZ-Kit and Matlab.
The following code-snippet should explain my initialisation. tx_buf is the
data i'd like to read out, rx_buf is the data to write to:
unsigned char tx_buf[BUFLEN];
unsigned char rx_buf[BUFLEN];
void init_dma_tx (void)
{
*pDMA7_CONFIG = 0x1080;
*pDMA7_PERIPHERAL_MAP = 0x7000;
*pDMA7_X_COUNT = BUFLEN;
*pDMA7_X_MODIFY = 0x01;
*pDMA7_START_ADDR = (void*)&tx_buf;
asm("ssync;");
}
void init_dma_rx (void)
{
*pDMA6_CONFIG = 0x1082;
*pDMA6_PERIPHERAL_MAP = 0x6000;
*pDMA6_X_COUNT = BUFLEN;
*pDMA6_X_MODIFY = 0x01;
*pDMA6_START_ADDR = (void*)&rx_buf;
asm("ssync;");
}
the corresponding uart-interrupts are properly set and the dma channels
are enabled in a following step.
If i now run the program the write-operation works fine: i send a byte and
it is succesfully stored in rx_buf[0], the DMA6_CURR_ADDR is incremented by
one so that the next value is stored in rx_buf[1] and so on.
But i am despaired about the work of my DMA-read operation. Although i
read nothing the DMA7_CURR_ADDR increments (and loops within DMA6_X_COUNT)
as if by an invisible hand. The read-operation itself works but the problem
is, that i get a random value from tx_buf. the next value i read is another
random value out of this buffer. only if i read some bytes at once, they
are in continuous order...
hope, you could track my problem: i would like to read from tx_buf
continuous from the beginning on. if i read tx_buf[3] now, i would read
tx_buf[4] in a second or a minute or a hour)
any idea?!