hello,
i'm using rm48L952 's sci/lin module to Receive 10 byte of data from a RS232<>USB transiver. my problem is that although MCU receive data,but dma transfers only 9 byte of data and first byte is lost. but in interrupt mode i receive all 10 bytes of data. so i think the problem is from DMA.
i use halcogen to config sci/lin module in {8Data /0Parity /1stop} data format and 460800 bps transfer speed.relevant interrupt enable flags has been set correctly. and configured dma using sys_dma.c library generated by halcogen. i use channel 0 for Transmit and it work correctly. channel 1 is used for receive
- DMA setting (set channel 1 for receive):
DMAChannelConfig((CPU_INT32U)(&scilinREG->RD), /*destination address*/
(uint32)&Receive[0], /*source address*/
(CPU_INT32U)SCI_BUFF, /*transfer length*/
recChannel,
28, /*Request Line*/
ADDR_FIXED, /*read addressing mode*/
ADDR_INC1);
startChannelTransfer(recChannel);
SCI_RX_DMA_ENABLE;
- DMAChannelConfig function:
DMAChannelConfig(CPU_INT32U sourceAddress,
CPU_INT32U destinationAddress,
CPU_INT32U blockLength,
CPU_INT32U channelNumber,
CPU_INT32U requestLineNumber,
CPU_INT32U readAddressMode,
CPU_INT32U writeAddressMode){
dmaEnableInterrupt(channelNumber, BTC); // enable interrupt after receipt of data
dmaReqAssign(channelNumber, requestLineNumber);
dmaCtrlPacket.SADD = sourceAddress; // RAM address
dmaCtrlPacket.DADD = destinationAddress; // peripheral address
dmaCtrlPacket.CHCTRL = 0; // channel control
dmaCtrlPacket.FRCNT = blockLength; // source address length
dmaCtrlPacket.ELCNT = 1; // 1 byte
dmaCtrlPacket.ELDOFFSET = 0; // element destination offset
dmaCtrlPacket.ELSOFFSET = 0; // element source offset
dmaCtrlPacket.FRDOFFSET = 0; // frame destination offset
dmaCtrlPacket.FRSOFFSET = 0; // frame source offset
dmaCtrlPacket.PORTASGN = 4; // port b
dmaCtrlPacket.RDSIZE = ACCESS_8_BIT; // read element size
dmaCtrlPacket.WRSIZE = ACCESS_8_BIT; // write element size
dmaCtrlPacket.TTYPE = FRAME_TRANSFER; // transfer type: frame
dmaCtrlPacket.ADDMODERD = readAddressMode; // read address mode
dmaCtrlPacket.ADDMODEWR = writeAddressMode; // write address mode
dmaCtrlPacket.COMBO = AUTOINIT_OFF; // autoinit off
dmaSetCtrlPacket(channelNumber, dmaCtrlPacket);
}
anyone has any idea about this problem?