Hello,
I have BIOSPSP 3.00.01.00 with CCS v5.2.1.000018 and SYS/BIOS 6.33.06.46 on TMS320C6748 DSP, I was using SPI0 ands SPI1 through BIOS PSP driver which works fine, but I have a problem with CS not being raised quickly enough. I'm using Spi_Mode_DMAINTERRUPT as you can see below. As I understand the spiIntrHandler is responsible with toggling high the CS line but it doesn't seem to be called, please see below how I have initialized the driver.
Sys/BIOS app.cfg file contains:
var dev2Params = new DEV.Params();
dev2Params.instance.name = "devSpi_0";
dev2Params.initFxn = "&userSpi0Init";
dev2Params.deviceParams = "&g_spi0Params";
dev2Params.devid = 0;
Program.global.devSpi_0 = DEV.create("/spi0", "&Spi_IOMFXNS", dev2Params);
Main.c code:
GIO_Handle m_spiHandle=NULL;
Spi_Params g_spi0Params;
void userSpi0Init()
{
g_spi0Params = Spi_PARAMS;
g_spi0Params.hwiNumber = 9;
g_spi0Params.spiHWCfgData.intrLevel = FALSE;
g_spi0Params.opMode = Spi_OpMode_DMAINTERRUPT;
g_spi0Params.outputClkFreq = 10000000;
g_spi0Params.loopbackEnabled = FALSE;
g_spi0Params.edmaHandle = NULL;
g_spi0Params.spiHWCfgData.masterOrSlave = Spi_CommMode_MASTER;
g_spi0Params.spiHWCfgData.pinOpModes = Spi_PinOpMode_SPISCS_4PIN;
g_spi0Params.spiHWCfgData.configDatafmt[0].charLength = 8;
g_spi0Params.spiHWCfgData.configDatafmt[1].charLength = 16;
g_spi0Params.spiHWCfgData.configDatafmt[0].clkHigh = TRUE ;
g_spi0Params.spiHWCfgData.configDatafmt[0].lsbFirst = FALSE;
g_spi0Params.spiHWCfgData.configDatafmt[0].oddParity = FALSE;
g_spi0Params.spiHWCfgData.configDatafmt[0].parityEnable = FALSE ;
g_spi0Params.spiHWCfgData.configDatafmt[0].phaseIn = FALSE ;
g_spi0Params.spiHWCfgData.configDatafmt[0].waitEnable = FALSE;
//g_spiParams.spiHWCfgData.configDatafmt[0].wdelay = 0;
g_spi0Params.spiHWCfgData.csDefault = 0xff;
g_spi0Params.spiHWCfgData.intrLevel = TRUE;
EDMA3_DRV_Result edmaResult = 0;
Error_Block eb;
Spi_ChanParams chanParams;
GIO_Params ioParams;
Error_init(&eb);
/*
* Initialize channel attributes.
*/
GIO_Params_init(&ioParams);
/* initialize the stream attributes */
chanParams.hEdma = edma3init(0, &edmaResult);
ioParams.chanParams = &chanParams;
//g_spi0Params.edmaHandle = chanParams.hEdma;
/* create SPI channel for transmission */
m_spiHandle = GIO_create("/spi0", GIO_INOUT, &ioParams, &eb);
if (NULL == m_spiHandle)
{
return 0;
}
}
int Transfer(uint8_t cs, uint8_t *pWriteBuffer, uint8_t *pReadBuffer, uint16_t bufferLength)
{
Spi_DataParam dataparam;
SizeT size = 0;
Error_Block eb;
Error_init(&eb);
/* clear the spi params data structure */
memset(&dataparam, 0x00, sizeof(Spi_DataParam));
dataparam.chipSelect = 1 << cs;
dataparam.bufLen = bufferLength;
dataparam.inBuffer = pReadBuffer;
dataparam.outBuffer = pWriteBuffer;
dataparam.flags = Spi_CSHOLD;
dataparam.dataFormat = Spi_DataFormat_0;
size = dataparam.bufLen;
/* write command to FLASH */
int32_t error = GIO_submit(m_spiHandle, IOM_WRITE, &dataparam, &size, NULL);
if ((error != 0) && (size != 0))
{
System_printf("SPI0 Write: Data Write Failed: %d\n", error);
return 0;
}
return size;
}
Does it matter which hwiNumber needs to be selected? My event combiner is using 8, 9, 10, 11 interrupts. Does it matter if intrLevel is true or false? According to Spi example, edmaHandle is NULL in driver initialization, is it changed to edma3init result when channel is created?
Most important question, hope someone can answer, is it normal that spiIntrHandler is not called in Spi.c?
Thank you in advance,
David.