TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2650打开SPI 的时候,程序直接返回NULL,在选择片选管脚的时候报错

SPI_Handle ***(SPI_Handle handle, SPI_Params *params)
{
/* Use union to save on stack allocation */
union {
Semaphore_Params semParams;
Hwi_Params hwiParams;
Swi_Params swiParams;
} paramsUnion;
*** *object;
*** const *hwAttrs;
unsigned int key;

/* Get the pointer to the object and hwAttrs */
object = handle->object;
hwAttrs = handle->hwAttrs;

/* Disable preemption while checking if the SPI is open. */
key = Hwi_disable();

/* Check if the SPI is open already with the base addr. */
if (object->isOpen == true) {
Hwi_restore(key);

Log_warning1("SPI:(%p) already in use.", hwAttrs->baseAddr);

return (NULL);
}

/* Mark the handle as being used */
object->isOpen = true;
Hwi_restore(key);

Assert_isTrue((params->dataSize >= 4) &&
(params->dataSize <= 16), NULL);

/* Initialize the SPI object */
object->currentTransaction = NULL;
object->bitRate = params->bitRate;
object->dataSize = params->dataSize;
object->frameFormat = params->frameFormat;
object->mode = params->mode;
object->transferMode = params->transferMode;
object->transferTimeout = params->transferTimeout;
object->returnPartial = false;
#ifdef ***
object->wakeupCallbackFxn = NULL;
#endif

/* Determine if we need to use an 8-bit or 16-bit framesize for the DMA */
object->frameSize = (params->dataSize < 9) ? *** : ***;

Log_print2(Diags_USER2,"SPI:(%p) DMA buffer incrementation size: %s",
hwAttrs->baseAddr,
(object->frameSize) ? (UArg)"16-bit" : (UArg)"8-bit");

/* Register power dependency – i.e. power up and enable clock for SPI. */
Power_setDependency(hwAttrs->powerMngrId);

/* Configure the hardware module */
***(handle);

/* CSN is initialized using hwAttrs initially, but can be re-configured later */
object->csnPin = hwAttrs->csnPin;

/* Configure IOs after hardware has been initialized so that IOs aren't */
/* toggled unnecessary and make sure it was successful */
if (!***(handle)) {
/* Trying to use SPI driver when some other driver or application
* has already allocated these pins, error! */
Log_warning0("Could not allocate SPI pins, already in use.");

/* Release power dependency – i.e. potentially power down serial domain. */
Power_releaseDependency(hwAttrs->powerMngrId);

/* Mark the module as available */
key = Hwi_disable();
object->isOpen = false;
Hwi_restore(key);

/* Signal back to application that SPI driver was not succesfully opened */
return (NULL);
}

红色判断不通过, 返回NULL  不明白什么鬼 

用到了两个SPI接口

user1388075:

static bool ***(SPI_Handle handle) { *** *object; *** const *hwAttrs; PIN_Config spiPinTable[5]; uint32_t i = 0;

/* Get the pointer to the object and hwAttrs */ object = handle->object; hwAttrs = handle->hwAttrs;

/* Configure IOs */ /* Build local list of pins, allocate through PIN driver and map HW ports */ if (object->mode == SPI_SLAVE) { /* Configure IOs for slave mode */ spiPinTable[i++] = hwAttrs->mosiPin | PIN_INPUT_EN; spiPinTable[i++] = hwAttrs->misoPin | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_INPUT_DIS | PIN_DRVSTR_MED; spiPinTable[i++] = hwAttrs->clkPin | PIN_INPUT_EN; spiPinTable[i++] = object->csnPin | PIN_INPUT_EN | PIN_PULLUP; } else { /* Configure IOs for master mode */ spiPinTable[i++] = hwAttrs->mosiPin | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_INPUT_DIS | PIN_DRVSTR_MED; spiPinTable[i++] = hwAttrs->misoPin | PIN_INPUT_EN | PIN_PULLDOWN;

/* Output low signal on SCLK until SPI module drives signal if clock polarity is configured to '0' */ /* Output high signal on SCLK until SPI module drives signal if clock polarity is configured to '1' */ if (object->frameFormat == SPI_POL0_PHA0 || object->frameFormat == SPI_POL0_PHA1) { spiPinTable[i++] = hwAttrs->clkPin | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_INPUT_DIS | PIN_DRVSTR_MED; } else { spiPinTable[i++] = hwAttrs->clkPin | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_INPUT_DIS | PIN_DRVSTR_MED; }

/* If CSN isn't SW controlled, drive it high until SPI module drives signal to avoid glitches */ if(object->csnPin != PIN_UNASSIGNED) { spiPinTable[i++] = object->csnPin | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_INPUT_DIS | PIN_DRVSTR_MED; } } spiPinTable[i++] = PIN_TERMINATE;

/* Open and assign pins through pin driver */ if (!(object->pinHandle = PIN_open(&(object->pinState), spiPinTable))) { return false; }

/* Set IO muxing for the SPI pins */ if (mode[object->mode] == SSI_MODE_SLAVE) { /* Configure IOs for slave mode */ PINCC26XX_setMux(object->pinHandle, hwAttrs->mosiPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_RX : IOC_PORT_MCU_SSI1_RX)); PINCC26XX_setMux(object->pinHandle, hwAttrs->misoPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_TX : IOC_PORT_MCU_SSI1_TX)); PINCC26XX_setMux(object->pinHandle, hwAttrs->clkPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_CLK : IOC_PORT_MCU_SSI1_CLK)); PINCC26XX_setMux(object->pinHandle, object->csnPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_FSS : IOC_PORT_MCU_SSI1_FSS)); } else { /* Configure IOs for master mode */ PINCC26XX_setMux(object->pinHandle, hwAttrs->mosiPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_TX : IOC_PORT_MCU_SSI1_TX)); PINCC26XX_setMux(object->pinHandle, hwAttrs->misoPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_RX : IOC_PORT_MCU_SSI1_RX)); PINCC26XX_setMux(object->pinHandle, hwAttrs->clkPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_CLK : IOC_PORT_MCU_SSI1_CLK)); if(object->csnPin != PIN_UNASSIGNED) { PINCC26XX_setMux(object->pinHandle, object->csnPin, (hwAttrs->baseAddr == SSI0_BASE ? IOC_PORT_MCU_SSI0_FSS : IOC_PORT_MCU_SSI1_FSS)); } }

return true;}

红色执行错误,返回false

赞(0)
未经允许不得转载:TI中文支持网 » CC2650打开SPI 的时候,程序直接返回NULL,在选择片选管脚的时候报错
分享到: 更多 (0)