This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/MSP432P401R: MSP432 spi communication, clk doesn't work when receiving data

Part Number: MSP432P401R

Tool/software: Code Composer Studio

Hi,

I'm using custom board with MCU as MSP432P401R.

I'm trying to communicate msp432 as a master and enc424j600(ethernet) as a slave with spi connection.

I found out that when spi receiver(MISO) interrupt occurs clk(P1.5) doesn't give any signal.

However when transmitting data(MOSI) I can see clk signal with oscilloscope.

Is there any solution or suggestion why spi reciever or clk don't work? 

Here comes the code!!

/*
 *
 * MSP432 = SPI master, external device = SPI slave
 *
 *                MSP432P401R
 *              -----------------
 *             |                 |
 *             |            P1.4 |-> CS
 *             |                 |
 *             |            P1.6 |-> Data Out (UCB0SIMO)
 *             |                 |
 *             |            P1.7 |<- Data In (UCB0SOMI)
 *             |                 |
 *             |            P1.5 |-> Serial Clock Out (UCB0CLK)
 *******************************************************************************/

const eUSCI_SPI_MasterConfig spiMasterConfig =
{
        EUSCI_B_SPI_CLOCKSOURCE_SMCLK,                  // SMCLK Clock Source
        24000000,                                        
        500000,                                         
        EUSCI_B_SPI_MSB_FIRST,                          
        EUSCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT,
        EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH,      
        EUSCI_B_SPI_3PIN                                
};

int main(void)
{
   int                           Result;
   uint16_t       Result1;
   BTPS_Initialization_t         BTPS_Initialization;
   HCI_DriverInformation_t       HCI_DriverInformation;
   HCI_HCILLConfiguration_t      HCILLConfig;
   HCI_Driver_Reconfigure_Data_t DriverReconfigureData;


   /* Configure the hardware for its intended use.                      */
   HAL_ConfigureHardware();


   /* Flag that sleep is not currently enabled.                         */
   SleepAllowed = FALSE;


   /* Configure the UART Parameters.                                    */
   HCI_DRIVER_SET_COMM_INFORMATION(&HCI_DriverInformation, 1, HAL_HCI_UART_MAX_BAUD_RATE, cpHCILL_RTS_CTS);
   HCI_DriverInformation.DriverInformation.COMMDriverInformation.InitializationDelay = 100;

   /* Set up the application callbacks.                                 */
   BTPS_Initialization.GetTickCountCallback  = HAL_GetTickCount;
   BTPS_Initialization.MessageOutputCallback = HAL_ConsoleWrite;

   /* Initialize the application.                                       */
   if((Result = InitializeApplication(&HCI_DriverInformation, &BTPS_Initialization)) > 0)
   {

      /* Save the Bluetooth Stack ID.                                   */
      BluetoothStackID = (unsigned int)Result;

 
      BTPS_Delay(200);
     

 GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
 GPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P1, GPIO_PIN7 | GPIO_PIN6 | GPIO_PIN5 , GPIO_PRIMARY_MODULE_FUNCTION);

    GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN4);
    GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN4);

 MAP_SPI_initMaster(EUSCI_B0_BASE, &spiMasterConfig);

 MAP_SPI_enableModule(EUSCI_B0_BASE);


 MAP_SPI_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_SPI_RECEIVE_INTERRUPT);
 Interrupt_enableInterrupt(INT_EUSCIB0);

 MAP_Interrupt_disableInterrupt(INT_EUSCIB0);


      MAP_Interrupt_disableInterrupt(INT_EUSCIB0);
      BTPS_Delay(100);
      GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN4);

      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x22);
      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x16);
      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x33);
      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x31);
      GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN4);
      BTPS_Delay(1);
      GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN4);
      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x20);
      //while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
      MAP_SPI_transmitData(EUSCI_B0_BASE, 0x16);

      BTPS_Delay(1);
      while (MAP_GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN7));
      Interrupt_enableInterrupt(INT_EUSCIB0);

      GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN4);
      Display(("%d \r\n",a));

            /* We need to execute Add a function to process the command line  */
      /* to the BTPS Scheduler.                                         */
      if(BTPS_AddFunctionToScheduler(ProcessCharactersTask, NULL, 100))
      {
         /* Add the idle task (which determines if LPM3 may be entered) */
         /* to the scheduler.                                           */
         if(BTPS_AddFunctionToScheduler(IdleTask, NULL, 100))
         {
            if(BTPS_AddFunctionToScheduler(ToggleLEDTask, NULL, 750))
            {
               HAL_SetLEDColor(hlcGreen);

               /* Execute the scheduler, note that this function does   */
               /* not return.                                           */
               BTPS_ExecuteScheduler();
            }
         }
      }
   }

   /* If we've gotten to this point then an error has occurred, set the */
   /* LED to red to signify that there is a problem.                    */
   HAL_SetLEDColor(hlcRed);

   /* Poll the error flags to see if we can determine the reason for the*/
   /* failure.                                                          */
   PollErrorFlags();

   /* Scheduler above should run continuously, if it exits an error     */
   /* occurred.                                                         */

   while(1)
   {
      HAL_ToggleLED();

      BTPS_Delay(100);
   }

}

void EUSCIB0_IRQHandler(void)
{
    //GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
    uint32_t status = SPI_getEnabledInterruptStatus(EUSCI_B0_BASE);
    SPI_clearInterruptFlag(EUSCI_B0_BASE, status);
    if(status & EUSCI_B_SPI_RECEIVE_INTERRUPT)
    {
        /* USCI_B0 TX buffer ready? */
        while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
        RXData = MAP_SPI_receiveData(EUSCI_B0_BASE);
        Display(("RXData = %x\r\n",RXData));
        //BTPS_Delay(10);
        //GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);

    }
}

  • Hello,

      Because you are the master, you will need to provide the clock so the slave can send its data. For example, the following function transmits a dummy 0xFF and then it reads the RX buffer

    int spi_Read(unsigned char *pBuff, int len)
    {
        int i = 0;
    
        ASSERT_CS();
    
        for (i = 0; i < len; i ++)
        {
            while (!(UCB0IFG&UCTXIFG));
            UCB0TXBUF = 0xFF;
            while (!(UCB0IFG&UCRXIFG));
            pBuff[i] = UCB0RXBUF;
        }
    
        DEASSERT_CS();
    
        return len;
    }

    Hopefully this helps.

       David

**Attention** This is a public forum