Part Number: MSP432P401R
Other Parts Discussed in Thread: TXS0108E
I am getting started with the driverlib on MSP432 Launchpad.
Some background: My aim is to control the Common Cathode LED matrix with MSP432 Launchpad though MAX7219 IC.
Here's my code:
/*
* -------------------------------------------
* MSP432 DriverLib - v3_21_00_05
* -------------------------------------------
*
* --COPYRIGHT--,BSD,BSD
* Copyright (c) 2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --/COPYRIGHT--*/
/******************************************************************************
* MSP432 SPI - 3-wire Master Incremented Data
*
* This example shows how SPI master talks to SPI slave using 3-wire mode.
* Incrementing data is sent by the master starting at 0x01. Received data is
* expected to be same as the previous transmission. eUSCI RX ISR is used to
* handle communication with the CPU, normally in LPM0. Because all execution
* after LPM0 is in ISRs, initialization waits for DCO to stabilize against
* ACLK.
*
* Note that in this example, EUSCIB0 is used for the SPI port. If the user
* wants to use EUSCIA for SPI operation, they are able to with the same APIs
* with the EUSCI_AX parameters.
*
* ACLK = ~32.768kHz, MCLK = SMCLK = DCO 3MHz
*
* Use with SPI Slave Data Echo code example.
*
* MSP432P401
* -----------------
* | |
* | P4.3|-> Chip Select
* | |
* | P1.6|-> Data Out (UCB0SIMO)
* | |
* | P1.7|
* | |
* | P1.5|-> Serial Clock Out (UCB0CLK)
* Author: Timothy Logan
*******************************************************************************/
/* DriverLib Includes */
#include "driverlib.h"
/* Standard Includes */
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
/* Statics */
static volatile uint8_t RXData = 0;
static uint8_t TXData = 0;
static uint8_t ii = 0;
// MAX7219 SPI LED Driver
#define MAX7219_TEST 0x0F // in real code put into a .h file
#define MAX7219_BRIGHTNESS 0x0A // in real code put into a .h file
#define MAX7219_SCAN_LIMIT 0x0B // in real code put into a .h file
#define MAX7219_DECODE_MODE 0x09 // in real code put into a .h file
#define MAX7219_SHUTDOWN 0x0C // in real code put into a .h file
/* SPI Master Configuration Parameter */
const eUSCI_SPI_MasterConfig spiMasterConfig =
{
EUSCI_B_SPI_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
3000000, // SMCLK = DCO = 3MHZ
500000, // SPICLK = 500khz
EUSCI_B_SPI_MSB_FIRST, // MSB First
EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT, // Phase
EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH, // High polarity
EUSCI_B_SPI_3PIN // 3Wire SPI Mode
};
int main(void)
{
volatile uint32_t ii;
/* Halting WDT */
WDT_A_holdTimer();
/* Selecting P1.5 P1.6 and P1.7 in SPI mode */
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
/* Configuring SPI in 3wire master mode */
SPI_initMaster(EUSCI_B0_BASE, &spiMasterConfig);
/* Enable SPI module */
SPI_enableModule(EUSCI_B0_BASE);
/* Enabling interrupts */
SPI_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_SPI_RECEIVE_INTERRUPT);
Interrupt_enableInterrupt(INT_EUSCIB0);
Interrupt_enableSleepOnIsrExit();
/* SPI --> P4.3 = CS */
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN3);
GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN3);
/* Selecting P1.0 as LED */
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
/* Delaying waiting for the module to initialize */
for(ii=0;ii<100;ii++);
/* SPI, put CS Low P4.3 and polling to see if the TX buffer is ready or busy */
/*GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN3);
TXData = 0x40;
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
SPI_transmitData(EUSCI_B0_BASE, TXData);
TXData = 0x00;
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));
SPI_transmitData(EUSCI_B0_BASE, TXData);
GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN3);*/
// Run test
// All LED segments should light up
GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN3); // CS LOW
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = 0x0F;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send address.
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = 0x01;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send the value.
GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN3); //Finish transfer. CS HIGH
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0); //Set LED HIGH
for (int j=0; j<400000; j++); //some delay
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = 0x0F;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send address.
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = 0x00;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send value.
GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN3); //Finish transfer. CS HIGH
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); //Set LED LOW
for (int j=0; j<400000; j++); //some delay
while(1){
for (uint8_t i = 0; i < 0x10; ++i)
{
GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN3); // CS LOW
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = 0x01;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send address.
while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT))); /* Polling to see if the TX buffer is ready */
TXData = i;
SPI_transmitData(EUSCI_B0_BASE, TXData); // Send value.
GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN3); //Finish transfer. CS HIGH
//maxTransfer(0x01, i);
for (int j=0; j<400000; j++); //some delay
}
}
//PCM_gotoLPM0();
//__no_operation();
}
//******************************************************************************
//
//This is the EUSCI_B0 interrupt vector service routine.
//
//******************************************************************************
void EUSCIB0_IRQHandler(void)
{
uint32_t status = SPI_getEnabledInterruptStatus(EUSCI_B0_BASE);
uint32_t jj;
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 = SPI_receiveData(EUSCI_B0_BASE);
/* Send the next data packet */
SPI_transmitData(EUSCI_B0_BASE, ++TXData);
/* Delay between transmissions for slave to process information */
for(jj=50;jj<50;jj++);
}
}
All the LEDs in the matrix are lit up, other than that nothing happening. When I debugged, the code does not pass the line number 154. Hence the LED also didn't come to HIGH state. What's wrong with this code?
Connections:
| MSP432 | MAX7219 |
| 5V | VCC |
| GND | GND |
| P4.3 | CS (LOAD) |
| P1.5 | CLK |
| P1.6 | DIN |
| MAX7219 | LED MATRIX (Pin Number) |
| SEG A | 9 |
| SEG B | 14 |
| SEG C | 8 |
| SEG D | 12 |
| SEG E | 1 |
| SEG F | 7 |
| SEG G | 2 |
| SEG DP | 5 |
| DIG 0 | 13 |
| DIG 1 | 3 |
| DIG 2 | 4 |
| DIG 3 | 10 |
| DIG 4 | 6 |
| DIG 5 | 11 |
| DIG 6 | 15 |
| DIG 7 | 16 |