
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:

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 // 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 }
Nguồn; http://codientu.org
Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn
đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON
HotLine: 0972 800 931 Ms Duyên