你(们)好
我进行了一个测试项目、当时我正在使用以下代码来接收 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 的代码。

