Forum Discussion
Altera_Forum
Honored Contributor
15 years agoHi,
I hope this will help you. But I am using an ISR for servicing a completed DMA-Transfer.Int32 Transmit(Char8 * pTx, Int32 lLength)
{
//softwarereset
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE, 0x1000);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE, 0x1000);
IOWR_ALTERA_AVALON_PIO_DATA (PIO_RS485_BASE,TRANSMIT); // setting the direction of the transceiver using a PIO
IORD_ALTERA_AVALON_UART_RXDATA(UART_RS485_BASE); //dummy read to UART
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE,
ALTERA_AVALON_DMA_CONTROL_WCON_MSK|
ALTERA_AVALON_DMA_CONTROL_BYTE_MSK|
ALTERA_AVALON_DMA_CONTROL_LEEN_MSK|
ALTERA_AVALON_DMA_CONTROL_I_EN_MSK); //setzen von WCON
DmaTransfer ((Int32) IOADDR_ALTERA_AVALON_UART_TXDATA(UART_RS485_BASE),
(Int32) pTx, lLength);
return 0;
}
Int32 Receive(Char8 * pRx, Int32 lLength)
{
while (!(IORD_ALTERA_AVALON_UART_STATUS(UART_RS485_BASE)
& ALTERA_AVALON_UART_STATUS_TMT_MSK));
//softwarereset
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE, 0x1000);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE, 0x1000);
IORD_ALTERA_AVALON_UART_RXDATA(UART_RS485_BASE); // dummy read to UART
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE,
ALTERA_AVALON_DMA_CONTROL_RCON_MSK|
ALTERA_AVALON_DMA_CONTROL_BYTE_MSK|
ALTERA_AVALON_DMA_CONTROL_LEEN_MSK|
ALTERA_AVALON_DMA_CONTROL_I_EN_MSK);
IOWR_ALTERA_AVALON_PIO_DATA (PIO_RS485_BASE,RECEIVE); // setting the direction of the transceiver using a PIO
DmaTransfer ((Int32)pRx,
(Int32)IOADDR_ALTERA_AVALON_UART_RXDATA(UART_RS485_BASE),
lLength);
return 0;
}
void DmaTransfer(Int32 lWhere, Int32 lFrom, Int32 lHowMuch)
{
while ((IORD_ALTERA_AVALON_DMA_STATUS(DMA_RS485_BASE)
& ALTERA_AVALON_DMA_STATUS_BUSY_MSK));
IOWR_ALTERA_AVALON_DMA_STATUS (DMA_RS485_BASE, 0);
IOWR_ALTERA_AVALON_DMA_RADDRESS (DMA_RS485_BASE,(Int32) lFrom);
IOWR_ALTERA_AVALON_DMA_WADDRESS (DMA_RS485_BASE,(Int32) lWhere);
IOWR_ALTERA_AVALON_DMA_LENGTH (DMA_RS485_BASE, lHowMuch);
IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_RS485_BASE,
ALTERA_AVALON_DMA_CONTROL_GO_MSK |
IORD_ALTERA_AVALON_DMA_CONTROL(DMA_RS485_BASE));
}Good luck!