Other Parts Discussed in Thread: CC1352R,
Hello,
I am trying to have an SPI communication setup between MSP430FR5994 (Master) and CC1352R (Slave). I am trying to replicate the SPI example given in the TI Resource explorer/TI Drivers of CC1352R. The CC1352R master and slave example works for me on two CC1352R boards. Now, I want to replace the CC1352R master with the MSP430FR5994 master. And I think I have some configuration issues, I suspect halHwi1Params.arg = 3. My application stuck when the SPI_transfer is in progress.
Compiler version - 16.9.11.LTS
TI-RTOS version - 2.20.0.06
XDCTools version - 3.32.0.06_core
My configuration -
var halHwi0Params = new halHwi.Params(); halHwi0Params.arg = 0; halHwi0Params.instance.name = "halHwi0"; halHwi0Params.priority = 1; Program.global.halHwi0 = halHwi.create(48, "&UARTEUSCIA_hwiIntFxn", halHwi0Params); var halHwi1Params = new halHwi.Params(); halHwi1Params.instance.name = "halHwi1"; halHwi1Params.arg = 3; halHwi1Params.priority = 3; Program.global.halHwi1 = halHwi.create(24, "&MSP_EXP430FR5994_isrDMA", halHwi1Params); var halHwi2Params = new halHwi.Params(); halHwi2Params.arg = 4; halHwi2Params.priority = 5; Program.global.halHwi2 = halHwi.create(32, "&GPIO_hwiIntFxn", halHwi2Params);
And in msp430fr5994.c, MSP_EXP430FR5994_isrDMA looks like this
/* * =============================== DMA =============================== */ /* * ======== MSP_EXP430FR5994_isrDMA ======== * This is a application defined DMA ISR. This ISR must map and call the * appropriate Driver_event(handle) API to indicate completed DMA transfers. */ Void MSP_EXP430FR5994_isrDMA(UArg arg) { /* Call the SPI DMA function, passing the SPI handle used for WiFi */ SPI_serviceISR((SPI_Handle) &(SPI_config[0])); }
My SPI master tasks looks like this:
void spiMasterFxn(UArg arg0, UArg arg1) { uint32_t i; bool transferOK; char uartStr[10]; /* Configure spi master and slave ready gpio pins */ GPIO_setConfig(CONFIG_SPI_MASTER_READY, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW); GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_INPUT); /* Set master ready pin */ GPIO_write(CONFIG_SPI_MASTER_READY, 1); UART_write(uart, "CONFIG_SPI_MASTER_READY\n", sizeof("CONFIG_SPI_MASTER_READY\n")); /* Wait for slave to be ready */ while (GPIO_read(CONFIG_SPI_SLAVE_READY) == 0) {} UART_write(uart, "handshake complete! \n", sizeof("handshake complete! \n")); /* Handshake complete; now configure interrupt on CONFIG_SPI_SLAVE_READY */ GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING); GPIO_setCallback(CONFIG_SPI_SLAVE_READY, slaveReadyFxn); GPIO_enableInt(CONFIG_SPI_SLAVE_READY); UART_write(uart, "configure interrupt on slave\n", sizeof("configure interrupt on slave\n")); /* Create a semaphore; the master will wait on this semaphore * until the slave is ready. */ Semaphore_Params params; Error_Block eb; /* Init params */ Semaphore_Params_init(¶ms); Error_init(&eb); /* Create semaphore instance */ masterSem = Semaphore_create(0, ¶ms, &eb); if(masterSem == NULL) { System_printf("Semaphore creation failed"); System_flush(); } /* Open SPI as master */ SPI_Params_init(&spiParams); spiParams.frameFormat = SPI_POL0_PHA1; spiParams.mode = SPI_MASTER; spiParams.bitRate = 1000000; masterSpi = SPI_open(Board_SPI0, &spiParams); if (masterSpi == NULL) { UART_write(uart, "Error initializing master SPI\n", sizeof("Error initializing master SPI\n")); while (1); } else { UART_write(uart, "Master SPI initialized\n", sizeof("Master SPI initialized\n")); } /* * Master has opened CONFIG_SPI_MASTER; set CONFIG_SPI_MASTER_READY low to * inform the slave. */ GPIO_write(CONFIG_SPI_MASTER_READY, 0); /* Copy message to transmit buffer */ strncpy((char *) masterTxBuffer, MASTER_MSG, SPI_MSG_LENGTH); for (i = 0; i < MAX_LOOP; i++) { /* * Wait until slave is ready for transfer; slave will pull * CONFIG_SPI_SLAVE_READY low. */ UART_write(uart, "Waiting for master_sem\n", sizeof("Waiting for master_sem\n")); Semaphore_pend(masterSem, BIOS_WAIT_FOREVER); UART_write(uart, "Create transaction\n", sizeof("Create transaction\n")); /* Initialize master SPI transaction structure */ masterTxBuffer[sizeof(MASTER_MSG) - 1] = (i % 10) + '0'; memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH); transaction.count = SPI_MSG_LENGTH; transaction.txBuf = (void *) masterTxBuffer; transaction.rxBuf = (void *) masterRxBuffer; /* Toggle user LED, indicating a SPI transfer is in progress */ UART_write(uart, "Transfer in progress\n", sizeof("Transfer in progress\n")); GPIO_toggle(Board_LED1); /* Perform SPI transfer */ transferOK = SPI_transfer(masterSpi, &transaction); sprintf(uartStr, "%d", transferOK ); UART_write(uart, "transfer ok = ", sizeof("transfer ok = ")); UART_write(uart, uartStr, sizeof(uartStr)); if (transferOK) { UART_write(uart, "\nMaster received\n", sizeof("Master received\n")); } else { UART_write(uart, "\nUnsuccessful Master received\n", sizeof("Unsuccessful Master received\n")); } /* Sleep for a bit before starting the next SPI transfer */ Task_sleep(100); } SPI_close(masterSpi); /* Example complete - set pins to a known state */ GPIO_disableInt(CONFIG_SPI_SLAVE_READY); GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW); GPIO_write(CONFIG_SPI_MASTER_READY, 0); UART_write(uart, "Done!\n", sizeof("Done!\n")); }
Let me know if you need more information. Thanks.