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?