请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320C6726B 工具/软件:
我正在测试我上面分享的配置以及一些不同的组合。
我可以成功接收从 SPI 主器件发送的数据。我通过检查 SPIFLG 标志并直接从 SPIBUF 寄存器读取接收到的数据来验证这一点。
但是、DMAX 事件似乎不会触发、或者 DMAX 不会向我提供地址的缓冲区中执行传输。
由于我可以确认 SPI 从器件正在正确接收数据、因此我假设 SPI 和 DMAX 配置正确。
我怀疑问题可能与我的中断设置有关。 有时、我的代码会崩溃、这使我认为配置中断的方式可能存在错误。
您能帮助我了解一下我在中断配置中可能犯的错误吗?
如果您能提供任何指导或建议、我将不胜感激。
提前感谢您的支持!
/*1- dMAX event High priority*/ dMax_ptr[DEHPR]= 0x2000; // event 13 set a High priority /*2- dMAX Event polarity */ dMax_ptr[DEPR] = 0x2000; // event flag is set on falling(0) edge /* PaRAM SPI Slave Transfer * * bit 4-0 =ETYPE = 0b00010 // event type: SPI slave data transfer * bit 5 =RLOAD = 0b1 // Reload Active counter * bit 7-6 =ESIZE = 0b10 // 16-bit Element * bit 23-8 =PTE = 0x1d4 // pointer to transfer entry // transfer entry-7 * bit 27-24 =TCC = 15-0 // Transfer Complete Code. * bit 28 =TCINT = 0b1 // After completing a whole transfer, the dMAX controller sets a TCC pending bit and triggers an interrupt to the CPU. * bit 29 =SPI = 0b0 // SPI0 Selection * bit 31-30 =reserved * * = 0x1001D4A2 * */ dMaxEvent_ptr[13]= 0x1001D4A2; // event entry 13 /* * dmax transfer entry for spi slave transfer * fixed 11 word * * word 0 = bit 31-0 = SRC Address(active) = Source address * word 1 = bit 31-0 = DST Address(active) = Destination address * word 2 = bit 31 = PP = Referance bit * bit 30-16 =reserved * bit 15-0 = COUNT(active) = Count in unit of elements - updated by the dMAX controller during course of transfer * word 3 = bit 31-16 reserved * bit 15-0 = COUNT (referance) =Reference Count in unit of elements. * word 4 = bit 31-0 = SRC RELOAD ADDRESS0 = Source Address Reload 0 * word 5 = bit 31-0 = DST RELOAD ADDRESS0 = Destination Address Reload 0 * word 6 = bit 31-0 = SRC RELOAD ADDRESS1 = Source Address Reload 1 * word 7 = bit 31-0 = DST RELOAD ADDRESS1 = Destination Address Reload 1 * word 8-10 = reserved * * * */ /*4- Transfer entry configured */ dMaxTransfer_ptr[0] = (unsigned int)dmaxTxData; // transfer entry 7 word0 dMaxTransfer_ptr[1] = (unsigned int)dmaxRxData; // transfer entry 7 word1 dMaxTransfer_ptr[2] = (unsigned int)0x0f; // transfer entry 7 word2 // 16 uzunluk dMaxTransfer_ptr[3] = (unsigned int)0x0f; // transfer entry 7 word3 dMaxTransfer_ptr[4] = (unsigned int)dmaxTxData2; // transfer entry 7 word4 dMaxTransfer_ptr[5] = (unsigned int)dmaxRxData2; // transfer entry 7 word5 dMaxTransfer_ptr[6] = (unsigned int)dmaxTxData; // transfer entry 7 word6 dMaxTransfer_ptr[7] = (unsigned int)dmaxRxData; // transfer entry 7 word7 /* Setting up the DMAX Interrupts */ /* Interrupt Initialization */ status_int = CSL_intcInit (&intcContext); if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } status_int = CSL_intcDispatcherInit (&intcDispatcherContext); if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } /* Install handler for DMAX INT8 Interrupt */ hIntc = CSL_intcOpen (&intcObj, CSL_INTC_EVENTID_DMAXEVTOUT1, NULL, &status_int); if ((hIntc == NULL) || (status_int != CSL_SOK)) { status_int = CSL_ESYS_BADHANDLE; dmax_error_exit(); return status_int ; } isrRec.handler = intr08; /* As no arguments assigning zero(0) value */ isrRec.arg = (void *) 0x0; /*Plugging ISR in Event Handler */ CSL_intcPlugEventHandler (hIntc, &isrRec); /* Enabling DMAXEVTSPI Event */ status_int = CSL_intcEventEnable (CSL_INTC_EVENTID_DMAXEVTOUT1, &eventStat); // SPI ayarlandı if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } /* Enabling Non-Maskable Interrupt */ status_int = CSL_intcEventEnable (CSL_INTC_EVENTID_NMI, &eventStat); if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } /* Enabling Global Enable bit in Control Status Register (CSR) */ status_int = CSL_intcGlobalEnable (&state); if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } /* Closing INTC Handle */ status_int = CSL_intcClose (hIntc); if (status_int != CSL_SOK) { dmax_error_exit (); return status_int; } /* Setting up the DMAX Interrupts */ /*5- dMAX event enable*/ dMax_ptr[DEER]= 0x2000; // event 13 pinmsk = 0x0E01; /* SPI 4-pin with chip select mode */ /* 1. Take the SPI0 out of reset */ spi0_ptr[SPIGCR0] = 0x01; /* 2. Configure SPI0 for slave */ spi0_ptr[SPIGCR1] = 0x00; /* 3. Configure SPI0 mode */ spi0_ptr[SPIPC0] = pinmsk; /* 4. Chose SPI0SPIFMT0 */ spi0_ptr[SPIDAT1] = 0x00000000; /* 5. Configure SPI0 for SHIFTDIR=0,POLARITY=1,PHASE=0, CHARLEN=16 */ spi0_ptr[SPIFMT0] = 0x00001410; /* 6. SPIDELAY for SPI0 not relevant in slave mode */ spi0_ptr[SPIDELAY] = 0x00; /* 7. Configure SPI0 for error notifications for OVR,BITERR and DESEL */ //spi0_ptr[SPIINT0] = 0x00000054; spi0_ptr[SPIINT0] = 0x00000000; spi0_ptr[SPILVL] = 0x00; /* 8. Enable SPI0 communication */ spi0_ptr[SPIGCR1] |= 0x01000000; /* 9. Configure SPI0 for dmax servicing of spi events*/ spi0_ptr[SPIINT0] |= 0x00010000;