SPI.

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
คำสั่ง DISPLAY รูปแบบที่ 1 DISPLAY identifier-1, identifier-2 … literal-1 literal-2 [ UPON mnemonic-name ]  ตัวอย่าง DISPLAY STUDENT-NAME. DISPLAY.
Advertisements

อาจารย์ผู้ร่วมประเมินโครงการ :
นายรังสฤษดิ์ตั้งคณา รหัส นายวสันต์ ชานุชิต รหัส อาจารย์ที่ปรึกษาโครงการ ผศ. ดร. ดารณี หอมดี อาจารย์ที่ปรึกษาโครงการร่วม ดร. วาธิส.
FINITE STATE AUTOMATA WITH OUTPUT
LAB # 4.
Chapter 5 Plug and Play.
คำสั่งเพื่อการกำหนดเงื่อนไข
บรรยายครั้งที่ 3: Queue
Lecture no. 10 Files System
Register.
Flip-Flop บทที่ 8.
การใช้ภาษาซี มาสั่งงานผ่านพอร์ตพริ้นเตอร์
เขียนโปรแกรมด้วย microC
นายนิรันดร์ อังควัฒนวิทย์ นางสาวรุจิรา อาชวานันทกุล
input from keyboard มหาวิทยาลัยเนชั่น การโปรแกรมเชิงวัตถุด้วยภาษา JAVA
Page: 1 โครงสร้างคอมพิวเตอร์ และภาษาแอสเซมบลี้ ผศ. บุรินทร์ รุจจน พันธุ์.. ปรับปรุง 19 ตุลาคม 2555 Introduction to Batch.
Chapter 7 Input/Output I/O Module
Input / Output ธนวัฒน์ แซ่เอียบ.
ภาษาแอสแซมบลี Pisit Nakjai.
Patient Monitoring ผู้จัดโดย นายกันต์ ศิริงามเพ็ญ KMITL
Computer Programming การเขียนโปรแกรม คอมพิวเตอร์ สัปดาห์ที่ 6 คำสั่งควบคุมการทำงานแบบ เงื่อนไขและคำสั่งควบคุมการ ทำงานแบบวนซ้ำ.
บทที่ 4 วงจร ADC เทอดศักดิ์ ลิ่วหาทอง สาขาวิชาอิเล็กทรอนิกส์
การรับส่งข้อมูลระหว่าง Group 1 กับ Group 2
การรับส่งข้อมูลระหว่าง Group 2 กับ Group 3 ในสถานีเคลื่อนที่ (Mobile Station) 2 พฤษภาคม G Research Project 3G Research Project Thai Wireless Consortium.
ADC & UART.
Linked List ( ต่อ ) Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.
ฟังก์ชันในภาษา C. ฟังก์ชัน (Functions) 2 การออกแบบโปรแกรมในภาษาซี จะอยู่บนพื้นฐานของการออกแบบ โมดูล (Module Design) โดยการแบ่ง โปรแกรมออกเป็นงานย่อย ๆ.
Concept and Terminology Guided media (wired) Twisted pair Coaxial cable Optical fiber Unguided media (wireless) Air Seawater Vacuum Direct link Point.
การสื่อสารข้อมูล.
(Inter-Integrated Circuit)
Chapter 8: Single-Area OSPF
โครงสร้างภาษาซี C ++ structure
แนะนำไมโครคอนโทรเลอร์ ATMEGA 16
เครื่องมือวัดดิจิตอล
การเลือกซื้อคอมพิวเตอร์
Computer Programming I โดย อ.วิมลศรี เกตุโสภณ สาขาวิชาระบบสารสนเทศ
Lab# Digital Modulation
อุปกรณ์เก็บบันทึกข้อมูล (Storage Devices)
พื้นฐานการอินเตอร์เฟส
Chapter 9 ตัวชี้ pointer.
INC 161 , CPE 100 Computer Programming
Flip-Flop บทที่ 8.
ภาษา C เบื้องต้น.
Computer Programming การเขียนโปรแกรมคอมพิวเตอร์
Programming in C.
คำอธิบายรายวิชา การเขียนผังงาน รหัสเทียม ตรรกศาสตร์เบื้องต้น การเขียนโปรแกรมคอมพิวเตอร์แบบโครงสร้าง ชนิดตัวแปร ตัวดำเนินการทางตรรกะ ตัวดำเนินการเปรียบเทียบ.
ตัวอย่างการต่ออุปกรณ์ต่อพ่วงเข้ากับ PIC16F877A
N I T DATA. N I T DATA Data Link Layer Flow Control 1. Stop-and-Wait Flow Control 2. Sliding-Window Flow Control.
บทที่ 4 ตัวแปร (Variables)
การออกแบบระบบ System Design.
Introduction to Analog to Digital Converters
Interrupt & Timer.
Operating System Overview
Flip-Flop บทที่ 8.
Flip-Flop บทที่ 8.
JSON API Pentaho User Manual.
รายวิชา ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม
การเขียนโปรแกรมคอมพิวเตอร์
Object-Oriented Analysis and Design
Life’s easier with the Lyric family at the heart of your home
หน่วยความจำหลัก (Main Memory)
โครงสร้างระบบคอมพิวเตอร์
ระบบตัวเลข, Machine code, และ Register
การเลือกซื้อคอมพิวเตอร์
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
แนะนำวิชา Microprocessors and Applications
การจัดบล๊อคและบัฟเฟอร์ (Blocking and Buffering)
Programmable Logic Control
ส่วนประกอบของคอมพิวเตอร์ (Personal Computer : PC)
การจำลองวงจรอิเล็กทรอนิกส์
ใบสำเนางานนำเสนอ:

SPI

ปัญหาของการสื่อสารแบบ UART วงจรสื่อสารของ UART ทั้ง 2 ฝั่ง มีวงจรสร้างสัญญาณนาฬิกาเป็นของตัวเอง (Asynchronous) ซึ่งในบางครั้งสัญญาณนาฬิกาของวงจรสื่อสารทั้ง 2 ฝั่งอาจมี ความถี่ต่างกันเล็กน้อย ตัวอย่างเช่น PIC18F8722 ที่ใช้ Oscillator ความถี่ 4 MHz สามารถสร้าง BAUD Rate เท่ากับ 9615 และ Computer ที่มี BUAD Rate เท่ากับ 9600 การที่สัญญาณ นาฬิกาของวงจรสื่อสารทั้ง 2 ฝั่งมีความถี่ไม่เท่ากันอาจทำให้การรับส่งข้อมูลผิดพลาดได้ วิธีแก้ไขคือทำให้วงจรสร้างสัญญาณนาฬิกาของวงจรสื่อสารทั้ง 2 ฝั่งมีความถี่เดียวกัน ซึ่ง ในทางปฏิบัติค่อนข้างรับประกันได้ยากว่าความถี่ของวงจรสร้างสัญญาณทั้ง 2 ฝั่งเท่ากัน หรือออกแบบให้วงจรสื่อสารทั้ง 2 ฝั่งได้รับสัญญาณนาฬิกาจากวงจรสร้างสัญญาณนาฬิกา วงจรเดียวกัน เราเรียกการสื่อสารแบบนี้ว่าการสื่อสารแบบ Synchronous

Serial Peripheral Interface (SPI) SPI เป็นการสื่อสารอนุกรมแบบ Synchronous ทำให้รับส่งข้อมูลได้ ถูกต้องแม่นยำกว่า UART และสามารถรับส่งข้อมูลได้พร้อมกัน (Full Duplex) นิยมใช้ในการรับส่งข้อมูลระหว่าง Microcontroller กับอุปกรณ์ต่อ พ่วงอื่นๆเช่น Serial EEPROMs, Shift Register, Sensor, Display Driver, A/D Converters และ SD CARD เป็นต้น

องค์ประกอบของ SPI SPI เป็นการสื่อสารที่มีโครงสร้างแบบ Master-Slave ภายในวงจรสื่อสารทั้งฝั่ง Master และ Slave มี Serial Shift Register ขนาด 8 บิทสำหรับใช้ในการรับและส่งข้อมูล Shift Register ของทั้งฝั่ง Master และ Slave สามารถที่จะส่ง ข้อมูลออกไปให้อีกฝั่ง พร้อมกับรับข้อมูลที่ถูกส่งเข้ามาได้พร้อมกันในเวลา เดียวกัน ดังนั้น SPI จึงเป็นการสื่อสารแบบ Full Duplex

องค์ประกอบของ SPI สัญญาณของ SPI ประกอบด้วย MOSI (Master Output Slave Input) เป็นสัญญาณข้อมูลที่ถูกส่ง จาก Master ไปให้ Slave MISO (Master Input Slave Output) เป็นสัญญาณข้อมูลที่ถูกส่ง จาก Slave ไปให้ Master SCLK (Serial Clock) เป็นสัญญาณนาฬิกาที่ถูกส่งจาก Master Clock ของฝั่ง Master ไปให้กับ Serial Shift Register ของฝั่ง Slave

องค์ประกอบของ SPI สัญญาณของ SPI ประกอบด้วย MOSI (Master Output Slave Input) เป็นสัญญาณข้อมูลที่ถูกส่ง จาก Master ไปให้ Slave MISO (Master Input Slave Output) เป็นสัญญาณข้อมูลที่ถูกส่ง จาก Slave ไปให้ Master SCLK (Serial Clock) เป็นสัญญาณนาฬิกาที่ถูกส่งจาก Master Clock ของฝั่ง Master ไปให้กับ Serial Shift Register ของฝั่ง Slave

องค์ประกอบของ SPI /SS (Slave Select) เป็นสัญญาณที่ Master ส่งไปบอก Slave ว่าต้องการ รับส่งข้อมูลด้วย ตัวอย่างเช่น ใช้ SPI ของ PIC18F8722 ในการอ่านอุณหภูมิ จาก LM74 ซึ่งเป็นเซนเซอร์วัดอุณหภูมิ ขนาด 13 bit และนำไปเก็บค่าไว้ใน SD Card และแสดงผลใน TFT LCD Display Module โดยใช้ส่งสัญญาณ /SS0, /SS1 หรือ /SS2 ไปเลือกว่าต้องการที่จะติดต่อกับ Sensor, SD Card หรือ LCD Module

Master Synchronous Serial Port (MSSP1, MSSP2) MSSP1 และ MSSP2 เป็นโมดูลที่ใช้ในการสื่อสารแบบ SPI และ I2C SPI สามารถทำงานได้ทั้ง Master หรือ Slave และ Port ต่างๆของ PIC18F8722 ที่ถูกกำหนดให้เป็น สัญญาณของ SPI เป็นดังนี้ RC5 (MOSI1), RD4 (MOSI2) RC4 (MISO1), RD5 (MISO2) RC3 (SCLK1), RD6 (SCLK2) RF7 (/SS1), RD7 (/SS2) ใช้เฉพาะในกรณีที่เป็น Slave Mode

Master Synchronous Serial Port (MSSP1, MSSP2) จากบล็อคไดอะแกรมจะเห็นว่า สัญญาณนาฬิกาของ SPI สามารถสร้างได้ 2 วิธีคือ Timer 2 Output/2 (SSPM3:SSPM0 = 0011) วงจร Oscillator ของ PIC18F8722 โดยสามารถ เลือกได้ว่าจะให้มีความถี่เท่ากับ Fosc/4 (SSPM3:SSPM0 = 0000) Fosc/16 (SSPM3:SSPM0 = 0001) Fosc/64 (SSPM3:SSPM0 = 0010)

Register ที่เกี่ยวข้องกับ MSSP

Register ที่เกี่ยวข้องกับ MSSP MSSPx Control Register 1 (SSPxCON1) ใช้ในการควบคุมการทำงานของ MSSP สามารถอ่านหรือเขียนได้ทั้ง 8 bit <SSPM3:SSPM0> เป็น ตัวกำหนดว่าให้โมดูล MSSP เป็น Master Mode <00xx> Slave Mode <010x>

Register ที่เกี่ยวข้องกับ MSSP MSSPx Status Register (SSPxSTAT) ใช้แสดงสถานะของ MSSP บิทที่ <7:6> สามารถอ่าน และเขียนได้ บิทที่ <5:0> สามารถอ่าน ได้เพียงอย่างเดียว

Register ที่เกี่ยวข้องกับ MSSP Serial Receive/Transmit Buffer Register (SSPxBUF) ใช้ในการเก็บข้อมูลที่ต้องการส่งออกไป หรือรับเข้ามา MSSP Shift Register (SSPxSR) เป็น Shift Register ที่ใช้ในระหว่างการรับส่งข้อมูล ไม่สามารถ เขียนโปรแกรมอ่านหรือเขียนข้อมูลกับ SSPxSR ได้ โดยตรง เมื่อต้องการส่งข้อมูล จะต้องเขียนโปรแกรมนำค่าที่ต้องการ ส่งไปเก็บไว้ใน SSPxBUF จากนั้นโมดูล MSSP จะส่ง ค่าที่อยู่ใน SSPxBUF ไปเก็บไว้ใน SSPxSR ก่อนที่จะ Shift ข้อมูลออกไป หรือเมื่อต้องการรับข้อมูล โมดูล MSSP จะ Shift ข้อมูลเข้ามาเก็บไว้ใน SSPxSR จนครบ 8 bit ก่อนที่จะ ส่งข้อมูลทั้ง 8 bit ไปเก็บไว้ใน SSPxBUF

SPI Mode Waveform (Master Mode) CKP 1 Idle State = 1 0 Idle State = 0 CKE 1 ข้อมูลถูกส่งเมื่อสัญญาณนาฬิกา เปลี่ยนสถานะจาก Active ไปเป็น Idle 0 ข้อมูลถูกส่งเมื่อสัญญาณนาฬิกา เปลี่ยนสถานะจาก Idle ไปเป็น Active

Slave Synchronization Waveform

SPI Mode Waveform (Slave Mode with CKE = 0)

SPI Mode Waveform (Slave Mode with CKE = 1)

16-Bit I/O Expander with Serial Interface

ตัวอย่างโปรแกรมสื่อสาร SPI #include <p18f8722.h> #include <delays.h> // MCP23S17 SPI Slave Device #define SPI_SLAVE_ID 0x40 #define SPI_SLAVE_ADDR 0x00 // A2=0,A1=0,A0=0 #define SPI_SLAVE_WRITE 0x00 #define SPI_SLAVE_READ 0x01 // MCP23S17 Registers Definition for BANK=0 (default) #define IODIRA 0x00 #define IODIRB 0x01 #define IOCONA 0x0A #define GPPUA 0x0C #define GPPUB 0x0D #define GPIOA 0x12 #define GPIOB 0x13 static rom unsigned char led_patern[32] = {0b00000001,0b00000011,0b00000110,0b00001100,0b00011001, 0b00110011,0b01100110,0b11001100,0b10011000,0b00110000, 0b01100000,0b11000000,0b10000000,0b00000000,0b00000000, 0b00000000,0b10000000,0b11000000,0b01100000,0b00110000, 0b10011000,0b11001100,0b01100110,0b00110011,0b00011001, 0b00001100,0b00000110,0b00000011,0b00000001,0b00000000, 0b00000000,0b00000000}; // Delay in 1 ms (approximately) for 16 MHz Internal Clock void delay_ms(unsigned int ms) { do { Delay1KTCYx(4); } while(--ms); }

ตัวอย่างโปรแกรมสื่อสาร SPI unsigned char SPI_Read(unsigned char addr) { // Activate the SS SPI Select pin PORTCbits.RC2 = 0; // Start MCP23S17 OpCode transmission SSPBUF = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E)| SPI_SLAVE_READ; // Wait for Data Transmit/Receipt complete while(!SSPSTATbits.BF); // Start MCP23S17 Address transmission SSPBUF = addr; // Send Dummy transmission for reading the data SSPBUF = 0x00; // CS pin is not active PORTCbits.RC2 = 1; return(SSPBUF); } void SPI_Write(unsigned char addr,unsigned char data) { // Activate the SS SPI Select pin PORTCbits.RC2 = 0; // Start MCP23S17 OpCode transmission SSPBUF = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E)| SPI_SLAVE_WRITE; // Wait for Data Transmit/Receipt complete while(!SSPSTATbits.BF); // Start MCP23S17 Register Address transmission SSPBUF = addr; // Start Data transmission SSPBUF = data; // CS pin is not active PORTCbits.RC2 = 1; }

ตัวอย่างโปรแกรมสื่อสาร SPI void main(void) { unsigned char cnt,togbutton,inp; unsigned int idelay; TRISC = 0x00; // Set All on PORTC as Output /* Init the PIC18F14K22 ADC Peripheral */ ADCON0=0b00001101; // ADC port channel 3 (AN3), Enable ADC ADCON1=0b00000000; // Use Internal Voltage Reference (Vdd and Vss) ADCON2=0b10101011; // Right justify result, 12 TAD, Select the FRC for 16 MHz /* Initial the PIC18F14K22 SPI Peripheral */ TRISCbits.TRISC2 = 0; // RC6/SS - Output (Chip Select) TRISCbits.TRISC5= 0; // RC7/SDO - Output (Serial Data Out) TRISBbits.TRISB4= 1; // RB4/SDI - Input (Serial Data In) TRISBbits.TRISB2= 0; // RB6/SCK - Output (Clock) SSPSTAT = 0x40; // Set SMP=0 and CKE=1. Notes: The lower 6 bit is read only SSPCON1 = 0x20; // Enable SPI Master with Fosc/4 PORTCbits.RC6 = 1; // Disable Chip Select // Initial the MCP23S17 SPI I/O Expander SPI_Write(IOCONA,0x28); // I/O Control Register: BANK=0, SEQOP=1, HAEN=1 (Enable Addressing) SPI_Write(IODIRA,0x00); // GPIOA As Output SPI_Write(IODIRB,0xFF); // GPIOB As Input SPI_Write(GPPUB,0xFF); // Enable Pull-up Resistor on GPIOB SPI_Write(GPIOA,0x00); // Reset Output on GPIOA // Initial Variable Used togbutton=0; // Toggle Button cnt=0; idelay=100; // Default Delay;   for(;;) { inp=SPI_Read(GPIOB); // Read from GPIOB

ตัวอย่างโปรแกรมสื่อสาร SPI if (inp == 0xFE) { // Button is pressed delay_ms(1); inp=SPI_Read(GPIOB); // Read from GPIOB, for simple debounce if (inp == 0xFE) togbutton^=0x01; if (togbutton == 0x00) { SPI_Write(GPIOA,0x00); // Write to MCP23S17 GPIOA cnt=0; } if (togbutton) { ADCON0bits.GO=1; while (ADCON0bits.GO); // Wait conversion done idelay=ADRESL; // Get the 8 bit LSB result idelay += (ADRESH << 8); // Get the 2 bit MSB result // Write to GPIOA SPI_Write(GPIOA,led_patern[cnt++]); if(cnt >= 32) cnt=0; } delay_ms(idelay); // Call Delay function