Part Number: RM46L852
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.

