Hi
I made a test project whern I am using following code to receive data on RM44 where SPI is configured as slave with DMA enabled. Every thing is woirking perfectly fine, Everytime i send 32 bytes from master i get an interrupt at Slave.
/* USER CODE BEGIN (2) */ g_dmaCTRL g_dmaCTRLPKT_RX; g_dmaCTRL g_dmaCTRLPKT_TX; uint8_t TX_Data_Slave[32] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20}; uint8_t RX_Data_Slave[32] = { 0 }; //uint16_t RX_Data_Slave[8] = { 0 }; //void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize); void dmaConfigCtrlTxPacket (uint32 sadd, uint32 dadd, uint16 ElmntCnt, uint16 FrameCnt); void dmaConfigCtrlRxPacket (uint32 sadd, uint32 dadd, uint16 ElmntCnt, uint16 FrameCnt); /* USER CODE END */ int main(void) { /* USER CODE BEGIN (3) */ /* Enable CPU Interrupt through CPSR */ _enable_IRQ(); spiInit(); // enabling dma module : this brings DMA out of reset dmaEnable(); // Enable Interrupt after reception of data dmaEnableInterrupt(DMA_CH0, BTC); //Block transfer complete // assigning dma request: channel-0 with request line - 0 (SPI1 Receive DMA Request) dmaReqAssign(DMA_CH0,0); dmaReqAssign(DMA_CH1,1); // configuring DMA control packets dmaConfigCtrlTxPacket((uint32)TX_Data_Slave, (uint32)(&spiREG1->DAT1), 1, 32); dmaConfigCtrlRxPacket((uint32)(&spiREG1->BUF) ,(uint32)RX_Data_Slave,1, 32); // setting DMA control packets dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT_RX); dmaSetCtrlPacket(DMA_CH1,g_dmaCTRLPKT_TX); // setting the DMA channel to trigger on h/w request */ dmaSetChEnable(DMA_CH0, DMA_HW); dmaSetChEnable(DMA_CH1, DMA_HW); // DMA_REQ_Enable On first received data, a DMA_Req will be send to DMA spiREG1->INT0 = 0x00010000; while(1) { } /* USER CODE END */ return 0; } /* USER CODE BEGIN (4) */ volatile uint8_t count = 0; void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel) { if (inttype == BTC) { count++; } } void dmaConfigCtrlRxPacket (uint32 sadd, uint32 dadd, uint16 ElmntCnt, uint16 FrameCnt) { g_dmaCTRLPKT_RX.SADD = sadd; g_dmaCTRLPKT_RX.DADD = dadd; g_dmaCTRLPKT_RX.CHCTRL = 0; g_dmaCTRLPKT_RX.FRCNT = FrameCnt; g_dmaCTRLPKT_RX.ELCNT = ElmntCnt; g_dmaCTRLPKT_RX.ELDOFFSET = 0; g_dmaCTRLPKT_RX.ELSOFFSET = 0; g_dmaCTRLPKT_RX.FRDOFFSET = 0; g_dmaCTRLPKT_RX.FRSOFFSET = 0; g_dmaCTRLPKT_RX.PORTASGN = 4; g_dmaCTRLPKT_RX.RDSIZE = ACCESS_8_BIT; g_dmaCTRLPKT_RX.WRSIZE = ACCESS_8_BIT; g_dmaCTRLPKT_RX.TTYPE = FRAME_TRANSFER; g_dmaCTRLPKT_RX.ADDMODERD = ADDR_FIXED; g_dmaCTRLPKT_RX.ADDMODEWR = ADDR_INC1; g_dmaCTRLPKT_RX.AUTOINIT = AUTOINIT_ON; } void dmaConfigCtrlTxPacket (uint32 sadd, uint32 dadd, uint16 ElmntCnt, uint16 FrameCnt) { g_dmaCTRLPKT_TX.SADD = sadd; g_dmaCTRLPKT_TX.DADD = dadd; g_dmaCTRLPKT_TX.CHCTRL = 0; g_dmaCTRLPKT_TX.FRCNT = FrameCnt; g_dmaCTRLPKT_TX.ELCNT = ElmntCnt; g_dmaCTRLPKT_TX.ELDOFFSET = 0; g_dmaCTRLPKT_TX.ELSOFFSET = 0; g_dmaCTRLPKT_TX.FRDOFFSET = 0; g_dmaCTRLPKT_TX.FRSOFFSET = 0; g_dmaCTRLPKT_TX.PORTASGN = 4; g_dmaCTRLPKT_TX.RDSIZE = ACCESS_8_BIT; g_dmaCTRLPKT_TX.WRSIZE = ACCESS_8_BIT; g_dmaCTRLPKT_TX.TTYPE = FRAME_TRANSFER; g_dmaCTRLPKT_TX.ADDMODERD = ADDR_INC1; g_dmaCTRLPKT_TX.ADDMODEWR = ADDR_FIXED; g_dmaCTRLPKT_TX.AUTOINIT = AUTOINIT_ON; } /* USER CODE END */
Now i want to reconfigure the DMA for different length (16 bytes), i tried to modify the DMA interrupt routine as shown below. Slave is receiving correct data but Master is receiving two extra bytes in the beginning of the buffer.
Slave sending -> { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16}
Master receiving -> { 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14}
void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel) { if (inttype == BTC) { count++; // configuring DMA control packets dmaConfigCtrlTxPacket((uint32)TX_Data_Slave, (uint32)(&spiREG1->DAT1), 1, 16); dmaConfigCtrlRxPacket((uint32)(&spiREG1->BUF) ,(uint32)RX_Data_Slave,1, 16); // setting DMA control packets dmaSetCtrlPacket(DMA_CH0,g_dmaCTRLPKT_RX); dmaSetCtrlPacket(DMA_CH1,g_dmaCTRLPKT_TX); } }
Could you please let me know what am i missing, if possible could you please provide the code to reconfigure the DMA.