SSP0 interrupt stuck , lpc1766

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SSP0 interrupt stuck , lpc1766

1,127 Views
adriancojocari
Contributor II

Hi everyone, i`m trying to send some data in ssp0 interrupt handler to my lcd , but as the interrupt activates , it won`t get out of it , here I have my code :

/*

* ssp_init.c

*

*  Created on: Jul 25, 2016

*      Author: student

*/

#include "chip.h"

#include "ssp.h"

#include "lcd.h"

#include "audio.h"

#include "arm_math.h"

#include "fft.h"

//uint16_t data;

float32_t outArray[64];

// DEMO VERSION

void ssp_init(LPC_SSP_T *pSSP) {

  // Assign GPIO to SSP0 - SCK, MOSI, MISO

  Chip_GPIO_Init(LPC_GPIO);

  Chip_IOCON_PinMuxSet(LPC_IOCON, 3, 25, IOCON_FUNC0); //LCD_RES

  Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 21, IOCON_FUNC0); //SSEL0

  Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 20, IOCON_FUNC3); //SCK

  Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 23, IOCON_FUNC3); //MISO

  Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 24, IOCON_FUNC3); //MOSI

  //

  Chip_GPIO_SetPinDIR(LPC_GPIO, 3, 25, true);

  Chip_GPIO_SetPinDIR(LPC_GPIO, 1, 21, true);

  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SSP0);

  Chip_SSP_Disable(pSSP);

  Chip_SSP_Set_Mode(pSSP, SSP_MODE_MASTER);

  Chip_SSP_SetFormat(pSSP, SSP_BITS_9, SSP_FRAMEFORMAT_SPI,

  SSP_CLOCK_CPHA0_CPOL0);

  Chip_SSP_SetBitRate(pSSP, 5000000);

  Chip_SSP_Int_Enable(LPC_SSP0);

  Chip_SSP_Enable(pSSP);

  Chip_SSP_ClearIntPending(LPC_SSP0,SSP_RTIC);

  NVIC_SetPriority(SSP0_IRQn, 29);

  NVIC_EnableIRQ(SSP0_IRQn);

}

void SSP0_IRQHandler(void) {

getArray(outArray);

}

Thanks !!!

0 Kudos
1 Reply

528 Views
soledad
NXP Employee
NXP Employee

Hello Adrian,

Please check the below code and use it as reference, this code describes how to use SSP in POLLING, INTERRUPT or DMA mode.


Have a great day,
Sol

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

/*
 * @brief SSP example
 * This example show how to use the SSP in 3 modes : Polling, Interrupt and DMA
 *
 * @note
 * Copyright(C) NXP Semiconductors, 2014
 * All rights reserved.
 *
 * @par
 * Software that is described herein is for illustrative purposes only
 * which provides customers with programming information regarding the
 * LPC products.  This software is supplied "AS IS" without any warranties of
 * any kind, and NXP Semiconductors and its licensor disclaim any and
 * all warranties, express or implied, including all implied warranties of
 * merchantability, fitness for a particular purpose and non-infringement of
 * intellectual property rights.  NXP Semiconductors assumes no responsibility
 * or liability for the use of the software, conveys no license or rights under any
 * patent, copyright, mask work right, or any other intellectual property rights in
 * or to any products. NXP Semiconductors reserves the right to make changes
 * in the software without notification. NXP Semiconductors also makes no
 * representation or warranty that such application will be suitable for the
 * specified use without further testing or modification.
 *
 * @par
 * Permission to use, copy, modify, and distribute this software and its
 * documentation is hereby granted, under NXP Semiconductors' and its
 * licensor's relevant copyrights in the software, without fee, provided that it
 * is used in conjunction with NXP Semiconductors microcontrollers.  This
 * copyright, permission, and disclaimer notice must appear in all copies of
 * this code.
 */

#include "board.h"
#include "stdio.h"

/*****************************************************************************
 * Private types/enumerations/variables
 ****************************************************************************/

// FIXME: SSP0 not working on LPCXpresso LPC1769.  There seems to be some sort
//        of contention on the MISO signal.  The contention originates on the
//          LPCXpresso side of the signal.
//
#define LPC_SSP           LPC_SSP1
#define SSP_IRQ           SSP1_IRQn
#define LPC_GPDMA_SSP_TX  GPDMA_CONN_SSP1_Tx
#define LPC_GPDMA_SSP_RX  GPDMA_CONN_SSP1_Rx
#define SSPIRQHANDLER     SSP1_IRQHandler

#define BUFFER_SIZE                         (0x100)
#define SSP_DATA_BITS                       (SSP_BITS_8)
#define SSP_DATA_BIT_NUM(databits)          (databits + 1)
#define SSP_DATA_BYTES(databits)            (((databits) > SSP_BITS_8) ? 2 : 1)
#define SSP_LO_BYTE_MSK(databits)           ((SSP_DATA_BYTES(databits) > 1) ? 0xFF : (0xFF >> \
                                                                                      (8 - SSP_DATA_BIT_NUM(databits))))
#define SSP_HI_BYTE_MSK(databits)           ((SSP_DATA_BYTES(databits) > 1) ? (0xFF >> \
                                                                               (16 - SSP_DATA_BIT_NUM(databits))) : 0)

#define SSP_MODE_SEL                        (0x31)
#define SSP_TRANSFER_MODE_SEL               (0x32)
#define SSP_MASTER_MODE_SEL                 (0x31)
#define SSP_SLAVE_MODE_SEL                  (0x32)
#define SSP_POLLING_SEL                     (0x31)
#define SSP_INTERRUPT_SEL                   (0x32)
#define SSP_DMA_SEL                         (0x33)

/* Tx buffer */
static uint8_t Tx_Buf[BUFFER_SIZE];

/* Rx buffer */
static uint8_t Rx_Buf[BUFFER_SIZE];

static SSP_ConfigFormat ssp_format;
static Chip_SSP_DATA_SETUP_T xf_setup;
static volatile uint8_t  isXferCompleted = 0;
static uint8_t dmaChSSPTx, dmaChSSPRx;
static volatile uint8_t isDmaTxfCompleted = 0;
static volatile uint8_t isDmaRxfCompleted = 0;

#if defined(DEBUG_ENABLE)
static char sspWaitingMenu[] = "SSP Polling: waiting for transfer ...\n\r";
static char sspIntWaitingMenu[]  = "SSP Interrupt: waiting for transfer ...\n\r";
static char sspDMAWaitingMenu[]  = "SSP DMA: waiting for transfer ...\n\r";

static char sspPassedMenu[] = "SSP: Transfer PASSED\n\r";
static char sspFailedMenu[] = "SSP: Transfer FAILED\n\r";

static char sspTransferModeSel[] = "\n\rPress 1-3 or 'q' to quit\n\r"
                                   "\t 1: SSP Polling Read Write\n\r"
                                   "\t 2: SSP Int Read Write\n\r"
                                   "\t 3: SSP DMA Read Write\n\r";

static char helloMenu[] = "Hello NXP Semiconductors \n\r";
static char sspMenu[] = "SSP demo \n\r";
static char sspMainMenu[] = "\t 1: Select SSP Mode (Master/Slave)\n\r"
                            "\t 2: Select Transfer Mode\n\r";
static char sspSelectModeMenu[] = "\n\rPress 1-2 to select or 'q' to quit:\n\r"
                                  "\t 1: Master \n\r"
                                  "\t 2: Slave\n\r";
#endif /* defined(DEBUG_ENABLE) */

/*****************************************************************************
 * Public types/enumerations/variables
 ****************************************************************************/

/*****************************************************************************
 * Private functions
 ****************************************************************************/

/* Initialize buffer */
static void Buffer_Init(void)
{
    uint16_t i;
    uint8_t ch = 0;

    for (i = 0; i < BUFFER_SIZE; i++) {
        Tx_Buf[i] = ch++;
        Rx_Buf[i] = 0xAA;
    }
}

/* Verify buffer after transfer */
static uint8_t Buffer_Verify(void)
{
    uint16_t i;
    uint8_t *src_addr = (uint8_t *) &Tx_Buf[0];
    uint8_t *dest_addr = (uint8_t *) &Rx_Buf[0];

    for ( i = 0; i < BUFFER_SIZE; i++ ) {

        if (((*src_addr) & SSP_LO_BYTE_MSK(ssp_format.bits)) !=
            ((*dest_addr) & SSP_LO_BYTE_MSK(ssp_format.bits))) {
            return 1;
        }
        src_addr++;
        dest_addr++;

        if (SSP_DATA_BYTES(ssp_format.bits) == 2) {
            if (((*src_addr) & SSP_HI_BYTE_MSK(ssp_format.bits)) !=
                ((*dest_addr) & SSP_HI_BYTE_MSK(ssp_format.bits))) {
                return 1;
            }
            src_addr++;
            dest_addr++;
            i++;
        }
    }
    return 0;
}

/* Select the Transfer mode : Polling, Interrupt or DMA */
static void appSSPTest(void)
{
    int key;

    DEBUGOUT(sspTransferModeSel);

    dmaChSSPTx = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, LPC_GPDMA_SSP_TX);
    dmaChSSPRx = Chip_GPDMA_GetFreeChannel(LPC_GPDMA, LPC_GPDMA_SSP_RX);

    xf_setup.length = BUFFER_SIZE;
    xf_setup.tx_data = Tx_Buf;
    xf_setup.rx_data = Rx_Buf;

    while (1) {
        key = 0xFF;
        do {
            key = DEBUGIN();
        } while ((key & 0xFF) == 0xFF);

        Buffer_Init();

        switch (key) {
        case SSP_POLLING_SEL:    /* SSP Polling Read Write Mode */
            DEBUGOUT(sspWaitingMenu);
            xf_setup.rx_cnt = xf_setup.tx_cnt = 0;

            Chip_SSP_RWFrames_Blocking(LPC_SSP, &xf_setup);

            if (Buffer_Verify() == 0) {
                DEBUGOUT(sspPassedMenu);
            }
            else {
                DEBUGOUT(sspFailedMenu);
            }
            break;

        case SSP_INTERRUPT_SEL:
            DEBUGOUT(sspIntWaitingMenu);

            isXferCompleted = 0;
            xf_setup.rx_cnt = xf_setup.tx_cnt = 0;

            Chip_SSP_Int_FlushData(LPC_SSP);/* flush dummy data from SSP FiFO */
            if (SSP_DATA_BYTES(ssp_format.bits) == 1) {
                Chip_SSP_Int_RWFrames8Bits(LPC_SSP, &xf_setup);
            }
            else {
                Chip_SSP_Int_RWFrames16Bits(LPC_SSP, &xf_setup);
            }

            Chip_SSP_Int_Enable(LPC_SSP);    /* enable interrupt */
            while (!isXferCompleted) {}

            if (Buffer_Verify() == 0) {
                DEBUGOUT(sspPassedMenu);
            }
            else {
                DEBUGOUT(sspFailedMenu);
            }
            break;

        case SSP_DMA_SEL:    /* SSP DMA Read and Write: fixed on 8bits */
            DEBUGOUT(sspDMAWaitingMenu);
            isDmaTxfCompleted = isDmaRxfCompleted = 0;
            Chip_SSP_DMA_Enable(LPC_SSP);
            /* data Tx_Buf --> SSP */
            Chip_GPDMA_Transfer(LPC_GPDMA, dmaChSSPTx,
                              (uint32_t) &Tx_Buf[0],
                              LPC_GPDMA_SSP_TX,
                              GPDMA_TRANSFERTYPE_M2P_CONTROLLER_DMA,
                              BUFFER_SIZE);
            /* data SSP --> Rx_Buf */
            Chip_GPDMA_Transfer(LPC_GPDMA, dmaChSSPRx,
                              LPC_GPDMA_SSP_RX,
                              (uint32_t) &Rx_Buf[0],
                              GPDMA_TRANSFERTYPE_P2M_CONTROLLER_DMA,
                              BUFFER_SIZE);

            while (!isDmaTxfCompleted || !isDmaRxfCompleted) {}
            if (Buffer_Verify() == 0) {
                DEBUGOUT(sspPassedMenu);
            }
            else {
                DEBUGOUT(sspFailedMenu);
            }
            Chip_SSP_DMA_Disable(LPC_SSP);
            break;

        case 'q':
        case 'Q':
            Chip_GPDMA_Stop(LPC_GPDMA, dmaChSSPTx);
            Chip_GPDMA_Stop(LPC_GPDMA, dmaChSSPRx);
            return;

        default:
            break;
        }

        DEBUGOUT(sspTransferModeSel);
    }

}

/* Select the SSP mode : Master or Slave */
static void appSSPSelectModeMenu(void)
{
    int key;

    DEBUGOUT(sspSelectModeMenu);

    while (1) {
        key = 0xFF;
        do {
            key = DEBUGIN();
        } while ((key & 0xFF) == 0xFF);

        switch (key) {
        case SSP_MASTER_MODE_SEL:    /* Master */
            Chip_SSP_SetMaster(LPC_SSP, 1);
            DEBUGOUT("Master Mode\n\r");
            return;

        case SSP_SLAVE_MODE_SEL:    /* Slave */
            Chip_SSP_SetMaster(LPC_SSP, 0);
            DEBUGOUT("Slave Mode\n\r");
            return;

        case 'q':
            return;

        default:
            break;
        }
        DEBUGOUT(sspSelectModeMenu);
    }

}

/* The main menu of the example. Allow user select the SSP mode (master or slave) and Transfer
   mode (Polling, Interrupt or DMA) */
static void appSSPMainMenu(void)
{
    int key;

    DEBUGOUT(helloMenu);
    DEBUGOUT(sspMenu);
    DEBUGOUT(sspMainMenu);

    while (1) {
        key = 0xFF;
        do {
            key = DEBUGIN();
        } while ((key & 0xFF) == 0xFF);

        switch (key) {
        case SSP_MODE_SEL:    /* Select SSP Mode */
            appSSPSelectModeMenu();
            break;

        case SSP_TRANSFER_MODE_SEL:    /* Select Transfer Mode */
            appSSPTest();
            break;

        default:
            break;
        }
        DEBUGOUT(sspMainMenu);
    }
}

/*****************************************************************************
 * Public functions
 ****************************************************************************/

/**
 * @brief    SSP interrupt handler sub-routine
 * @return    Nothing
 */
void SSPIRQHANDLER(void)
{
    Chip_SSP_Int_Disable(LPC_SSP);    /* Disable all interrupt */
    if (SSP_DATA_BYTES(ssp_format.bits) == 1) {
        Chip_SSP_Int_RWFrames8Bits(LPC_SSP, &xf_setup);
    }
    else {
        Chip_SSP_Int_RWFrames16Bits(LPC_SSP, &xf_setup);
    }

    if ((xf_setup.rx_cnt != xf_setup.length) || (xf_setup.tx_cnt != xf_setup.length)) {
        Chip_SSP_Int_Enable(LPC_SSP);    /* enable all interrupts */
    }
    else {
        isXferCompleted = 1;
    }
}

/**
 * @brief    DMA interrupt handler sub-routine. Set the waiting flag when transfer is successful
 * @return    Nothing
 */
void DMA_IRQHandler(void)
{
    if (Chip_GPDMA_Interrupt(LPC_GPDMA, dmaChSSPTx) == SUCCESS) {
        isDmaTxfCompleted = 1;
    }

    if (Chip_GPDMA_Interrupt(LPC_GPDMA, dmaChSSPRx) == SUCCESS) {
        isDmaRxfCompleted = 1;
    }
}

/**
 * @brief    Main routine for SSP example
 * @return    Nothing
 */
int main(void)
{
    SystemCoreClockUpdate();
    Board_Init();

    /* SSP initialization */
    Board_SSP_Init(LPC_SSP);

    Chip_SSP_Init(LPC_SSP);

    ssp_format.frameFormat = SSP_FRAMEFORMAT_SPI;
    ssp_format.bits = SSP_DATA_BITS;
    ssp_format.clockMode = SSP_CLOCK_MODE0;
    Chip_SSP_SetFormat(LPC_SSP, ssp_format.bits, ssp_format.frameFormat, ssp_format.clockMode);

    Chip_SSP_Enable(LPC_SSP);

    /* Initialize GPDMA controller */
    Chip_GPDMA_Init(LPC_GPDMA);

    /* Setting GPDMA interrupt */
    NVIC_DisableIRQ(DMA_IRQn);
    NVIC_SetPriority(DMA_IRQn, ((0x01 << 3) | 0x01));
    NVIC_EnableIRQ(DMA_IRQn);

    /* Setting SSP interrupt */
    NVIC_EnableIRQ(SSP_IRQ);

    appSSPMainMenu();

    /* DeInitialize SSP peripheral */
    Chip_SSP_DeInit(LPC_SSP);

    return 0;
}

/**
 * @}
 */

0 Kudos