toilet

MSP430 - SPI - Giao tiếp với IC 74HC595

Thảo luận trong 'Họ MSP430'

Đang xem chủ đề này ( Thành viên: 1, Khách: 0)

  1. lam18379
  1. Đăng 4/12/12 #1

    June Kỹ sư

    Số bài viết: 164
    Đã được thích: 290
    Bài này sẽ giới thiệu cho các bạn giao tiếp SPI giữa MSP430 và IC 74HC595. Công cụ lập trình được sử dụng trong bài này là phần mềm IAR Embedded Workbench.
    SPI là chuẩn truyền thông đồng bộ nối tiếp theo kiểu Master-Slave. SPI là một cách truyền song công nghĩa là tại một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. Chuẩn SPI giao tiếp qua 4 đường:
    SCK: xung nhịp cho giao tiếp SPI, chỉ được tạo bởi Master có tác dụng đồng bộ dữ liệu truyền.
    [MISO-Master Input Slave Output: là đường dữ liệu truyền từ Slave về Master.
    MOSI-Master Output Slave Input: là đường dữ liệu truyền từ Master đến Slave.
    SS-Slave Select: là đường chọn Slave cần giao tiếp.
    TRUYỀN THÔNG SPI TRÊN MSP430 LAUNCHPAD:
    Sơ đồ kết nối phần cứng với 74HC595:
    1.
    Hoạt động:
    Master MSP430 sẽ truyền từng chuỗi dữ liệu 8 bit là mã hex từ 0 đến 9 của led 7 đoạn qua Slave là thanh ghi dịch 74HC595 được đồng bộ bằng xung SCK trên chân P1.5. Lúc đầu nạp cho USICNT=8 để truyền 8 bit dữ liệu; sau khi truyền xong 8 bit này, ta nạp lại giá trị 8 cho USICNT để truyền 8 bit tiếp theo.
    Ta dùng chân P1.4 để tạo xung dương kích cho 74HC595 xuất dữ liệu ra led 7 đoạn
    Clip bài giảng:
    Source code:

    Mã:
    //******************************************************************************
     
    //  MSP430G2x21/G2x31 HALF DUPLEX WRITE
     
    //
     
    //Description: SPI Master communicates with SPI Slave using
     
    //  the USI . Slave data should increment from 0 to 9 and
     
    //    displays on led 7 segment.
     
    //                Slave                      Master
     
    //              74HC595                  MSP430G2x21/G2x31
     
    //            -----------------          -----------------
     
    //            |                |        |                |
     
    //            |                |        |                |
     
    // led 7seg<--|QA-QH            |        |                |
     
    //            |                |        |                |
     
    //            |                |        |                |
     
    //            |                |        |                |
     
    //            |                |        |            P1.0|-> LED
     
    //            |              SER|<-------|P1.6/SDO        |
     
    //            |            RCLK|<-------|P1.4            |
     
    //            |            SRCLK|<-------|P1.5/SCLK        |
     
    //
     
    //  Texas Instruments Inc.
     
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
     
    //******************************************************************************
     
     
     
    #include <msp430g2221.h>
     
    int i=0;
     
    int b[10]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x80,0x10};
     
     
     
    void main(void)
     
    {
     
      WDTCTL = WDTPW + WDTHOLD;                      // Stop watchdog timer
     
      P1DIR |= 0x10;                                // Set P1.4 to output direction
     
      USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE;  // Port, SPI Master
     
      USICTL1 |= USICKPH + USIIE;                    // Counter interrupt, flag remains set
     
      USICKCTL = USIDIV_2 + USISSEL_1;                  // /4 ACLK
     
      USICTL0 &= ~USISWRST;                          // USI released for operation
     
      USISRL = b[i];
     
      USICNT = 8;                                    // init-load counter
     
      _BIS_SR(LPM3_bits + GIE);                        // Enter LPM3 w/ interrupt
     
    }
     
     
     
    // USI interrupt service routine
     
    #pragma vector=USI_VECTOR
     
    __interrupt void universal_serial_interface(void)
     
    {
     
      // create positive edge clock on p1.4
     
      P1OUT &= ~0x10;
     
      __delay_cycles(1250);
     
      P1OUT |= 0x10;
     
      USISRL = b[i] ;
     
      if(i==9)
     
        {
     
            i=0;
     
        }
     
        else{
     
            i++;
     
        }
     
      USICNT = 8;                          // re-load counter
     
    }  

    Các file đính kèm:

    Chủ đề cùng chuyên mục
    Chia sẻ Share





    #1
  2. Đăng 8/5/14 #2

    uknow Học sinh phổ thông

    Số bài viết: 10
    Đã được thích: 4
    e thay 2221 = 2553 thì nó lỗi chưa khai báo mấy cái USI là sao nhể? @@
    #2
  3. Đăng 8/5/14 #3

    lee_trieu Học sinh trung cấp

    Số bài viết: 85
    Đã được thích: 16
    Hai con F2221 và G2553 khác nhau mà bạn. Con G2553 dùng bộ USCI trong khi con F2221 dùng USI. bạn sửa lại các thanh ghi tương ứng thì nó sẻ hoạt động.
    uknow thích bài này.
    #3
  4. Đăng 8/5/14 #4

    uknow Học sinh phổ thông

    Số bài viết: 10
    Đã được thích: 4
    vầng. thảm lào :))
    #4
  5. Đăng 19/9/14 #5

    thientrang Học sinh phổ thông

    Số bài viết: 2
    Đã được thích: 0
    Mọi người cho mình hỏi ở USCI của 2553 có CNT để đếm bit không ạ?
    Em muốn dùng nó để điều khiển 1 Slave gồm 5 thanh ghi, mỗi thanh ghi 22 bit thì phải làm thế nào ạ?
    #5

Chia sẻ trang này