Hello,
I'm trying to get the SPI1 interrupt going via a SYS/BIOS Hwi running on the C6746 core of the OMAP L138. I can do SPI writes and reads fine, but when I configure the Hwi (statically via SYS/BIOS config) it only fires once and then never again even though in the debugger I can see that the interrupt has occurred again looking at the INTC of the DSP. I'm not sure if my callback function does the necessary things to clear the interrupt (the documentation on this seem extraordinarily scant).
My task function:
void taskFxn(UArg a0, UArg a1) { uint16_t data; spiWrite(SPI1_A_BASE,0x1234); while(1) { Semaphore_pend(semaphore0,BIOS_WAIT_FOREVER); if (spiGetIntStatusTxBufferEmpty(SPI1_A_BASE)) { spiWrite(SPI1_A_BASE,0xAAAA); spiClearTxBufferEmptyFlag(SPI1_A_BASE); } if (spiGetIntStatusRxBufferFull(SPI1_A_BASE)) { data = spiRead(SPI1_A_BASE); spiClearRxBufferFullFlag(SPI1_A_BASE); } } }
My callback function:
extern Semaphore_Handle semaphore0;
void HwiCallbackSpi1(UArg a0)
{
Hwi_clearInterrupt(5);
Semaphore_post(semaphore0);
}
My SYS/BIOS config:
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var Swi = xdc.useModule('ti.sysbios.knl.Swi');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
var HeapMultiBuf = xdc.useModule('ti.sysbios.heaps.HeapMultiBuf');
var Timer = xdc.useModule('ti.sysbios.hal.Timer');
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
var Cache = xdc.useModule('ti.sysbios.hal.Cache');
var Event = xdc.useModule('ti.sysbios.knl.Event');
var Mailbox = xdc.useModule('ti.sysbios.knl.Mailbox');
var Memory = xdc.useModule('xdc.runtime.Memory');
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
/*
* Uncomment this line to globally disable Asserts.
* All modules inherit the default from the 'Defaults' module. You
* can override these defaults on a per-module basis using Module.common$.
* Disabling Asserts will save code space and improve runtime performance.
Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF;
*/
/*
* Uncomment this line to keep module names from being loaded on the target.
* The module name strings are placed in the .const section. Setting this
* parameter to false will save space in the .const section. Error and
* Assert messages will contain an "unknown module" prefix instead
* of the actual module name.
Defaults.common$.namedModule = false;
*/
/*
* Minimize exit handler array in System. The System module includes
* an array of functions that are registered with System_atexit() to be
* called by System_exit().
*/
System.maxAtexitHandlers = 4;
/*
* Uncomment this line to disable the Error print function.
* We lose error information when this is disabled since the errors are
* not printed. Disabling the raiseHook will save some code space if
* your app is not using System_printf() since the Error_print() function
* calls System_printf().
Error.raiseHook = null;
*/
/*
* Uncomment this line to keep Error, Assert, and Log strings from being
* loaded on the target. These strings are placed in the .const section.
* Setting this parameter to false will save space in the .const section.
* Error, Assert and Log message will print raw ids and args instead of
* a formatted message.
Text.isLoaded = false;
*/
/*
* Uncomment this line to disable the output of characters by SysMin
* when the program exits. SysMin writes characters to a circular buffer.
* This buffer can be viewed using the SysMin Output view in ROV.
SysMin.flushAtExit = false;
*/
/*
* The BIOS module will create the default heap for the system.
* Specify the size of this default heap.
*/
BIOS.heapSize = 0x1000;
/*
* Build a custom SYS/BIOS library from sources.
*/
BIOS.libType = BIOS.LibType_Custom;
/* System stack size (used by ISRs and Swis) */
Program.stack = 0x2000;
/* Circular buffer size for System_printf() */
SysMin.bufSize = 0x200;
/*
* Create and install logger for the whole system
*/
var loggerBufParams = new LoggerBuf.Params();
loggerBufParams.numEntries = 16;
var logger0 = LoggerBuf.create(loggerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.ALWAYS_ON;
System.SupportProxy = SysMin;
Semaphore.supportsEvents = true;
var hwi0Params = new Hwi.Params();
hwi0Params.instance.name = "hwi0";
hwi0Params.eventId = 43;
Program.global.hwi0 = Hwi.create(5, "&HwiCallbackSpi1", hwi0Params);
var semaphore0Params = new Semaphore.Params();
semaphore0Params.instance.name = "semaphore0";
semaphore0Params.mode = Semaphore.Mode_BINARY;
Program.global.semaphore0 = Semaphore.create(null, semaphore0Params);
Thanks