Hi,
I got couple of questions. Is there CSL support available for c6657 device for SPI?
And can I get an example code for SPI/EDMA for SPI data transfer while interfacing a DSP to an external device like slics on SPI?
Regards,
Hari
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hi,
I got couple of questions. Is there CSL support available for c6657 device for SPI?
And can I get an example code for SPI/EDMA for SPI data transfer while interfacing a DSP to an external device like slics on SPI?
Regards,
Hari
Hi Hari,
Yes, in the MCSDK there is CSL support for the SPI at: C:\TI\pdk_C6657_1_0_0_0\packages\ti\csl\cslr_spi.h
http://software-dl.ti.com/sdoemb/sdoemb_public_sw/bios_mcsdk/latest/index_FDS.html
I'm not aware of an example the uses the EDMA with SPI at this point.
Regards,
Travis
Not sure how different the C6657 is from the C6670/78 but Steven Ji gave me a pretty good example for the C6670 here:
http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/170614.aspx
Erick
Hi,
There is no official SPI driver but SPI driver is still there as a part of IBL functionality for using SPI NOR flash. You can refer to spi.c, spi_api.c and spiutil.c for SPI functionality driver available at C:\ti\mcsdk_2_00_xx_xx\tools\boot_loader\ibl\src\hw\spi folder. You can look into Iblinitspinor.c file at C:\ti\mcsdk_2_00_xx_xx\tools\boot_loader\ibl\src\main folder iblInitSpiNor() function for knowing how to use those SPI APIs to use SPI based NOR (or any SPI based device) using those APIs.
Regards,
Bhavin
Hi,
I tried to work on this http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/170614.aspx
on c6657 EVM.
I got first problem where CSL_TPCC_1 is not defined. I see it defines CSL_TPCC_2. I tried replacing with values 1 or 2.
Compilation is fine, But I get struck @
while(!(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFLG & 0x00000100));
profileRxStart = CSL_tscRead();
------------------------------------------------------------------------------------------------------------------------------------------------
#include <ti/csl/soc.h> #include <ti/csl/tistdtypes.h> #include <ti/csl/csl_chip.h> #include <ti/csl/csl_edma3.h> #include <ti/csl/csl_edma3Aux.h> #include <ti/csl/cslr_spi.h> #include "spi_common.h" #include <stdio.h> #define TEST_ACNT 2 #define TEST_BCNT 1024 #define TEST_CCNT 1 #define TEST_SYCTYPE_AB 1 #define TEST_SYCTYPE_A 0 #define BUF_SIZE TEST_BCNT #define BUF_NUM 5 #pragma DATA_SECTION(dstBuf, ".gem1_data") #pragma DATA_ALIGN(dstBuf, 8) Uint16 dstBuf[BUF_NUM][BUF_SIZE]; #pragma DATA_SECTION(srcBuf, ".gem0_data") #pragma DATA_ALIGN(srcBuf, 8) Uint16 srcBuf[BUF_NUM][BUF_SIZE]; CSL_Uint64 profileTxStart; CSL_Uint64 profileTxStop; CSL_Uint64 profileRxStart; CSL_Uint64 profileRxStop; CSL_Uint64 profileTx; CSL_Uint64 profileRx; Uint32 global_address (Uint32 addr) { Uint32 corenum; corenum = CSL_chipReadReg(CSL_CHIP_DNUM); addr = addr + (0x10000000 + corenum*0x1000000); return addr; } void Enable_Edma_Channels(void) { // Enable channel CSL_edma3HwChannelControl(hChannel0,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL); // Enable channel CSL_edma3HwChannelControl(hChannel1,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL); } void Setup_Edma_Init (void) { // EDMA Module Initialization CSL_edma3Init(NULL); // EDMA Module Open hModule = CSL_edma3Open(&moduleObj,CSL_TPCC_2,NULL,&EdmaStat); // SPI Tx Channel Open - Channel 2 for Tx (SPIXEVT) chParam.regionNum = CSL_EDMA3_REGION_GLOBAL; chSetup.que = CSL_EDMA3_QUE_0; chParam.chaNum = CSL_EDMA3_CHA_2; hChannel0 = CSL_edma3ChannelOpen(&ChObj0, CSL_TPCC_2, &chParam, &EdmaStat); chSetup.paramNum = chParam.chaNum; //CSL_EDMA3_CHA_2; CSL_edma3HwChannelSetupParam(hChannel0,chSetup.paramNum); // SPI Rx Channel Open - Channel 3 for Rx (SPIREVT) chParam.regionNum = CSL_EDMA3_REGION_GLOBAL; chSetup.que = CSL_EDMA3_QUE_0; chParam.chaNum = CSL_EDMA3_CHA_3; hChannel1 = CSL_edma3ChannelOpen(&ChObj1, CSL_TPCC_2, &chParam, &EdmaStat); chSetup.paramNum = chParam.chaNum; //CSL_EDMA3_CHA_3; CSL_edma3HwChannelSetupParam(hChannel1,chSetup.paramNum); Enable_Edma_Channels(); } void Setup_Edma_Params (Uint32 srcBuf,Uint32 dstBuf) { // Parameter Handle Open // Open all the handles and keep them ready paramHandle0 = CSL_edma3GetParamHandle(hChannel0,CSL_EDMA3_CHA_2,&EdmaStat); paramHandle1 = CSL_edma3GetParamHandle(hChannel1,CSL_EDMA3_CHA_3,&EdmaStat); paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(TEST_ACNT,(TEST_BCNT)); paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(TEST_ACNT,0 ); paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0); paramSetup.cCnt = TEST_CCNT; paramSetup.option = CSL_EDMA3_OPT_MAKE(FALSE,FALSE,FALSE,TRUE,CSL_EDMA3_CHA_2,CSL_EDMA3_TCC_NORMAL, \ CSL_EDMA3_FIFOWIDTH_NONE,FALSE,CSL_EDMA3_SYNC_A,CSL_EDMA3_ADDRMODE_INCR,CSL_EDMA3_ADDRMODE_INCR); if( ((Uint32)srcBuf & 0xFFF00000) == 0x00800000) paramSetup.srcAddr = (Uint32)(global_address((Uint32)srcBuf)); else paramSetup.srcAddr = (Uint32)(srcBuf); paramSetup.dstAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIDAT0); //paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0); paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(paramHandle0_reload,0); CSL_edma3ParamSetup(paramHandle0,¶mSetup); CSL_edma3ParamSetup(paramHandle0_reload,¶mSetup); paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(TEST_ACNT,TEST_BCNT); paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0,TEST_ACNT ); paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0); paramSetup.cCnt = TEST_CCNT; paramSetup.option = CSL_EDMA3_OPT_MAKE(FALSE,FALSE,FALSE,TRUE,CSL_EDMA3_CHA_3,CSL_EDMA3_TCC_NORMAL, \ CSL_EDMA3_FIFOWIDTH_NONE,FALSE,CSL_EDMA3_SYNC_A,CSL_EDMA3_ADDRMODE_INCR,CSL_EDMA3_ADDRMODE_INCR); paramSetup.srcAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIBUF); if( ((Uint32)dstBuf & 0xFFF00000) == 0x00800000) paramSetup.dstAddr = (Uint32)(global_address((Uint32)dstBuf)); else paramSetup.dstAddr = (Uint32)dstBuf; //paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0); paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(paramHandle1_reload,0); CSL_edma3ParamSetup(paramHandle1,¶mSetup); CSL_edma3ParamSetup(paramHandle1_reload,¶mSetup); //Enable_Edma_Channels(); } void Test_Edma(void) { // Wait for interrupt regionIpr.region = CSL_EDMA3_REGION_GLOBAL; regionIpr.intr = 0; regionIpr.intrh = 0; do{ CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIpr); }while ((regionIpr.intr & 0x08) != 0x08); //channel_3 profileTxStop = CSL_tscRead(); do{ CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIpr); }while ((regionIpr.intr & 0x04) != 0x04); //channel_2 profileRxStop = CSL_tscRead(); /* Clear pending interrupt */ CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTRPEND_CLEAR, ®ionIpr); } void Close_Edma() { CSL_FINST(hModule->regs->TPCC_SECR,TPCC_TPCC_SECR_SECR2,RESETVAL); CSL_FINST(hModule->regs->TPCC_SECR,TPCC_TPCC_SECR_SECR3,RESETVAL); CSL_edma3ChannelClose(hChannel0); CSL_edma3ChannelClose(hChannel1); CSL_edma3Close(hModule); } void Setup_SPI_Init (void) { /* Reset SPI */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIGCR0= CSL_SPI_SPIGCR0_RESET_IN_RESET<<CSL_SPI_SPIGCR0_RESET_SHIFT; /* Take SPI out of reset */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIGCR0= CSL_SPI_SPIGCR0_RESET_OUT_OF_RESET<<CSL_SPI_SPIGCR0_RESET_SHIFT; /* Configure SPI as master */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIGCR1= CSL_SPI_SPIGCR1_CLKMOD_INTERNAL<<CSL_SPI_SPIGCR1_CLKMOD_SHIFT| CSL_SPI_SPIGCR1_MASTER_MASTER<<CSL_SPI_SPIGCR1_MASTER_SHIFT; /* Configure SPI in 4-pin SCS mode */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIPC0= CSL_SPI_SPIPC0_SOMIFUN_SPI<<CSL_SPI_SPIPC0_SOMIFUN_SHIFT| CSL_SPI_SPIPC0_SIMOFUN_SPI<<CSL_SPI_SPIPC0_SIMOFUN_SHIFT| CSL_SPI_SPIPC0_CLKFUN_SPI<<CSL_SPI_SPIPC0_CLKFUN_SHIFT| CSL_SPI_SPIPC0_SCS0FUN0_SPI<<CSL_SPI_SPIPC0_SCS0FUN0_SHIFT; /* Put SPI in Lpbk mode */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIGCR1 |= CSL_SPI_SPIGCR1_LOOPBACK_ENABLE<<CSL_SPI_SPIGCR1_LOOPBACK_SHIFT; /* Chose SPIFMT0 */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIDAT1= CSL_SPI_SPIDAT1_DFSEL_FORMAT0<<CSL_SPI_SPIDAT1_DFSEL_SHIFT; /* Configure for WAITEN=YES,SHIFTDIR=MSB,POLARITY=HIGH,PHASE=IN,CHARLEN=16*/ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFMT[0]= CSL_SPI_SPIFMT_WAITENA_DISABLE<<CSL_SPI_SPIFMT_WAITENA_SHIFT| CSL_SPI_SPIFMT_SHIFTDIR_MSB<<CSL_SPI_SPIFMT_SHIFTDIR_SHIFT| CSL_SPI_SPIFMT_POLARITY_LOW<<CSL_SPI_SPIFMT_POLARITY_SHIFT| CSL_SPI_SPIFMT_PHASE_DELAY<<CSL_SPI_SPIFMT_PHASE_SHIFT| 0x1<<CSL_SPI_SPIFMT_PRESCALE_SHIFT| 0x10<<CSL_SPI_SPIFMT_CHARLEN_SHIFT; ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIINT0 = CSL_SPI_SPIINT0_ENABLEHIGHZ_ENABLE<<CSL_SPI_SPIINT0_ENABLEHIGHZ_SHIFT| CSL_SPI_SPIINT0_OVRNINTENA_ENABLE<<CSL_SPI_SPIINT0_OVRNINTENA_SHIFT| CSL_SPI_SPIINT0_BITERRENA_ENABLE<<CSL_SPI_SPIINT0_BITERRENA_SHIFT| CSL_SPI_SPIINT0_DESYNCENA_ENABLE<<CSL_SPI_SPIINT0_DESYNCENA_SHIFT| CSL_SPI_SPIINT0_PARERRENA_ENABLE<<CSL_SPI_SPIINT0_PARERRENA_SHIFT| CSL_SPI_SPIINT0_TIMEOUTENA_ENABLE<<CSL_SPI_SPIINT0_TIMEOUTENA_SHIFT| CSL_SPI_SPIINT0_DLENERRENA_ENABLE<<CSL_SPI_SPIINT0_DLENERRENA_SHIFT; /* Enable communication */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIGCR1|= CSL_SPI_SPIGCR1_ENABLE_ENABLE<<CSL_SPI_SPIGCR1_ENABLE_SHIFT; } void SPI_DMA_Request (void) { /* Disable DMA Request */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIINT0 &=\ ~(CSL_SPI_SPIINT0_DMAREQEN_ENABLE<<CSL_SPI_SPIINT0_DMAREQEN_SHIFT); /* Enable DMA Request */ ((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIINT0 |=\ CSL_SPI_SPIINT0_DMAREQEN_ENABLE<<CSL_SPI_SPIINT0_DMAREQEN_SHIFT; while(!(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFLG & 0x00000200)); profileTxStart = CSL_tscRead(); while(!(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFLG & 0x00000100)); profileRxStart = CSL_tscRead(); } Bool Verify_Transfer(Uint16 aCnt, Uint16 bCnt, Uint16 cCnt, Int16 srcBIdx, Int16 dstBIdx, Int16 srcCIdx, Int16 dstCIdx,Uint32 srcBuff,Uint32 dstBuff, Bool abSync) { Uint8* srcArrayPtr = (Uint8*)srcBuff; Uint8* dstArrayPtr = (Uint8*)dstBuff; Uint8* srcFramePtr = (Uint8*)srcBuff; Uint8* dstFramePtr = (Uint8*)dstBuff; int i,j,k; for (i = 0; i < cCnt; i++) { for (j = 0; j < bCnt ;j++) { for (k = 0;k < aCnt;k++) { if (srcArrayPtr[k] != dstArrayPtr[k]) { return FALSE; } } srcArrayPtr = srcArrayPtr + srcBIdx; dstArrayPtr = dstArrayPtr + dstBIdx; } if (abSync) { srcFramePtr = srcFramePtr + srcCIdx; srcArrayPtr = srcFramePtr; dstFramePtr = dstFramePtr + dstCIdx; dstArrayPtr = dstFramePtr; } else { srcFramePtr = srcArrayPtr + srcCIdx - srcBIdx; srcArrayPtr = srcFramePtr; dstFramePtr = dstArrayPtr + dstCIdx - dstBIdx; dstArrayPtr = dstFramePtr; } } return TRUE; } void Initiate_Buffers(Uint16 aCnt, Uint16 bCnt, Uint16 cCnt, Int16 srcBIdx, Int16 dstBIdx, Int16 srcCIdx, Int16 dstCIdx,Uint32 srcBuff,Uint32 dstBuff, Bool abSync) { Uint8* srcArrayPtr = (Uint8*)srcBuff; Uint8* dstArrayPtr = (Uint8*)dstBuff; Uint8* srcFramePtr = (Uint8*)srcBuff; Uint8* dstFramePtr = (Uint8*)dstBuff; Uint8 cnt = 0; int i,j,k; for (i = 0; i < cCnt; i++) { for (j = 0; j < bCnt ;j++) { for (k = 0;k < aCnt;k++) { srcArrayPtr[k] = cnt++; dstArrayPtr[k] = 0; } srcArrayPtr = srcArrayPtr + srcBIdx; dstArrayPtr = dstArrayPtr + dstBIdx; } if (abSync) { srcFramePtr = srcFramePtr + srcCIdx; srcArrayPtr = srcFramePtr; dstFramePtr = dstFramePtr + dstCIdx; dstArrayPtr = dstFramePtr; } else { srcFramePtr = srcArrayPtr + srcCIdx - srcBIdx; srcArrayPtr = srcFramePtr; dstFramePtr = dstArrayPtr + dstCIdx - dstBIdx; dstArrayPtr = dstFramePtr; } } } void main (void) { volatile Uint32 failFlag = FALSE; int i = 0; //Initiate src/dst buffers for (i=0; i<BUF_NUM; i++) { Initiate_Buffers(TEST_ACNT,TEST_BCNT, TEST_CCNT,TEST_ACNT ,TEST_ACNT, TEST_ACNT*TEST_BCNT, TEST_ACNT*TEST_BCNT,(Uint32)srcBuf[i],(Uint32)dstBuf[i], CSL_EDMA3_SYNC_A); } //Initialize EDMA for SPI transfer Setup_Edma_Init(); //Configure SPI in loopback mode and enable DMA interrupt support Setup_SPI_Init(); CSL_tscEnable(); for (i=0; i<BUF_NUM; i++) { //Enable EDMA for SPI transfer Setup_Edma_Params((Uint32)srcBuf[i],(Uint32)dstBuf[i]); //Enable SPI DMA Request SPI_DMA_Request(); //Check EDMA transfer completion status Test_Edma(); //Verify src/dst buffers after transfer failFlag = Verify_Transfer(TEST_ACNT,TEST_BCNT, TEST_CCNT,TEST_ACNT ,TEST_ACNT, TEST_ACNT*TEST_BCNT, TEST_ACNT*TEST_BCNT,(Uint32)srcBuf[i],(Uint32)dstBuf[i], CSL_EDMA3_SYNC_A); if (failFlag == TRUE) printf("data verification of buffer[%d] passed\n", i); else printf("data verification of buffer[%d] failed\n", i); profileTx = (Uint32)(profileTxStop - profileTxStart); profileRx = (Uint32)(profileRxStop - profileRxStart); printf("data buffer[%d] TX throughput is %f Mbps\n",i, TEST_ACNT*TEST_BCNT*8*1000/(float)profileTx); printf("data buffer[%d] RX throughput is %f Mbps\n",i, TEST_ACNT*TEST_BCNT*8*1000/(float)profileRx); printf("\n"); } //Close EDMA channels/module */ Close_Edma(); printf("end of test\n"); }
Harikrishna,
My best guess would be that you are not using the correct EDMA channels for the SPI (the example uses CSL_EDMA3_CHA_2 & CSL_EDMA3_CHA_3 which correspond to the SPIEXT and SPIREVT channels for TPCC_1 in the 6670), since you only have a TPCC_2, you'll have to use the CSL_TPCC2_SPIXEVT and CSL_TPCC2_SPIREVT defines instead.
Also, if you have any other specific questions on the example, you should reply directly to that thread to ask the question, as I'm not sure if Steven (who wrote the example and I'm sure understands it much better than me) is subscribed to this thread, where I'm sure he is to the other one.
Erick
Hi
I am working back on SPI EDMA. I got a version from previous postings and is working in LITTLE ENDIAN Mode but does not work in BIG ENDIAN Mode.
In Big Endian Mode it gets struck in
void Setup_SPI (void)
{
.......
while(!(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFLG & 0x00000200));
while(!(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIFLG & 0x00000100)); <-------------------------- HERE IT GETS STRUCK.....
}
The code is here:
Appreciate your help and guidance.
Regards,
Hari
Hari,
Please replace the following statement and see it works.
1. paramSetup.dstAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIDAT0);
>> Replace with
#ifdef _BIG_ENDIAN
paramSetup.dstAddr = ((Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIDAT0)) + (4-TEST_ACNT);
#else
paramSetup.dstAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIDAT0);
#endif
2. paramSetup.srcAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIBUF);
>> Replace with
#ifdef _BIG_ENDIAN
paramSetup.srcAddr = ((Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIBUF)) + (4 -TEST_ACNT);
#else
paramSetup.srcAddr = (Uint32)&(((CSL_SpiRegsOvly) CSL_SPI_REGS)->SPIBUF);
#endif
with regards,
sam