Saturday, July 4, 2015

MiniProject: LED อัตโนมัติ

        สำหรับมินิโปรเจคที่กลุ่มของข้าพเจ้าได้ทำคือ LED อัตโนมัติ ซึ่งเป็นการใช้งานบอร์ด STM32F4 Discovery ในการควบคุมการทำงานของ led ให้ติดหรือดับตามเวลาที่ต้องการ โดยได้ใช้ RTC Module ET-MINI DS1307 เป็นตัวในการตั้งเวลา สำหรับครั้งแรกของการใช้งานจะต้องตั้งเวลาให้กับ RTC Module ก่อน จากนั้นจึงตั้งให้เวลาให้กับ led

สำหรับรายละเอียดของมินิโปรเจคนี้ เช่น วัตถุประสงค์ ขอบเขตของการทำงาน สามารถดูได้จากลิงค์นี้   http://embededlab.blogspot.com/2015/05/mini-project.html

สำหรับการทำงานทั้งหมดของโปรเจคแบ่งได้เป็น 6 ส่วนดังนี้


ส่วนที่ 1: การใช้งาน 16X2 LCD Display กับบอร์ด STM32F4-Discovery


ภาพ Wiring Diagram


ภาพการต่อวงจรจริง

        สำหรับในส่วนนี้จะเป็นการเชื่อมต่อ 16X2 LCD Display เข้ากับ STM32F4 Discovery ซึ่งจะมีการระบุพินนี้คืออะไร ต่อเข้ากับพินไหนบนบอร์ด นอกจากนี้ยังมีโค้ดตัวอย่างสำหรับในการทดลองซึ่งมีทั้งแบบ Standard Library และแบบ HAL Library โดยสามารถดูรายละเอียดได้จากลิงค์ต่อไปนี้ http://embededlab.blogspot.com/2015/06/16x2-lcd-display-stm32f4-discovery.html

ส่วนที่ 2: การใช้ ET-MINI DS1307 (RTC Module) กับบอร์ด STM32F4-discovery


ภาพ Wiring Diagram


ภาพการต่อวงจรจริง

        สำหรับในส่วนนี้จะเป็นการใช้งาน RTC Module กับบอร์ด STM32F4 Discovery ซึ่งจะมีรายละเอียดเกี่ยวกับพินต่างๆของโมดูลว่าคือพินอะไร ไว้ใช้ทำอะไร และพินที่ต่อเข้ากับ STM32F4 Discovery ในการรับส่งข้อมูลระหว่าง RTC Module กับบอร์ด STM32F4 Discovery จะใช้การส่งแบบ I2C โดยที่บอร์ด STM32F4 จะเป็น Master ทั้งในการรับและการส่งข้อมูล ส่วน RTC Module จะทำหน้าที่เป็น Slave รายละเอียดเพิ่มเติมสามารถดูได้จากลิงค์นี้ http://embededlab.blogspot.com/2015/06/ds1307-rtc-stm32f4-discovery.html

ส่วนที่ 3: โค้ดที่ใช้ในการทดลอง RTC Module
        สำหรับโค้ดที่ใช้ในการทดลอง RTC Module นั้นแบ่งเป็น 2 ส่วนด้วยกันคือ
  • ส่วนแรก จะเป็นการเขียนโค้ดโดยใช้ Standard Library ซึ่งเป็นไลบรารี่ที่ใช้งานกันทั่วไปจึงทำให้มีตัวอย่างการใช้งานค่อนข้างหลากหลาย โดยสามารถดูรายละเอียดฟังก์ชันในการทำงานเพิ่มเติมได้ที่ลิงค์นี้  http://embededlab.blogspot.com/2015/06/ds1307-rtc.html
  • ส่วนที่ 2 จะเป็นการเขียนโค้ดโดยใช้ HAL Library ซึ่งเป็นไลบรารี่ที่มาใหม่ โดยทำให้ง่ายต่อการเชื่อมต่อฮาร์ดแวร์ได้มากขึ้น ยังไม่ค่อยมีคนใช้ จึงหาตัวอย่างการใช้งานได้ค่อยข้างยาก โดยโค้ดที่ใช้ในการทดลองแบบ HAL Library สามารถดูได้จากลิงค์นี้ http://embededlab.blogspot.com/2015/06/miniproject-5-ds1307-hal.html

ส่วนที่ 4: ส่วนของการตั้งเวลา LED ติด/ดับ อัตโนมัติ
        สำหรับในส่วนนี้จะเป็นการตั้งเวลาเปิดปิด led อัตโนมัติโดยใช้ ET-Mini DS1307 RTC Module เป็นตัวในการตั้งเวลา โดยในการตั้งเวลาที่ทดลองจะให้ไฟ led toggle ทุกๆ 5 วินาที สำหรับรายละเอียดต่างๆสามารถดูได้จากลิงค์นี้ http://embededlab.blogspot.com/2015/06/miniproject-4-led.html

ส่วนที่ 5: การทดลองการใช้งาน SPI
        สำหรับในส่วนนี้จะเป็นการทดสอบการใช้งาน SPI บนบอร์ด STM32F4 Discover ได้ทำการทดสอบโดยใช้ Oscilloscope วัดค่าสัญญาณที่ออกมาจากพิน SCK (ในที่นี้ใช้พิน PB13) กับพิน CS (ในที่นี้ใช้พิน PC5) โดยทำการส่งค่าออกไปที่ขา SPI ซึ่งรายละเอียดต่างๆสามารถดูได้จากลิงค์นี้ http://embededlab.blogspot.com/2015/07/miniproject-6-spi.html

ส่วนที่ 6: การใช้งาน ENC28J60 Ethernet Module กับบอร์ด STM32F4 Discovery
        สำหรับในส่วนนี้จะเป็นการทดสอบการใช้งาน ENC28J60 Ethernet Module กับบอร์ด STM32F4 Discovery

Thursday, July 2, 2015

[Miniproject #6] การทดสอบการใช้ SPI

ทดสอบการใช้ SPI

ภาพรวมของ SPI 
          SPI หรือ Serial Peripheral Interface เป็นวิธีการสื่อสารรูปแบบหนึ่ง ที่ใช้ในการติดต่อสื่อสารกับอุปกรณ์ ตัวอย่างเช่น พริ้นเตอร์ กล้องถ่ายรูป เครื่องสแกนเนอร์ และอื่นๆ อีกมามาย ถึงแม้ว่าการสื่อสารของ USB ที่มีฟังก์ชั่นการทำงานที่กว้างกว่า แต่การสื่อสารในรูปแบบ SPI ก็ยังถูกใช้งานกันอยู่ในบาง Application

          SPI ทำงานในรูปแบบที่ให้อุปกรณ์ตัวหนึ่งทำหน้าที่เป็น  MASTER ในขณะที่อีกตัวหนึ่งทำหน้าที่เป็น SLAVE และส่งข้อมูลในโหมด Full-duplex นั่นหมายความว่า สัญญาณสามารถส่งหากันได้ระหว่าง MASTER และ SLAVE ได้อย่างต่อเนื่อง ในการสื่อสารแบบ SPI นี้ ไม่ได้มาตรฐานกำหนดตายตัว ว่าข้อมูลที่ส่งหากันต้องอยู่ในรูปแบบหรือ format แบบไหน เป็นการคิด protocol การสื่อสารกันเอาเอง


โค้ดที่ใช้ในการทดสอบ SPI

  • ส่วนของการกำหนด SPI
  • โค้ดที่ใช้ในการทดสอบ SPI

  • ผลของการทดสอบ โดยวัดจากขา SCK (PIN PB13) และ CS (PIN PC5)




Tuesday, June 30, 2015

[Miniproject #5] การใช้ DS1307 แบบ HAL

การเขียนโค้ด DS1307 (RTC) การเชื่อมต่อ  DS1307 ด้วยไรบารี่ HAL


     ฟังก์ชั่นสำหรับรับและส่งข้อมูลของบอร์ดกับ DS1307 แบ่งออกเป็น 2 ฟังก์ชั่นใหญ่ๆ
  • ฟังก์ชั่นสำหรับเซ็ตเวลาเริ่มต้น คือ void  setTime(uint8_t second_s, uint8_t minute_s, uint8_t hour_s, uint8_t dayOfWeek_s, uint8_t dayOfMonth_s, uint8_t month_s, uint8_t year_s) เป็นฟังก์ชั่นสำหรับการตั้งเวลาเริ่มต้นของโมโดล Ds1307 โดยมีการรับค่าเป็น วินาที, นาที, ชั่วโมง, วัน(จันทร์-อาทิตย์), วันที่, เดือน, ปี  
  • -  การทำงานของฟังก์ชั่น คือ เมื่อฟังก์ชั่นทำการรับค่ามาแล้วจะทำการแปลงค่าที่
        ได้ให้เป็นเลขฐานสอง เพื่อทำการส่งค่าข้อมูลไปยังโมดูลตามลำดับด้วยคำสั่ง 
        HAL_I2C_Master_Transmit และมีการเช็คสถานะการส่งข้อมูลด้วยการ 
        ติด-ดับ ของ  LED

    รูปที่ 1 ลำดับข้อมูลต่างๆในรีจิสเตอร์

    -  รูปแบบของการส่งข้อมูล คือ เริ่มจากการ Transmit ค่า ADDEESS 
       ที่ต้องการส่งข้อมูลไปก่อน จากนั้นจึง Transmit ข้อมูลที่ต้องการส่ง ส่งเรียง
       ต่อกันไปตามลำดับ
รูปที่ 2 รูปแบบการส่งข้อมูลแบบ I2C จากบอร์ดไปยัง DS1307


  • ฟังก์ชั่นสำหรับเก็ตเวลา คือ  readtime(uint8_t address)  และ void GetTime() 
  • - readtime(uint8_t address) เป็นฟังก์ชั่นสำหรับการรับค่าจาก DS1307  
      มายังบอร์ด โดยใช้คำสั่ง HAL_I2C_Master_Receive ในการรับค่า โดยหลัก
      การทำงานของฟังชั่นคือบอร์ดจะ Transmit ไปหาโมดูลว่าต้องการรับค่าจาก  
      ADDEESS ไหนจากนั้นเมื่อมีการตอบ ACK กลับมาจึงทำการ Receive ค่ามา
      จาก DS1307
  

  • void GetTime() เป็นฟังก์ชั่นสำหรับแปลค่าจากเลขฐานสองที่รับมาจาก 
      DS1307 เป็นเลขฐานสิบ และทำการ แสดงค่าออก UART หรือ LCD
รูปที่ 3 รูปแบบการรับข้อมูลแบบ I2C จาก DS1307



  • โค้ดสำหรับการแสดงค่าออกทางซีเรียลมอนิเตอร์


รูปที่ 4 ผลจากการรันโปรแกรม

โหลดไฟล์ได้จาก   ที่นี่

Thursday, June 4, 2015

[Miniproject #4] ส่วนของการตั้งเวลา LED ติด - ดับ อัตโนมัติ



Diagram สำหรับวงจรตั้งเวลา เปิด - ปิดไฟอัตโนมัติ


เงื่อนไขสำหรับโค้ดในการตั้งเวลา LED ติด-ดับ มีดังนี้
  • เงื่อนไขตั้งเวลา Toggle ทุก 5 วินาที

  • เงื่อนไขตั้งเวลา เปิด - ปิด ตามเวลาที่กำหนด

วิดิโอแสดงผลการทำงาน

[Miniproject #3] การเขียนโค้ด DS1307 (RTC)

การเชื่อมต่อ  DS1307 เข้ากับบอร์ด  STM32F4-discovery


วงจร ds1307
รูปที่ 1 การเชื่อมต่อ DS1307 เข้ากับไมโครคอนโทรลเลอร์ด้วยระบบบัสแบบ I2C

        โดยการเขียนโค้ดนั้นจะอ้างอิงจากการส่งข้อมูลแบบ I2C ของ DS1307 ที่กล่าวมาก่อนหน้านี้ ซึ่งจะเป็นการส่งค่าแบบ การโอนถ่านข้อมูลจาก Slave ไปยัง Master  และการรับข้อมูลของ Master จาก Slave

 Data transfer from a master transmitter to a slave receiver
i2c tutorial master to slave


Data transfer from a slave transmitter to a master receiver
i2c tutorial slave to master







โค้ดทั้งหมดสามารถดาวน์โหลดได้ (ไม่ใช้ไรบารี่) ที่นี่

หมายเหตุ
คุณสามารถเลือกใช้  Library DS1307  for STM32F4 ได้จากเว็บต่างๆ ที่มีการเขียนไว้แล้ว เช่น (Standard peripheral) :: http://stm32f4-discovery.com/2014/05/library-15-ds1307-real-time-clock-for-stm32f429-discovery/



[Miniproject #1] การใช้งาน 16X2 LCD Display กับบอร์ด STM32F4-Discovery


          สำหรับอุปกรณ์การแสดงผลนี้มีขนาดเท่ากับ 16X2 แถว หรือสามารถเขียนข้อมูลได้แถวละ 16 ตัวอักษรและมีอยู่ 2 แถว

การเชื่อมต่อขาต่างๆของ LCD 16X2 กับบอร์ด STM32F4


สำหรับขาของ LCD 16X2 นั้นมีด้วยกันทั้งหมด 16 ขาด้วยกัน ซึ่งแต่ละขาอธิบายการต่อได้ดังนี้
  • ขาที่ 1 ขา GND ไว้สำหรับต่อขา ground ของบอร์ดการทดลอง
  • ขาที่ 2 ขา VCC ไว้สำหรับต่อเข้าขา VCC บนบอร์ดการทดลอง (สามารถใช้ได้ทั้ง 3.3V และ 5V)
  • ขาที่ 3 ขา VEE ไว้สำหรับต่อกับตัวต้านทานปรับค่าได้
  • ขาที่ 4 ขา RS คือขา Register Select มีไว้สำหรับเลือกคำสั่งของรีจิสเตอร์ (LOW) และ data register (HIGH)
  • ขาที่ 5 ขา R/W ใช้สำหรับในการเขียนรีจิสเตอร์ (LOW) และอ่านค่าจากรีจิสเตอร์ (HIGH)
  • ขาที่ 6 ขา EN ใช้สำหรับในการส่งข้อมูลไปยังพินต่างๆของข้อมูล 
  • ขาที่ 7-14 เป็นขาสำหรับพินของข้อมูล 8 บิต
  • ขาที่ 15 เป็นขา Backlight VCC (5V) สำหรับต่อเข้ากับขา vcc บนบอร์ดการทดลอง
  • ขาที่ 16 เป็นขา Backlight Ground (0V) สำหรับต่อเข้ากับขา ground บนบอร์ดการทดลอง

โค้ดที่ใช้ในการทดลอง
          สำหรับโค้ดที่ใช้ในการทดลองตอนแรกนั้นจะใช้ไลบรารี่มาตรฐาน (standard library) ซึ่งสามารถหาตัวอย่างได้อย่างแพร่หลาย ซึ่งโค้ดมีดังต่อไปนี้

ก่อนที่จะพูดถึงโค้ด ผมขออธิบายถึงฟังก์ชันในไลบรารี่สำหรับ LCD Display กันก่อนครับ ฟังก์ชันในไลบรารี่จะมีอยู่สองส่วนด้วยกัน คือในส่วนของ private function และ global function
  • เริ่มจาก private function ซึ่งเป็น Low-level functions กันก่อนครับ ใน private function จะประกอบไปด้วยฟังก์ชันดังต่อไปนี้
    1. void lcd_data_line_write(uint8_t data); เป็นฟังก์ชันสำหรับการเขียนข้อมูล
    2. void lcd_Init_HW(void); เป็นฟังก์ชันที่ใช้สำหรับการเริ่มต้นในการต่อพิน I/O เข้ากับ LCD
    3. void lcd_Control_Write(uint8_t data); เป็นฟังก์ชันในการเขียนคำสั่งการควบคุมไปยัง LCD
    4. void lcd_Data_Write(uint8_t data); เป็นฟังก์ชันไว้สำหรับการเขียนข้อมูลเป็นไบต์ไปยังจอ LCD ที่ตำแหน่งปัจจุบัน
  • ต่อมาเป็นส่วนของ global function ซึ่งเป็น High-level functions ประกอบไปด้วยฟังก์ชันดังต่อไปนี้
    1. void lcd_Init(void); เป็นฟังก์ชันที่ใช้ประกาศการเริ่มต้นของ LCD Display
    2. void lcd_Home(void); เป็นฟังก์ชันที่เอาไว้ย้ายเคอร์เซอร์ให้ไปอยู่ที่ Home (มุมซ้ายบน)
    3. void lcd_Clear(void); เป็นฟังก์ชันที่ไว้สำหรับเคลียร์ LCD Display
    4. void lcd_Goto(uint8_t row, uint8_t col); เป็นฟังก์ชันที่ไว้สำหรับย้ายเคอร์เซอร์ไปยังตำแหน่งที่ต้องการ ซึ่งอาจจะไม่ถูกต้องสำหรับทุกๆ LCD Display
    5. void lcd_Print_Data(char* data); เป็นฟังก์ชันที่ไว้สำหรับแสดงค่าชุดของไบรต์บน LCD Display

โค้ดที่ใช้ในการทดลอง
ในส่วนนี้จะเป็นการ include ไฟล์ header ต่างๆ รวมถึงไลบรารี่ของ lcd ที่ใช้ในการทดลอง นอกจากนี้ยังการประกาศให้สามารถแสดงข้อความบนจอ lcd และฟังก์ชัน delay
ในส่วนนี้เป็นการประกาศการใช้งานพิน GPIO (General Purpose Input/Output) ซึ่งพิน PD12, PD13, PD14, PD15 เป็นการประกาศการใช้งานไฟ LED บนบอร์ดการทดลอง ส่วนพิน PC0, PC1, PC2 และ PC3 เป็นการประกาศการใช้งาน Data Pin
ฟังก์ชัน main เริ่มต้นด้วยการเปิดการใช้งาน LCD Display การลบหน้าจอ LCD การตั้งเคอร์เซอร์บนจอ LCD การแสดงข้อความบนจอ LCD รวมไปถึงการใช้ delay
ส่วนนี้เป็นการใช้งานฟังก์ชัน delay
ส่วนนี้เป็นส่วนสำหรับแสดงข้อความบนจอ LCD
แหล่งที่มา: http://icviet.vn/bai-hoc/text-lcd-16x2-voi-stm32f4.html

          สำหรับการทดลองในช่วงต่อมา ได้เปลี่ยนจาก standard library มาใช้ hal (Hardware Abstraction Layer) library ซึ่งเป็นไลบรารี่ที่ได้ถือกำเนิดขึ้นมาในปี 2009 ซึ่งอนุญาติให้เดสก์ท็อปแอพลิเคชันได้ใช้ฮาร์ดแวร์ของระบบโฮสได้ง่ายขึ้น เช่น การใช้งานผ่าน API ซึ่งโค้ดที่ใช้ในการทดลองจะประมาณนี้ครับ

ส่วนนี้เป็นการประกาศ include ไฟล์ header ต่างๆ รวมไปถึงการประกาศ function prototype
ฟังก์ชัน main เป็นการประกาศการใช้งานต่างๆ เช่น HAL Library, GPIO Pin, I2C รวมไปถึงการใช้งานจอ LCD และการแสดงข้อความบนจอ LCD
เป็นการทำให้ข้อความแสดงบนจอ LCD ได้
ฟังก์ชัน SystemClock สำหรับการตั้งค่า RCC
เป็นการประกาศการใช้งาน GPIO Pin

ผลการทดลองการใช้งาน LCD



[Miniproject #2] การใช้ DS1307 (RTC) กับบอร์ด STM32F4-discovery


รายละเอียดของ DS1307 (RTC)


ผลการค้นหารูปภาพสำหรับ ds1307

  ระบบฐานเวลา เป็นสิ่งที่สามารถนำไปใช้ในอุปกรณ์อิเล็กโทนิกส์ได้หลากหลาย ซึ่งภายในไมโครคอนโทรลเลอร์ stm32f4-discovery เองนั้นก็มีไทม์เมอร์สำหรับจับเวลาอยู่แล้ว แต่เนื่องจากไมโครคอนโทรลเลอร์ในบอร์ด stm32 นั้นจะสามาถทำงานได้ก็ต่อเมื่อมีไฟเลี้ยงเท่านั้น ดังนั้นการใช้ไทม์เมอร์ที่ได้จากบอร์ดจึงไม่เหมาะสำหรับการสร้างฐานเวลาแบบ real time ในบางงาน
  1. DS1307 เป็น IC ฐานเวลาที่มีบัส รับ-ส่ง ข้อมูลแบบ I2C ซึ่งเป็นแบบ 2 wire สามารถสื่อสารได้ 2 ทิศทาง
  2. ฐานเวลาของ DS1307 นั้นสามารถเก็บข้อมูล วินาที, นาที, ชั่วโมง, วัน, วันที่, เดือน และปี ได้
  3. ระบบเวลาสามารถทำงานโหมดรูปแบบ 24 ชั่วโมง หรือ 12 ชั่วโมง AM/PM ก็ได้ 
  4. ภายมีระบบตรวจจับแหล่งจ่ายไฟ โดยถ้าแหล่งจ่ายไฟหลักถูกตัดไป DS1307 สามารถสวิตซ์ไปใช้ไฟจากแบตเตอรี่ และทำงานต่อไป โดยที่ยังสามารถรักษาข้อมูลไว้ได้
  5. โครงสร้างมีขาทั้งหมด 8 ขาดังแสดงในรูปที่ 1 และมีรายละเอียดการทำงานของขาต่าง ๆ ดังนี้
ไอซี ds1307
รูปที่ 1 ตำแหน่งขาไอซี RTC DS1307

  • VCC:     ใช้ต่อไฟเลี้ยง +3.3V to +5V
  • GND:    ใช้ต่อกราวด์                                                                   
  • VBAT:  ใช้ต่อกับแบตเตอรี่ 3V เพื่อรักษาการทำงาน ในกรณีที่ไม่มีไฟเลี้ยงจ่าย
  • SDA:     ขารับส่งข้อมูลด้วยระบบบัส I2C
  • SCL:      ขาสัญญาณนาฬิกาสำหรับการรับส่งข้อมูลด้วยระบบบัส I2C
  • SQW/OUT:  ขาเอาต์พุตสัญญาณ Square Wave สามารถเลือกความถี่ได้
  • X1, X2:  ใช้ต่อกับคริสตอลความถี่มาตรฐาน 32.768 kHz เพื่อสร้างฐานเวลาจริง

บัส i2c
รูปที่ 2 การรับส่งข้อมูลผ่านบัส I2C

การรับส่งข้อมูลแบบ I2C นั้นมีข้อกำหนดอยู่ 2 ประการด้วยกันคือ
  1. การรับส่งข้อมูลจะเริ่มขึ้นได้เมื่อบัสมีสถานะว่างเท่านั้น
  2. ในช่วงที่ทำการรับส่งข้อมูลอยู่ สายสัญญาณ SDA ต้องไม่เปลี่ยนสถานะในช่วงที่ SCL มีสถานะเป็นลอจิก “1”  ถ้า SDA มีการเปลี่ยนสถานะในช่วงที่ SCL เป็นลอจิก “1” จะถือว่าเป็นสัญญาณควบคุมการรับส่งข้อมูล (ดังรูปที่ 2)
สถานะของการรับส่งข้อมูลแบบ I2C สามารถแบ่งออกได้เป็น 5 สถานะด้วยกัน
  1. สถานะว่าง (Bus not busy): สัญญาณ SDA และ SCL มีระดับสัญญาณเป็น High
  2. เริ่มส่งข้อมูล (Start data transfer): มีการเปลี่ยนระดับสัญญาณของ SDA จาก High เป็น Low ในขณะที่ SCL มีระดับสัญญาณเป็น High ค้างไว้
  3. หยุดส่งข้อมูล (Stop data transfer): มีการเปลี่ยนระดับสัญญาณของ SDA จาก Low เป็น High ในขณะที่ SCL มีระดับสัญญาณเป็น High ค้างไว้
  4. รับส่งข้อมูล (Data valid): มีการรับส่งข้อมูลผ่านสายสัญญาณ SDA โดยข้อมูลแต่ละบิตจะถูกส่งในช่วงที่ SCL มีระดับเป็น High โดยในช่วงที่ SCL มีสถานะเป็น High อยู่นั้น SDA จะต้องไม่เกิดการเปลี่ยนระดับสัญญาณ   //SDA จะเปลี่ยนระดับของสัญญาณ ในช่วงที่ SCL มีระดับสัญญาณเป็น Low เท่านั้น ตามมาตรฐานการส่งข้อมูล แบบ I2C นี้สามารถส่งข้อมูลด้วยความถี่สัญญาณนาฬิกาสูงสุด 100 kHz ที่โหมดการทำงานธรรมดา และ 400 kHz ที่โหมดการทำงานแบบเร็ว แต่สำหรับ DS1307 สามารถทำงานได้ในโหมดธรรมดาเท่านั้น//
  5. ตอบรับ (Acknowledge): เกิดขึ้นหลังจากที่มีการรับส่งข้อมูลครบแล้ว โดยอุปกรณ์ Master ต้องสร้างสัญญาณ Clock บน SCL เพิ่มอีกลูก อุปกรณ์ที่เป็นตัวรับข้อมูลจะดึงระดับสัญญาณบน SDA ให้เป็น Low เพื่อให้ตัวส่งรับรู้ว่าตัวรับได้รับข้อมูลครบแล้ว
การรับส่งข้อมูลจาก DS1307 กับ Master
       Data transfer from a master transmitter to a slave receiver : การส่งข้อมูลไปยังอุปกรณ์ DS1307 ดังแสดงในรูปที่ 4 ไมโครคอนโทรลเลอร์ต้องสร้างสภาวะ Start ก่อน จากนั้นต้องส่ง Address ของDS1307 ขนาด 7 บิตซึ่งมีค่าเป็น 1101000 และตามด้วยบิตระบุทิศทางของข้อมูล ในกรณีที่เป็นการเขียนข้อมูลลง DS1307 จะต้องเป็น “0” จากนั้นไมโครคอนโทรเลอร์จะต้องส่งตำแหน่ง Address ภายในรีจิสเตอร์ของ DS1307 ที่ต้องการเขียนข้อมูลลง แล้วจึงค่อยเขียนข้อมูลลง โดยในการส่งข้อมูลแต่ละไบต์จะต้องรอบิต Ack จาก DS1307 ทุกไบต์ เมื่อส่งจนครบแล้ว ถึงจะสร้างสภาวะ Stop เพื่อกลับสู่สถานะว่าง

i2c tutorial master to slave
รูปที่ 3 การโอนถ่านข้อมูลจาก Master ไปยัง Slave

       Data transfer from a slave transmitter to a master receiver. : การรับข้อมูลจากอุปกรณ์ Slave ดังแสดงในรูปที่ 5 เริ่มแรกไมโครคอนโทรลเลอร์ต้องสร้างสภาวะ Start ก่อน จากนั้นต้องส่ง Address ของ DS1307 ขนาด 7 บิตซึ่งมีค่าเป็น 1101000 และตามด้วยบิตระทิศทางของข้อมูล ในกรณีที่เป็นการอ่านข้อมูลจาก DS1307 จะต้องเป็น “1” จากนั้นจึงค่อยรับข้อมูลจากอุปกรณ์ Slave ทีละไบต์ โดยตำแหน่งที่อ่านเข้ามาจะขึ้นอยู่กับตำแหน่งรีจิสเตอร์พอยท์เตอร์ ซึ่งจะเป็นตำแหน่งท้ายสุดที่ได้ทำการเขียนข้อมูลไว้ เมื่ออ่านข้อมูลครบแต่ละไบต์อุปกรณ์ Master ต้องส่ง Acknowledge บิตกลับไปให้อุปกรณ์ Slave ด้วย ในกรณีที่เป็นไบต์สุดท้าย อุปกรณ์ Master ต้องส่ง “not acknowledge” กลับไป

i2c tutorial slave to master
รูปที่ 4 การโอนถ่านข้อมูลจาก Slave ไปยัง Master

      ภายใน DS1307 มีรีจิสเตอร์ภายในใช้เก็บข้อมูลเวลาขนาด 7 ไบต์ 00H-06H (ดังแสดงในรูปที่ 5) ข้อมูลเวลาและวันที่จะถูกเก็บอยู่ในรูปของเลขฐาน 10 สามารถเลือกได้ว่าให้ทำงานแบบ 12 ชั่วโมง หรือ 24 ชั่วโมง โดยกำหนดที่บิตที่ 6 ที่แอดเดรส 02H โดยถ้าเป็น “1” จะเป็นการทำงานในโหมด 12 ชั่วโมง และเมื่อเลือกแบบ 12 ชั่วโมง ที่บิต 5 ในแอดเดรส 02H นั้นจะใช้แสดงค่า AM/PM โดยถ้าบิตนี้เป็น “1” จะเป็น PM ในกรณีที่แสดงแบบ 24 ชั่วโมง บิตนี้จะใช้ในการแสดงค่าของหลักสิบในของหน่วยชั่วโมงด้วย  

รีจิสเตอร์ DS1307
รูปที่ 5 รีจิสเตอร์ภายในไอซี DS1307

ที่แอดเดรส 07H เป็นรีจิสเตอร์ควบคุมการทำงานของ SQW/OUT โดยมีรายละเอียดดังนี้
  • OUT (Out control): ใช้ควบคุมเอาต์พุต
  • SQWE (Square Wave Enable): ใช้ควบคุมออสซิลเลเตอร์ภายใน DS1307 โดยถ้าบิตนี้เป็น “1” จะเป็นการเปิดออสซิลเลเตอร์
  • RS (Rate Select): ใช้ควบคุมความถี่ของ Square Wave เมื่อเปิดการทำงานของออสซิเลเตอร์ โดยสามารถปรับเปลี่ยนความถี่ได้