你(们)好
我进行了一个测试项目、当时我正在使用以下代码来接收 RM44上的数据、其中 SPI 配置为启用 DMA 的从器件。 一切都很完美、每次我从主器件发送32个字节时、我都会在从器件处获得中断。
/* 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 */
现在、我要为不同的长度(16字节)重新配置 DMA、我尝试修改 DMA 中断例程、如下所示。 从器件正在接收正确的数据、但主器件正在缓冲区开头接收两个额外的字节。
从器件发送->{0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、 0x10、0x11、0x12、0x13、0x14、 0x15、0x16}
主机接收-> {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); } }
请告诉我缺少什么、如果可能、您可以提供重新配置 DMA 的代码。