บทความ ESPino32 ตอนที่ 9 การสื่อสารอนุกรมแบบ SPI

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 9 การสื่อสารอนุกรมแบบ SPI

        บทความ ESPino32 ตอนที่ 9 การสื่อสารอนุกรมแบบ SPI เป็นการใช้งานบอร์ดไมโครคอนโทรเลอร์เพื่อรับส่งข้อมูลระหว่างบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ภายนอกอื่นๆที่เกี่ยวข้อง ดังรูป การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้สื่อสารแบบ SPI โดยการสื่อสารแบบ SPI จะเป็นส่วนหนึ่งของการรับส่งข้อมูลแบบอนุกรมในแบบซิงโครนัส ตัวอย่างที่ใช้งานการสื่อสารอนุกรมแบบ SPI เช่น การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์อ่านค่า ADC/DAC การสื่อสารระหว่างบอร์ด ESPino32 กับจอภาพแสดงผล การสื่อสารระหว่างบอร์ด ESPino32 กับ SD Module การสื่อสารระหว่างบอร์ด ESPino32 กับ RFID เป็นต้น

การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้สื่อสารแบบ SPI

        SPI ย่อมาจาก Serial Peripheral Interface คือรูปของแบบการสื่อสารข้อมูลแบบอนุกรมแบบซิงโครนัสรูปแบบหนึ่ง ถูกพัฒนาขึ้นมาโดยโมโตโรล่าในกลางปี ค.ศ. 1980 เพื่อใช้ในการการสื่อสารระยะใกล้โดยเฉพาะในระบบสมองกลฝังตัว การสื่อสารอนุกรมแบบ SPI จะอาศัยสัญญาณนาฬิกาเป็นตัวกำหนดจังหวะการรับส่งข้อมูล สามารถส่งข้อมูลไปยังปลายทางและรับข้อมูลจากปลายทางกลับมาในครั้งเดียวกัน (Full Duplex) การสื่อสารอนุกรมแบบ SPI จะแบ่งอุปกรณ์ออกเป็น 2 ฝั่ง คือ Master เป็นตัวควบคุมการรับส่งข้อมูล และ Slave เป็นอุปกรณ์ที่รอรับคำสั่งจาก Master ในบัสการสื่อสารแบบอนุกรมแบบ SPI สามารถมี Slave มีได้มากกว่า 1 ตัว

การสื่อสารอนุกรมแบบ SPI ใช้สายสัญญาณทั้งหมดจำนวน 4 เส้น มีรายละเอียดดังนี้

– SCK (Clock Data)                      ใช้สำหรับส่งสัญญาณนาฬิกาจาก Master ไปยัง Slave   Shared

– MISO (Master In Slave Out)       ใช้สำหรับรับข้อมูลจาก Slave                                   Shared

– MOSI (Master Out Slave In)       ใช้สำหรับส่งข้อมูลจาก Master ไปยัง Slave                Shared

– SS/CS (Slave Select/Chip Select) ใช้สำหรับเลือก Slave ที่ต้องการใช้งาน                      Not Shared

สำหรับอุปกรณ์ที่ใช้การสื่อสารอนุกรมแบบ SPI บางชนิดอาจมีชื่อเรียกแตกต่างกันไป ตัวอย่างเช่น

– Serial Clock

* SCLK : SCK

– Master Output Slave Input

* SIMO, MTSR
* SDI, DI, DIN, SI                     – on Slave devices
* SDO, DO, DOUT,SO    – on Master devices

– Master Input Slave Output

* SOMI, MRST
* SDO, DO, DOUT, SO   – on Slave devices
* SDI, DI, DIN, SI                     – on Master devices

– Slave Select

* SS, S̅S̅, SSEL, CS, C̅S̅, CE, nSS, /SS, SS#

การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ SPI แบบ Slave เดียว
การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ SPI แบบหลาย Slave

        จากรูป การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ SPI แบบหลาย Slave และ การเชื่อมต่อระบบด้วยการสื่อสารอนุกรมแบบ SPI แบบหลาย Slave จะประกอบไปด้วย 2 ส่วนคือ 1. อุปกรณ์หลัก (Master) และ 2.อุปกรณ์ย่อย (Slave) ในระบบการสื่อสารอนุกรมแบบ SPI สามารถต่ออุปกรณ์ Slave ได้หลายอุปกรณ์ ภายในการสื่อสารอนุกรมแบบ SPI จะใช้สายสัญญาณ SCK MOSI และ MISO ร่วมกันแต่จะไม่ใช้สายสัญญาณ S̅S̅ ร่วมกัน เวลาที่ Master ต้องการสื่อสารกับ Slave จะส่งสัญญาณลอจิก LOW ไปยัง Slave ที่ต้องการสื่อสารเพื่อบ่งบอกว่าต้องการสื่อสารกับ Slave ตัวนั้น ทำให้สามารถเลือกสื่อสารกับ Slave ได้ถูกต้อง

รูปแบบสัญญาณใน SPI BUS
รูปแบบสัญญาณ SPI มี 4 รูปแบบ แตกต่างกันที่ขอบสัญญาณนาฬิกา (Clock Polarity) และเฟส (Phase)

– เมื่อ CPHA=0 และ CPOL=0 สัญญาณนาฬิกา (Clock) ในสถานะปกติจะเป็น Low และจะรับ-ส่งข้อมูลที่ขอบขาขึ้นของสัญญาณนาฬิกา (Rising Edge Clock)

– เมื่อ CPHA=0 และ CPOL=1 สัญญาณนาฬิกา (Clock) ในสถานะปกติจะเป็น High และจะรับ-ส่งข้อมูลที่ขอบขาลงของสัญญาณนาฬิกา (Falling Edge Clock)

– เมื่อ CPHA=1 และ CPOL=0 สัญญาณนาฬิกา (Clock) ในสถานะปกติจะเป็น Low และจะรับ-ส่งข้อมูลที่ขอบขาลงของสัญญาณนาฬิกา (Falling Edge Clock)

– เมื่อ CPHA=1 และ CPOL=1 สัญญาณนาฬิกา (Clock) ในสถานะปกติจะเป็น High และจะรับ-ส่งข้อมูลที่ขอบขาขึ้นของสัญญาณนาฬิกา (Rising Edge Clock)

ดังนั้น Mode ของ SPI มี 4 โหมด ดังรูป โหมดของการสื่อสารอนุกรมแบบ SPI

โหมดของการสื่อสารอนุกรมแบบ SPI

สำหรับพอร์ทการสื่อสารอนุกรมแบบ SPI ของบอร์ด ESPino32 จะมีทั้งหมด 4 ชุด คือ SPI0, SPI1, HSPI และ VSPI สามารถกำหนดความเร็วของพอร์ทการสื่อสารอนุกรมแบบ SPI ได้สูงสุด 80 MHz (ขึ้นอยู่กับพอร์ทที่ใช้งาน แนะนำใช้งานไม่เกิน 40 MHz)  ซึ่งพอร์ต SPI0 และ SPI1 จะต่ออยู่กับหน่วยความจำไม่สามารถใช้งานได้ จึงเหลือ HSPI และ VSPI ที่สามารถใช้งานได้อย่างอิสระ มีตำแหน่งดังนี้

ขา SPI ของบอร์ด ESPino32


* ในกรณีที่ต่อ Slave Device มากกว่า 1 ตัว สามารถกำหนดขา GPIO ขาอื่นๆของบอร์ด ESPino32 มาแทนได้

สามารถดูตำแหน่งพอร์ทการสื่อสารแบบอนุกรมแบบ SPI ของบอร์ด ESPino32 เพิ่มเติมได้จากแถบสีเทาอ่อน(HSPI) และแถบสีส้ม(VSPI) ในรูป ESPino32 Pinout

ESPino32 Pinout

การใช้งานการสื่อสารอนุกรมแบบ SPI

            สำหรับการใช้งานการสื่อสารอนุกรมแบบ SPI จะไม่มีรูปแบบการสื่อสารที่เป็นมาตรฐาน จำเป็นต้องใช้รูปแบบของข้อมูลตามเอกสารของอุปกรณ์ที่ต้องการจะใช้งานร่วมกัน

ตัวอย่างการส่งข้อมูลแบบ SPI

การส่งข้อมูลแบบ SPI จำเป็นต้องมีสัญญาณนาฬิกา(SCK) จากไมโครคอนโทรเลอร์ และสายสัญญาณข้อมูลในการสื่อสาร ยกตัวอย่าง เช่น ให้ไมโครคอนโทรเลอร์ส่งอักษร ‘H’ (B01001000) ออกไปผ่านช่องทางการสื่อสารอนุกรมแบบ SPI จะต้องใช้สายสัญญาณนาฬิกาที่คอยควบคุมจังหวะการรับส่งข้อมูล (ตัวอย่างนี้ใช้ SPI Mode 0) จะมีสัญญาณที่สายต่างๆ ดังรูป ตัวอย่างการส่งอักษร ‘H’ แบบ SPI

ตัวอย่างการส่งอักษร ‘H’ แบบ SPI

ตัวอย่างการส่ง-รับข้อมูลแบบ SPI

            การส่ง-รับข้อมูลแบบ SPI จะยังมีลักษณะเดียวกันกับการส่งข้อมูลแบบ SPI จะมีเอาต์พุตตอบกลับมาในสัญญาณนาฬิกาชุดถัดไป ยกตัวอย่าง เช่น ให้ไมโครคอนโทรเลอร์ส่งอักษร ‘H’ (B01001000) ออกไปผ่านช่องทางการสื่อสารอนุกรมแบบ SPI และรับข้อมูลตัวอักษร ‘H’ กลับมา จะมีสัญญาณที่สายต่างๆ ดังรูป ตัวอย่างการส่งอักษร ‘H’ และรับข้อมูลอักษร ‘H’ ด้วยการสื่อสารอนุกรมแบบ SPI

ตัวอย่างการส่งอักษร ‘H’ และรับข้อมูลอักษร ‘H’ ด้วยการสื่อสารอนุกรมแบบ SPI

            สำหรับการพัฒนาโปรแกรมการสื่อสารอนุกรมแบบ SPI บนแพลตฟอร์ม Arduino จะใช้งานผ่านไลบรารี่ SPI ที่ถูกติดตั้งมาบนโปรแกรม Arduino IDE เรียบร้อยแล้ว เมื่อผู้ใช้ต้องการพัฒนาโปรแกรมบนโปรแกรม Arduino IDE จึงสามารถเรียกใช้งานผ่านการ #include <SPI.h>

ฟังก์ชันการใช้งานการสื่อสารอนุกรมแบบ SPI ด้วยไลบรารี่ SPI

– SPISettings                   ฟังก์ชันสำหรับกำหนดพารามิเตอร์ของการสื่อสารอนุกรมแบบ SPI ใช้งานร่วมกับฟังก์ชัน SPI.beginTransmission()

– SPI.begin()                   ฟังก์ชันสำหรับเริ่มต้นใช้งาน SPI เริ่มต้นบัส SPI โดยกำหนดให้ ขา SCK, MOSI และ SS เป็นเอาต์พุต และ MISO เป็นอินพุต

– SPI.beginTransaction()     ฟังก์ชันสำหรับเริ่มต้นใช้งาน SPI โดยใช้พารามิเตอร์จากฟังก์ชัน SPISettings ที่กำหนดไว้

– SPI.endTransmission()      ฟังก์ชันสำหรับสิ้นสุดการใช้งานการสื่อสารอนุกรมแบบ SPI

– SPI. transfer()                ฟังก์ชันสำหรับรับส่งข้อมูลแบบ SPI

– SPI. setBitOrder()           ฟังก์ชันการลำดับข้อมูลมี 2 แบบให้เลือกคือ LSB และ MSB

ตัวอย่างการสื่อสารอนุกรมแบบ SPI กับไอซี MCP3008 Analog to Digital Converter

            สำหรับตัวอย่างการสื่อสารอนุกรมแบบ SPI กับไอซี MCP3008 Analog to Digital Converter เป็นตัวอย่างเริ่มต้นการใช้งานการสื่อสารอนุกรมแบบ SPI ที่ทางทีมงานคิดว่าง่ายและเหมาะสำหรับผู้เริ่มใช้งานมากที่สุด โดยตัวอย่างนี้จะใช้บอร์ด ESPino32 ต่อเข้ากับไอซี MCP3008 10-bit Analog to Digital Converter ผ่านช่องทางการสื่อสารอนุกรมแบบ SPI แล้วทำการอ่านค่า Analog จากขาแอนะล็อกจากขาของไอซี MCP3008

SPI Communication with the MCP3004/3008 using 8-bit segments

จากเอกสารรายละเอียดของไอซี MCP3008 Analog to Digital Converter ต้องใช้ไมโครคอนโทรเลอร์ส่งชุดข้อมูลผ่านช่องทางการสื่อสารอนุกรมแบบ SPI (ขา MOSI) ไปยังตัวไอซี MCP3008 โดยชุดข้อมูลที่ต้องส่งไปมี 3 ชุด คือ ดังภาพ ชุดข้อมูลการสื่อสารของไอซี MCP3008

ชุดข้อมูลการสื่อสารของไอซี MCP3008

โดยสิ่งที่ต้องพิจารณาคือ Control Bit เพราะชุดข้อมูลนี้จะเลือกโหมดของ Analog to Digital Converter และเลือกขาที่ใช้งานในการอ่านค่า ADC ตามตาราง Control Bit

Control Bit

ตัวอย่างเช่นเลือกใช้ ADC ขา CH0 ในโหมด Single จะต้องส่งชุดข้อมูลของ Control Bit ไป ดังรูป เลือกใช้งาน ADC ch0 ในโหม Single

เลือกใช้งาน ADC ch0 ในโหมด Single

หลังจากที่ส่งชุดคำสั่งไปแล้วจะมีข้อมูลตอบกลับมาทางขา MISO เป็นข้อมูล 10 Bit ดังรูป เอาต์พุตจากไอซี MCP3008

เอาต์พุตจากไอซี MCP3008

จากนั้นนำชุดข้อมูลที่ได้ มาคำนวณเป็นตัวค่าแอนะล็อกได้ ดังรูป DIGITAL OUTPUT CODE CALCULATION

ต่อวงจรดังรูป บอร์ด ESPino32 ใช้งานไอซี MCP3008 Analog to Digital Converter

บอร์ด ESPino32 ใช้งานไอซี MCP3008 Analog to Digital Converter

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         เรียกใช้งานไลบรารี่ SPI
บรรทัดที่ 2         ประกาศตัวแปร result ชนิด Integer
บรรทัดที่ 3         สร้างฟังก์ชัน setup()
บรรทัดที่ 4         เปิดฟังก์ชัน setup()
บรรทัดที่ 5         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 6         ใช้งาน SPI.begin() มีผลให้ SCK, MOSI และ SS เป็นเอาต์พุต และ MISO เป็นอินพุต
บรรทัดที่ 7         ตั้งค่าพารามิเตอร์ต่างๆสำหรับการสื่อสารอนุกรมแบบ SPI โดยกำหนดให้มี Clock Frequency อยู่ที่ 1 ลำดับข้อมูลแบบ MSBFIRST และใช้งาน SPIMODE0
บรรทัดที่ 8         กำหนดให้ขา SS เป็น OUTPUT
บรรทัดที่ 9         ปิดฟังก์ชัน setup()
บรรทัดที่ 10        สร้างฟังก์ชัน loop()
บรรทัดที่ 11        เปิดฟังก์ชัน loop()
บรรทัดที่ 12        กำหนดให้ขา SS มีสถานะเป็น LOW (เลือกใช้งาน Slave1)
บรรทัดที่ 13        ส่งข้อมูล 0x01 (Start Bit) ออกทางขา MOSI
บรรทัดที่ 14        ส่งข้อมูล 0x80 (Control Bit) ออกทางขา MOSI
บรรทัดที่ 15        นำชุดข้อมูลที่ได้จากขา MISO & 0x03 จากนั้นเลื่อนบิตไปทางซ้าย 8 ครั้ง มาเก็บไว้ในตัวแปร result
บรรทัดที่ 16        ส่งข้อมูล 0x00 ออกทางขา MOSI จากนั้นนำค่าในตัวแปร result | ชุดข้อมูลจากขา MISO มาเก็บไว้ในตัวแปร result
บรรทัดที่ 17        แสดงค่าในตัวแปร result * 5.0 / 1023 ในรูปแบบเลขฐาน 10 และขึ้นบรรทัดใหม่ออกทาง Serial Monitor
บรรทัดที่ 18        กำหนดให้ขา SS มีสถานะเป็น HIGH (เลิกใช้งาน Slave1)
บรรทัดที่ 19        หน่วงเวลา 10 มิลลิวินาที
บรรทัดที่ 20        ปิดฟังก์ชัน loop()

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะใช้งานฟังก์ชัน SPI.begin() เพื่อเป็นการใช้งานขา SCK, MOSI และ SS เป็นเอาต์พุต และ MISO เป็นอินพุต จากนั้นโปรแกรมจะกำหนดให้ขา SS มีสถานะเป็น LOW เพื่อเลือกติดต่อสื่อสารกับ Slave (MCP3008) แล้วทำการส่งชุด ข้อมูลไป 3 ชุดคือ 0x01, 0x80 และ 0x00 เพื่อเลือกอ่านค่าแอนะล็อกจากช่อง ADC0 ที่ต่อกับขาแอนะล็อกจากตัวต้านทานปรับค่าได้ จะได้ชุดข้อมูลมาตามรูป รูปสัญญาณขณะบอร์ด ESPino32 สื่อสารอนุกรมแบบ SPI กับไอซี MCP3008 จากนั้นโปรแกรมจะทำการคำนวณค่าแอนะล็อกออกมาเป็นค่าความต่างศักย์ แล้วแสดงผลออกมาทาง Serial Monitor ดังรูป ผลลัพธ์ การสื่อสารอนุกรมแบบ SPI กับไอซี MCP3008

รูปสัญญาณขณะบอร์ด ESPino32 สื่อสารอนุกรมแบบ SPI กับไอซี MCP3008 (ค่าแอนะล็อกประมาณ 3.3V)
ผลลัพธ์ การสื่อสารอนุกรมแบบ SPI กับไอซี MCP3008

        สำหรับบทความ ESPino32 ในตอนที่ 9 การสื่อสารอนุกรมแบบ SPI เป็นหนึ่งในรูปแบบการสื่อสารที่ถือว่าได้รับความนิยมในการเชื่อมต่อระหว่างบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ต่างๆ ลักษณะจะคล้ายๆกับการสื่อสารอนุกรมแบบ I2C แต่จะไม่มีรูปแบบที่เป็นมาตรฐานสากลการใช้งานจึงจำเป็นต้องอ้างอิงกับเอกสารรายละเอียดของอุปกรณ์ที่ใช้ร่วมกัน ในบทความนี้จะเป็นพื้นฐานสำหรับการใช้งานการสื่อสารอนุกรมแบบ SPI ในการสื่อสารกับอุปกรณ์ต่างๆ ซึ่งปัจจุบันพื้นฐานการเชื่อมต่อสื่อสารอนุกรมแบบ SPI อาจถูกมองข้ามไปเพราะอุปกรณ์ต่างๆส่วนใหญ่มีไลบรารี่สำหรับใช้งานกับอุปกรณ์นั้นๆได้ทันที

ขอขอบคุณข้อมูลอ้างอิงจาก

– https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

– http://ww1.microchip.com/downloads/en/DeviceDoc/21295C.pdf

สารบัญ บทความ ESPino32