งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

SPI.

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "SPI."— ใบสำเนางานนำเสนอ:

1 SPI

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

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

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

5 องค์ประกอบของ 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

6 องค์ประกอบของ 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

7 องค์ประกอบของ 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

8 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

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

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

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

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

13 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

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

15 Slave Synchronization Waveform

16 SPI Mode Waveform (Slave Mode with CKE = 0)

17 SPI Mode Waveform (Slave Mode with CKE = 1)

18 16-Bit I/O Expander with Serial Interface

19

20 ตัวอย่างโปรแกรมสื่อสาร 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] = {0b ,0b ,0b ,0b ,0b , b ,0b ,0b ,0b ,0b , b ,0b ,0b ,0b ,0b , b ,0b ,0b ,0b ,0b , b ,0b ,0b ,0b ,0b , b ,0b ,0b ,0b ,0b , 0b ,0b }; // Delay in 1 ms (approximately) for 16 MHz Internal Clock void delay_ms(unsigned int ms) { do { Delay1KTCYx(4); } while(--ms); }

21 ตัวอย่างโปรแกรมสื่อสาร 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; }

22 ตัวอย่างโปรแกรมสื่อสาร 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=0b ; // ADC port channel 3 (AN3), Enable ADC ADCON1=0b ; // Use Internal Voltage Reference (Vdd and Vss) ADCON2=0b ; // 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

23 ตัวอย่างโปรแกรมสื่อสาร 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


ดาวน์โหลด ppt SPI.

งานนำเสนอที่คล้ายกัน


Ads by Google