Other Parts Discussed in Thread: CC2640R2F
您好,

我目前正在使用CC2640R2F和NXP NTM88执行TPMS项目。 DIO8具有双重功能,可用作GPIO线路,从 高到低转换。 之后,我将DIO8初始化为SPI MOSI引脚。 打开SPI调用SPI_open()时出现问题,没有句柄。 我正在使用“spimaster”示例程序作为基础。
BoardGpioInitTable[],位于CC2640R2F_LAUNCXL.c.
const PIN_Config BoardGpioInitTable[] = {
CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially on */
CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
//CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
//CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select LOW disabled */
//CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* NTM88 chip select */
CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */
CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /* UART TX via debugger back channel */
CC2640R2_LAUNCHXL_DIO21 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE | PIN_HYSTERESIS, /* Wake Up pin driven by NTM88 */
CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* Configure MOSI first as output for NTM88 KBI input */
//CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */
CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */
CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */
PIN_TERMINATE
};
NTM88PinTable[]在spimaster.c处
/*
* Application button pin configuration table:
* - Buttons interrupts are configured to trigger on falling edge.
*/
PIN_Config NTM88PinTable[] = {
Board_PIN_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially on */
Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
//Board_NTM88_SPI_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* NTM88 chip select */
//Board_NTM88_SCLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */
Board_NTM88_MOSI | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* Configure MOSI first as output for NTM88 KBI input */
//Board_NTM88_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master MISO */
Board_WAKE_UP | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_POSEDGE | PIN_HYSTERESIS, /* Wake Up pin driven by NTM88 */
PIN_TERMINATE
};
在spimaster.c处的masterThread
/*
* ======== masterThread ========
* Master SPI sends a message to slave while simultaneously receiving a
* message from the slave.
*/
void *masterThread(void *arg0)
{
uint32_t i;
bool transferOK;
int32_t status;
NTM88PinHandle = PIN_open(&NTM88PinState, NTM88PinTable);
if(!NTM88PinHandle)
{
/* Error initializing button pins */
while(1);
}
/* Setup callback for button pins */
if (PIN_registerIntCb(NTM88PinHandle, &slaveReadyFxn) != 0) {
/* Error registering button callback function */
while(1);
}
status = sem_init(&masterSem, 0, 0);
if (status != 0) {
Display_printf(display, 0, 0, "Error creating masterSem\n");
while(1);
}
uint8_t u8xfer_nb_bytes = 0;
for (i = 0; i < MAX_LOOP; i++)
{
PIN_setOutputValue(NTM88PinHandle, Board_NTM88_MOSI, 1);
while(PIN_getInputValue(Board_WAKE_UP) == 0) {} // Wait for NTM88 Slave Ready to be high
PIN_setOutputValue(NTM88PinHandle, Board_NTM88_MOSI, 0); //Set NTM88 KBI pin low
/*
* Wait until slave is ready for transfer; slave will pull
* Board_SPI_SLAVE_READY low.
*/
sem_wait(&masterSem);
PIN_setConfig(NTM88PinHandle, PIN_INPUT_EN, CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN);
SPI_Init(); // not able to SPI_open hang here ! ! !
u8xfer_nb_bytes = u8SpiFillTxBuffer();
/* Initialize master SPI transaction structure */
transaction.count = u8xfer_nb_bytes;
transaction.txBuf = (void *) gau8TxData;
transaction.rxBuf = (void *) gau8RxData;
/* Toggle user LED, indicating a SPI transfer is in progress */
PIN_setOutputValue(NTM88PinHandle, Board_PIN_LED1, !PIN_getOutputValue(Board_PIN_LED1));
/* Perform SPI transfer */
transferOK = SPI_transfer(masterSpi, &transaction);
if (transferOK) {
Display_printf(display, 0, 0, "Master received: ");
}
else {
Display_printf(display, 0, 0, "Unsuccessful master SPI transfer");
}
SPI_close(masterSpi);
PIN_setConfig(NTM88PinHandle, PIN_GPIO_OUTPUT_EN, CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX);
u8SpiStoreData();
}
Display_printf(display, 0, 0, "\nDone");
return (NULL);
}
在下面的代码中,我可以看到使用逻辑分析器DIO8 MOSI从高到低的转换,但在SPI_init()中,代码挂起。

我已确定在 NTM88PinTable[]初始化Board_NTM88_MOSI时挂起的原因。 但问题是,如果我这样评论,我就不能将DIO8 MOSI线路的高电平切换为低电平。
-kel