MSP430 USI Initialisierung

Ein kleines Test-Programm in dem die USI-Schnittstelle vom MSP430 initialisiert und genutzt wird. Ein Zähler wird in einer Schleife durchgehend inkrementiert und der aktuelle Zähler-Wert an das Schieberegister gesendet (und per LEDs angezeigt (Binär Format, 8bit -> 0 bis 255)). Somit lassen sich Daten mit sehr wenig Aufwand seriell verschicken.

Das 8bit-Schieberegister braucht insgesamt 3 Ports -> Strobe, Clock, Data (und Output-Enable, bleibt hier durchgehend auf high). Das Strobe-Register übernimmt die Daten von dem Schieberegister und setzt entsprechend die Ausgänge (wenn Output-Enable=H). Somit lässt sich der Schiebeprozess bei einer langsamen Taktrate verschleiern (Flackern der LEDs z.B.). “Data” ist der Dateneingang und “Clock” der Clock-Eingang. Immer wenn Clock auf “H” steht, wird das Bit vom Data-Port übernommen (0 oder 1) bzw. in das Schieberegister “geschoben”.

Verwendetes Schieberegister: CD4094BCN (besser HC(T)-Technologie benutzen)

Video

Schaltplan

usi_shift

C-Programm

FILE: main.c

/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * FILE:     main.c
 * Author:   declis (xdec.de)
 ************************************************/

#include <msp430g2231.h>
#define strobe BIT7
#define sec 100

void main(void)
{
    volatile unsigned char counter=0;
    volatile short m_sec=sec;

    WDTCTL=WDTPW+WDTHOLD;
    BCSCTL1=CALBC1_1MHZ;
    DCOCTL=CALDCO_1MHZ;

    P1DIR|=strobe;              //P1.7=Strobe (output)
    P1OUT&=~strobe;             //clean P1.7
    // SPI Master Mode
    // USI SDO enabled, USI SCLK enabled, LSB first, Data output enabled
    // USI held in reset state
    USICTL0|=USIPE6+USIPE5+USIMST+USILSB+USIOE+USISWRST;
    // Data is captured on first SCLK edge, changed on the following edge
    // USI counter interrupt enabled
    USICTL1|=USICKPH+USIIE;
    // clock source = SMCLK = 1MHz
    USICKCTL|=USISSEL_2;
    // USI released for operation
    USICTL0&=~USISWRST;
    // clean counter IFG
    USICTL1&=~USIIFG;
    _EINT();

    while(1)
    {
        USISRL=counter++;       // 8bit shift register (low byte)=counter (0x00-0xFF)
        while(USICTL1&USIIFG);  // wait for active transmission
        USICNT=8;               // start transmission (8bit)

        while(m_sec--)
            __delay_cycles(1000);

        m_sec=sec;
    }
}

#pragma INTERRUPT (USI)
#pragma vector=USI_VECTOR
void USI(void)
{
    P1OUT|=strobe;      // enable strobe register
    P1OUT&=~strobe;
    USICTL1&=~USIIFG;   // reset USI counter IFG
}

Leave a Reply

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

This site uses Akismet to reduce spam. Learn how your comment data is processed.