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

  1. /*************************************************
  2.  *     ___       _             _    
  3.  *    |   |_ _ _| |___ ___   _| |___
  4.  *    | | |_'_| . | -_|  _|_| . | -_|
  5.  *    |___|_,_|___|___|___|_|___|___|
  6.  *
  7.  * FILE:     main.c
  8.  * Author:   declis (xdec.de)
  9.  ************************************************/
  10.  
  11. #include <msp430g2231.h>
  12. #define strobe BIT7
  13. #define sec 100
  14.  
  15. void main(void)
  16. {
  17.     volatile unsigned char counter=0;
  18.     volatile short m_sec=sec;
  19.  
  20.     WDTCTL=WDTPW+WDTHOLD;
  21.     BCSCTL1=CALBC1_1MHZ;
  22.     DCOCTL=CALDCO_1MHZ;
  23.  
  24.     P1DIR|=strobe;              //P1.7=Strobe (output)
  25.     P1OUT&=~strobe;             //clean P1.7
  26.     // SPI Master Mode
  27.     // USI SDO enabled, USI SCLK enabled, LSB first, Data output enabled
  28.     // USI held in reset state
  29.     USICTL0|=USIPE6+USIPE5+USIMST+USILSB+USIOE+USISWRST;
  30.     // Data is captured on first SCLK edge, changed on the following edge
  31.     // USI counter interrupt enabled
  32.     USICTL1|=USICKPH+USIIE;
  33.     // clock source = SMCLK = 1MHz
  34.     USICKCTL|=USISSEL_2;
  35.     // USI released for operation
  36.     USICTL0&=~USISWRST;
  37.     // clean counter IFG
  38.     USICTL1&=~USIIFG;
  39.     _EINT();
  40.  
  41.     while(1)
  42.     {
  43.         USISRL=counter++;       // 8bit shift register (low byte)=counter (0x00-0xFF)
  44.         while(USICTL1&USIIFG);  // wait for active transmission
  45.         USICNT=8;               // start transmission (8bit)
  46.  
  47.         while(m_sec--)
  48.             __delay_cycles(1000);
  49.  
  50.         m_sec=sec;
  51.     }
  52. }
  53.  
  54. #pragma INTERRUPT (USI)
  55. #pragma vector=USI_VECTOR
  56. void USI(void)
  57. {
  58.     P1OUT|=strobe;      // enable strobe register
  59.     P1OUT&=~strobe;
  60.     USICTL1&=~USIIFG;   // reset USI counter IFG
  61. }
/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * 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.

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.