- I2C Communication Protocol คืออะไร?
- I2C Communication ทำงานอย่างไร
- จะใช้การสื่อสาร I2C ได้ที่ไหน?
- I2C บน Nuvoton N76E003 - ความต้องการฮาร์ดแวร์
- การเชื่อมต่อ AT24LC64 กับ Nuvoton N76E003 - แผนภาพวงจร
- I2C Pins บน Nuvoton N76E003
- การสื่อสาร I2C ใน N76E003
- การเขียนโปรแกรม N76E003 สำหรับการสื่อสาร I2C
- กะพริบรหัสและเอาต์พุต
ในระบบแอพพลิเคชั่นฝังตัวมากมายไม่มีไมโครคอนโทรลเลอร์ที่สามารถทำกิจกรรมทั้งหมดได้ด้วยตัวเอง ในขั้นตอนของบางครั้งก็มีการติดต่อสื่อสารกับอุปกรณ์อื่น ๆ ในการใช้ข้อมูลร่วมกันมีหลาย ประเภทแตกต่างกันของโปรโตคอลการสื่อสาร ที่จะแบ่งปันข้อมูลเหล่านี้ แต่คนที่ใช้มากที่สุดคือ USART, IIC, SPI และสามารถโปรโตคอลการสื่อสารแต่ละแบบมีข้อดีและข้อเสียของตัวเอง มาเน้นที่ ส่วน IIC กันก่อน เพราะนั่นคือสิ่งที่เราจะเรียนรู้ในบทช่วยสอนนี้ หากคุณยังใหม่ที่นี่ลองดูบทแนะนำ Nuvoton ที่เราได้พูดถึงอุปกรณ์ต่อพ่วงทั้งหมดของไมโครคอนโทรลเลอร์ N76E003 จากบทช่วยสอนการเริ่มต้นใช้งานขั้นพื้นฐาน หากคุณต้องการเรียนรู้วิธีใช้ I2C กับไมโครคอนโทรลเลอร์อื่น ๆ คุณสามารถดูลิงค์ด้านล่างนี้
- วิธีใช้ I2C ใน Arduino: การสื่อสารระหว่างบอร์ด Arduino สองตัว
- การสื่อสาร I2C กับไมโครคอนโทรลเลอร์ PIC PIC16F877
- การเชื่อมต่อ LCD 16X2 กับ ESP32 โดยใช้ I2C
- การสื่อสาร I2C กับ MSP430 Launchpad
- การเชื่อมต่อ LCD กับ NodeMCU โดยไม่ต้องใช้ I2C
- วิธีจัดการการสื่อสารหลายอย่าง (I2C SPI UART) ในโปรแกรมเดียวของ Arduino
I2C เป็นโปรโตคอลการสื่อสารที่สำคัญซึ่งพัฒนาโดย Philips (ปัจจุบันคือ NXP) การใช้โปรโตคอล I2C นี้ MCU สามารถเชื่อมต่อกับอุปกรณ์หลายเครื่องและเริ่มการสื่อสารได้ I2C ใช้งานได้กับสายไฟเพียงสองสายคือ SDA และ SCL โดย SDA ย่อมาจาก Serial data และ SCL ย่อมาจาก Serial Clock อย่างไรก็ตามพินทั้งสองนี้ต้องใช้ตัวต้านทานแบบดึงขึ้นถึงระดับแรงดันไฟฟ้า VCC และด้วยตัวต้านทานแบบดึงขึ้นที่เพียงพอบัสสามารถรองรับอุปกรณ์ 127 เครื่องที่มีที่อยู่เฉพาะ
I2C Communication Protocol คืออะไร?
ระยะ IIC ย่อมาจาก“ วงจรอินเตอร์แบบบูรณาการ ” โดยปกติจะแสดงเป็น I2C หรือ I กำลังสอง C หรือแม้กระทั่งเป็นโปรโตคอลอินเทอร์เฟซ 2 สาย (TWI) ในบางแห่ง แต่ก็มีความหมายเหมือนกัน I2C เป็นโปรโตคอลการสื่อสารแบบซิงโครนัสซึ่งหมายความว่าอุปกรณ์ทั้งสองที่ใช้ข้อมูลร่วมกันจะต้องใช้สัญญาณนาฬิการ่วมกัน มีสายไฟเพียงสองสายในการแบ่งปันข้อมูลซึ่งสายหนึ่งใช้สำหรับสัญญาณนาฬิกาและอีกสายหนึ่งใช้สำหรับส่งและรับข้อมูล
I2C Communication ทำงานอย่างไร
การสื่อสาร I2C เป็นครั้งแรกโดย Phillips ดังที่ได้กล่าวไว้ก่อนหน้านี้ว่ามันมีสองสายโดยสายไฟทั้งสองนี้จะเชื่อมต่อกับอุปกรณ์สองเครื่อง นี่คืออุปกรณ์หนึ่งที่เรียกว่า ต้นแบบ และอุปกรณ์อื่น ๆ ที่เรียกว่า ทาสการสื่อสารควรและจะเกิดขึ้นระหว่างสองคนคือ ปรมาจารย์และทาสเสมอ ข้อดีของการสื่อสารแบบ I2C คือสามารถเชื่อมต่อกับ Master ได้มากกว่าหนึ่ง Slave
การสื่อสารที่สมบูรณ์เกิดขึ้นผ่านสายไฟทั้งสองนี้คือ Serial Clock (SCL) และ Serial Data (SDA)
Serial Clock (SCL): แชร์สัญญาณนาฬิกาที่สร้างโดยต้นแบบกับทาส
Serial Data (SDA): ส่งข้อมูลไปและกลับระหว่าง Master และ Slave
ในช่วงเวลาใดเวลาหนึ่งมีเพียงผู้เชี่ยวชาญเท่านั้นที่จะสามารถเริ่มต้นการสื่อสารได้ เนื่องจากมีทาสมากกว่าหนึ่งคนในรถบัสนายจึงต้องอ้างถึงทาสแต่ละคนโดยใช้ที่อยู่ที่แตกต่างกัน เมื่อระบุเฉพาะคำตอบที่มีที่อยู่นั้นจะตอบกลับพร้อมข้อมูลในขณะที่คนอื่นเงียบ ด้วยวิธีนี้เราสามารถใช้บัสเดียวกันเพื่อสื่อสารกับอุปกรณ์หลายเครื่อง
จะใช้การสื่อสาร I2C ได้ที่ไหน?
การสื่อสาร I2C ใช้สำหรับ การสื่อสารระยะสั้นเท่านั้น แน่นอนว่าเชื่อถือได้ในระดับหนึ่งเนื่องจากมีพัลส์นาฬิกาที่ซิงโครไนซ์เพื่อให้สมาร์ท โปรโตคอลนี้ส่วนใหญ่จะใช้เพื่อสื่อสารกับเซ็นเซอร์หรืออุปกรณ์อื่น ๆ ที่ต้องส่งข้อมูลไปยังผู้เชี่ยวชาญ มีประโยชน์มากเมื่อไมโครคอนโทรลเลอร์ต้องสื่อสารกับโมดูลทาสอื่น ๆ จำนวนมากโดยใช้สายไฟขั้นต่ำเท่านั้น หากคุณกำลังมองหาการสื่อสารระยะไกลคุณควรลองใช้ RS232 และหากคุณกำลังมองหาการสื่อสารที่เชื่อถือได้มากขึ้นคุณควรลองใช้โปรโตคอล SPI
I2C บน Nuvoton N76E003 - ความต้องการฮาร์ดแวร์
เนื่องจากข้อกำหนดของโครงการนี้คือการเรียนรู้การสื่อสาร I2C โดยใช้ N76E003เราจะใช้ EEPROM ซึ่งจะเชื่อมต่อกับสายข้อมูล I2C เราจะจัดเก็บข้อมูลบางส่วนลงใน EEPROM และอ่านข้อมูลเดียวกันและแสดงโดยใช้หน้าจอ UART
เนื่องจากค่าที่จัดเก็บไว้จะถูกพิมพ์ใน UART จึงจำเป็นต้องมีตัวแปลง USB เป็น UART ทุกชนิด คุณยังสามารถดูบทช่วยสอนเกี่ยวกับ UART กับ Nuvoton ได้หากคุณยังใหม่กับการสื่อสาร UART บน N76E003 สำหรับแอปพลิเคชันของเราเราจะใช้ตัวแปลง CP2102 UART เป็น USB นอกเหนือจากข้างต้นเรายังต้องการส่วนประกอบต่อไปนี้ -
- EEPROM 24C02
- ตัวต้านทาน 4.7k 2 ชิ้น
ไม่ต้องพูดถึงนอกเหนือจากองค์ประกอบข้างต้นเราจำเป็นต้องมีคณะกรรมการพัฒนาการ N76E003 ไมโครคอนโทรลเลอร์ตามเช่นเดียวกับNu-Link โปรแกรมเมอร์ นอกจากนี้ยังต้องใช้เขียงหั่นขนมและสายเชื่อมต่อเพื่อเชื่อมต่อส่วนประกอบทั้งหมด
การเชื่อมต่อ AT24LC64 กับ Nuvoton N76E003 - แผนภาพวงจร
ดังที่เราเห็นในแผนผังด้านล่าง EEPROM เชื่อมต่อในสาย I2C พร้อมกับตัวต้านทานแบบดึงขึ้นสองตัว ทางด้านซ้ายสุดจะแสดงการเชื่อมต่ออินเทอร์เฟซการเขียนโปรแกรม
ฉันใช้ breadboard สำหรับ AT24LC64 IC และเชื่อมต่อ IC เข้ากับบอร์ดโปรแกรมเมอร์ nuvoton โดยใช้สายจัมเปอร์ การตั้งค่าฮาร์ดแวร์ของฉันพร้อมกับโปรแกรมเมอร์ nu-ink แสดงไว้ด้านล่าง
I2C Pins บน Nuvoton N76E003
แผนภาพพินของ N76E003 สามารถดูได้จากภาพด้านล่าง -
อย่างที่เราเห็นแต่ละพินมีคุณสมบัติที่แตกต่างกันและแต่ละพินสามารถใช้เพื่อวัตถุประสงค์ต่างๆได้ อย่างไรก็ตามพิน 1.4 ถูกใช้เป็นพิน I2C SDAมันจะสูญเสีย PWM และฟังก์ชันอื่น ๆ แต่นั่นไม่ใช่ปัญหาเนื่องจากไม่จำเป็นต้องใช้ฟังก์ชันอื่นสำหรับโครงการนี้ สิ่งเดียวที่จะเกิดขึ้นสำหรับP1.3 เป็นขา SCL ของ I2C
เนื่องจากพิน I2C ทำหน้าที่เป็น GPIO จึงจำเป็นต้องกำหนดค่า สามารถกำหนดค่าพิน GPIO ทั้งหมดได้ในโหมดที่อธิบายไว้ด้านล่าง
เป็นต่อแผ่นข้อมูล, PxM1.nและPxM2nคือรีจิสเตอร์สองตัวที่ใช้เพื่อกำหนดการควบคุมการทำงานของพอร์ต I / O ในแผ่นข้อมูลระบุว่าในการใช้ฟังก์ชัน I2C จำเป็นต้องใช้โหมด I / O เป็น Open-drain สำหรับการสื่อสารที่เกี่ยวข้องกับ I2C
การสื่อสาร I2C ใน N76E003
อุปกรณ์ต่อพ่วง I2C เป็นสิ่งสำคัญสำหรับหน่วยไมโครคอนโทรลเลอร์ที่รองรับคุณสมบัติ I2C ไมโครคอนโทรลเลอร์หลายประเภทมาพร้อมกับอุปกรณ์ต่อพ่วง I2C ในตัว อย่างไรก็ตามในบางกรณี I2C สามารถกำหนดค่าได้ด้วยตนเองโดยใช้การควบคุมซอฟต์แวร์ซึ่งไม่มีการสนับสนุนฮาร์ดแวร์ที่เกี่ยวข้องกับ I2C (เช่นไมโครคอนโทรลเลอร์ 8051 จำนวนมาก) อย่างไรก็ตาม nuvoton N76E003 มาพร้อมกับการรองรับอุปกรณ์ต่อพ่วง I2C
M76E003 รองรับการทำงานสี่ประเภทในโหมด I2C - Master Transmitter, Master Receiver, Slave Transmitter และ Slave Receiver นอกจากนี้ยังรองรับความเร็วมาตรฐาน (100kbps) และเร็ว (สูงสุด 400kbps) สำหรับสาย I2C I2C ทำงานร่วมกับกฎทั่วไปสองสามข้อในสายสัญญาณ SCL และ SDA
เริ่มต้นและหยุดเงื่อนไข:
ถือเป็นสิ่งสำคัญในการสื่อสาร I2C เมื่อข้อมูลถูกโอนไปยังบรรทัด I2C ข้อมูลจะเริ่มต้นด้วยเงื่อนไขเริ่มต้นและสิ้นสุดด้วยเงื่อนไขหยุด
เงื่อนไขเริ่มต้นคือการเปลี่ยนจากสูงไปต่ำใน SDA เมื่อสาย SCL สูงและเงื่อนไขการหยุดคือการเปลี่ยนจากต่ำไปสูงใน SDA เมื่อสาย SCL สูง เงื่อนไขทั้งสองนี้สร้างขึ้นโดยต้นแบบ (MCU หรือสิ่งใดก็ตามที่ควบคุมอุปกรณ์ทาสอื่น ๆ) สายรถเมล์ยังคงไม่ว่างในสถานะนี้เมื่อเริ่มต้นเงื่อนไขและจะยังคงว่างอีกครั้งเมื่อเริ่มเงื่อนไขการหยุด
เงื่อนไขการเริ่มและหยุดแสดงอย่างดีเยี่ยมในมุมมองของสัญญาณในแผ่นข้อมูล N76E003-
ที่อยู่ 7 บิตพร้อมรูปแบบข้อมูล:
N76E003 รองรับแอดเดรส 7 บิตและรูปแบบข้อมูล หลังจากเริ่มเงื่อนไขการเริ่มต้นอุปกรณ์หลักจะต้องส่งข้อมูลไปยังบรรทัด I2C ข้อมูลแรกเป็นข้อมูลที่สำคัญ หากข้อมูลนี้ไม่ได้สร้างหรือส่งอย่างถูกต้องอุปกรณ์ที่เชื่อมต่อจะไม่ถูกระบุและไม่สามารถทำการสื่อสารเพิ่มเติมได้
ข้อมูลประกอบด้วยที่อยู่ทาสแบบยาว 7 บิตซึ่งแสดงเป็น SLA แอดเดรสแบบยาว 7 บิตนี้ต้องไม่ซ้ำกันสำหรับอุปกรณ์แต่ละเครื่องหากเชื่อมต่ออุปกรณ์หลายเครื่องบนบัส หลังจากที่อยู่ 7 บิตบิตที่ 8 คือบิตทิศทางข้อมูล นั่นหมายความว่าขึ้นอยู่กับบิตที่ 8 มาสเตอร์จะส่งข้อมูลไปยังอุปกรณ์ทาสว่าข้อมูลจะถูกเขียนในอุปกรณ์ทาสหรือข้อมูลจะถูกอ่านจากอุปกรณ์ทาส บิตที่ 8 คือบิต R / W ที่เรียกว่า Read or Write notifier อย่างที่เราทราบกันดีว่าข้อมูล 8 บิตสามารถเป็นได้ 128 ประเภทจึงรองรับอุปกรณ์ 128 เครื่อง แต่ I2C รองรับอุปกรณ์ 127 ประเภทบนบัสเดียวกัน แต่ไม่ใช่ 128 เนื่องจากที่อยู่ 0x00 เป็นที่อยู่ที่สงวนไว้ซึ่งเรียกว่าที่อยู่การโทรทั่วไป หากต้นแบบต้องการส่งข้อมูลไปยังอุปกรณ์ทั้งหมดมันจะอยู่ที่ 0x00 และแต่ละอุปกรณ์จะเล่นซ้ำในลักษณะเดียวกันตามการกำหนดค่าซอฟต์แวร์แต่ละตัว
ดังนั้นการส่งข้อมูลจึงมีลักษณะดังนี้ -
รับทราบ:
ในภาพที่อยู่ข้อมูลด้านบนบิตที่ 9 ตามด้วยบิต R / W เรียกว่าบิตรับทราบ เป็นสิ่งที่สำคัญเนื่องจากการใช้บิตนี้ master หรือ slave จะตอบสนองต่อเครื่องส่งข้อมูลโดยดึงสาย SDA ให้ต่ำ ในการรับบิตรับทราบเครื่องส่งจำเป็นต้องปล่อยสาย SDA
การเขียนโปรแกรม N76E003 สำหรับการสื่อสาร I2C
โปรแกรมทั้งหมดที่ใช้ในบทช่วยสอนนี้สามารถพบได้ที่ด้านล่างของหน้านี้ คำอธิบายของส่วนที่สำคัญในโค้ดมีดังนี้ -
ตั้งค่าพินเป็น Open Drain และกำหนดค่าสำหรับ I2C:
เริ่มจากส่วนพิน I2Cก่อน ตามที่อธิบายไว้ก่อนหน้านี้พอร์ต I2C SCL และ SDA จำเป็นต้องได้รับการกำหนดค่าและตั้งค่าเป็นการกำหนดค่า open-drain การทำเช่นนี้เราจะใช้ ไฟล์ส่วนหัว I2C.h พร้อมกับแฟ้มแหล่งที่มา I2C.c ข้อมูลโค้ดมีลักษณะดังนี้ -
ทำ {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} ในขณะที่ (0)
โค้ดด้านบนกำลังตั้งค่า P13 และ P14 เป็นพิน Open-Drain และ clr_I2CPX ใช้เพื่อเลือก P13 และ P14 เป็นพิน SCL บนพิน P1.3 และ SDA บน P1.4
นี้I2CPXเป็นบิต 0 ของการควบคุม I2C ทะเบียนI2CONถ้า I2C_PX นี้ตั้งค่าเป็น 1 พินจะเปลี่ยนเป็น P0.2 เป็น SCL และ P1.6 เป็น SDA อย่างไรก็ตามเราจะใช้ P13 และ P14 ที่นี่ไม่ได้ใช้พินทางเลือก
ควบคุม I2C ลงทะเบียน I2CON:
I2C control register I2CON ใช้เพื่อควบคุมการทำงานของ I2C บิตแรกคือบิตการเลือกพิน I2C การตั้งค่า 0 กำหนดค่าพิน I2C เป็น P13 และ P14
AA bit คือแฟล็ก Acknowledge assert หากตั้งค่าสถานะ AA ไว้ ACK จะถูกส่งกลับระหว่างพัลส์นาฬิการับทราบของสาย SCL หากถูกล้าง NACK (ระดับสูงบน SDA) จะถูกส่งกลับในช่วงพัลส์นาฬิกาที่รับทราบของสาย SCL
บิตถัดไปคือ SI ซึ่งเป็นอินเตอร์รัปต์สถานะ I2C หากเปิดใช้งานการขัดจังหวะสถานะ I2C ผู้ใช้ควรตรวจสอบการลงทะเบียน I2STAT เพื่อดูว่าขั้นตอนใดผ่านไปแล้วและควรดำเนินการ
STO คือแฟล็ก STOP ที่ตั้งค่าในโหมดหลัก ฮาร์ดแวร์จะล้าง STO โดยอัตโนมัติเมื่อตรวจพบเงื่อนไข STOP
บิตถัดไปคือบิต STA หากตั้งค่าสถานะนี้ I2C จะสร้างเงื่อนไขเริ่มต้นหากบัสว่าง หากบัสไม่ว่าง I2C จะรอเงื่อนไข STOP และสร้างเงื่อนไข START ตามมา หากตั้งค่า STA ในขณะที่ I2C อยู่ในโหมดหลักอยู่แล้วและมีการส่งหรือรับไบต์อย่างน้อยหนึ่งไบต์ I2C จะสร้างเงื่อนไขเริ่มต้นซ้ำ STA จำเป็นต้องล้างซอฟต์แวร์ด้วยตนเอง
สุดท้าย I2CEN คือบัส I2C เปิดหรือปิดบิต
EEPROM 24C02:
ตอนนี้มาถึง 24C02 ชุดรองรับบอร์ดของ N76E003 มีรหัส I2C สำหรับ 24LC64 และสามารถแก้ไขได้อย่างง่ายดาย อย่างไรก็ตามเราจะใช้วิธีง่ายๆในการทำความเข้าใจฟังก์ชัน I2C
หากใครต้องการใช้การเชื่อมต่อแบบละเอียดกับ EEPROM 24C02 ก็สามารถใช้โปรแกรม EEPROM ใน BSP ได้
เราจะเชื่อมต่อ 24C02 ใน I2C เท่านั้นโดยที่ N76E003 จะเป็นมาสเตอร์และ EEPROM จะเป็นทาส ดังนั้นเราจะเขียนข้อมูลใด ๆ ลงในที่อยู่ EEPROM และอ่านข้อมูลเดียวกัน
24C02 EEPROM pinout แสดงไว้ด้านล่าง -
A0, A1 และ A2 เป็นหมุดสำหรับเลือกที่อยู่สามตัว พิน WP เป็นพินป้องกันการเขียนและจำเป็นต้องเชื่อมต่อกับ VSS เพื่อเปิดใช้งานการเขียนใน EEPROM
ฟังก์ชัน Byte Write แสดงอยู่ในภาพด้านล่าง -
วงจรการเขียนทั้งหมดเกิดขึ้นพร้อมกับบิตเริ่มต้น หลังจากนั้นจะต้องส่งไบต์ควบคุม ในไบต์ควบคุมจำเป็นต้องมีสิ่งต่อไปนี้ -
หลังจากบิตเริ่มต้นประกอบด้วยที่อยู่ทาส 1010 เป็นแบบคงที่และ A0, A1 และ A2 เป็นที่อยู่ตามการเชื่อมต่อฮาร์ดแวร์ หากพินทั้งสามเชื่อมต่อกับแหล่งจ่าย GND หรือ VSS จะอ่านว่าเป็น 0 มิฉะนั้นหากเชื่อมต่อกับ VCC จะอ่านว่า 1 ในกรณีของเรา A0, A1 และ A2 ทั้งหมดเชื่อมต่อกับ VSS ดังนั้นทั้งหมดนี้จะเป็น 0
ใช้จ่ายในเงื่อนไขการอ่านหรือเขียน ค่าของแอดเดรสที่มีบิตอ่านหรือเขียนจะเป็น - 0xA0 สำหรับเขียนและ 0xA1 สำหรับการอ่าน ถัดไปคือบิตรับทราบและหลังจากนั้นที่อยู่ 8 บิตจะถูกส่งไปที่ที่ข้อมูลต้องถูกจัดเก็บและสุดท้ายข้อมูลจะถูกจัดเก็บในตำแหน่งที่เกี่ยวข้อง สิ่งเหล่านี้ทำในรูปแบบทีละขั้นตอนในฟังก์ชันหลัก
ฟังก์ชั่นหลักและ While Loop:
โมฆะ main (โมฆะ) {ถ่าน c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // ข้อสำคัญใช้ฟังก์ชัน prinft ต้องตั้งค่า TI = 1; I2C_init (); ในขณะที่ (1) {EEPROM_write (1,0x55); ค = EEPROM_read (1); printf ("\ n ค่าที่อ่านได้คือ% x", c & 0xff); }; }
ฟังก์ชั่นหลักนั้นเรียบง่ายคือการเขียนค่าไปยัง EEPROM อย่างต่อเนื่องในที่อยู่ 1 และอ่านข้อมูล จากนั้นข้อมูลจะถูกพิมพ์โดยใช้ฟังก์ชัน printf printf กำลังพิมพ์ค่าเป็นเลขฐานสิบหก
ฟังก์ชันการเขียน EEPROM ประกอบด้วยสิ่งต่อไปนี้ที่อธิบายไว้ในส่วน EEPROM -
โมฆะ EEPROM_write (ที่อยู่ถ่านที่ไม่ได้ลงชื่อ, ค่าถ่านที่ไม่ได้ลงชื่อ) {I2C_start (); I2C_write (0xA0); I2C_write (ที่อยู่); I2C_write (ค่า); I2C_stop (); }
ฟังก์ชันเริ่มต้นของ I2C ประกอบด้วยสิ่งต่างๆดังต่อไปนี้ -
เป็นโมฆะ I2C_start (โมฆะ) {เวลา int ที่ลงนาม = หมดเวลา; set_STA; clr_SI; ในขณะที่ ((SI == 0) && (เวลา> 0)) {เวลา -; }; }
ในฟังก์ชันนี้สถานะ SI จะถูกตรวจสอบพร้อมกับช่วงหมดเวลาที่กำหนดไว้ล่วงหน้า (กำหนดไว้ใน I2C.h ซึ่งเวลาที่กำหนดไว้ล่วงหน้าถูกตั้งค่าเป็น 1000) ฟังก์ชั่นเริ่มต้นเริ่มต้นด้วยการตั้งค่า STA และล้าง SI
เป็นโมฆะ I2C_stop (โมฆะ) {เวลา int ที่ลงนาม = หมดเวลา; clr_SI; set_STO; ในขณะที่ ((STO == 1) && (เวลา> 0)) {เวลา -; }; }
เช่นเดียวกับฟังก์ชัน Start, stop ถูกใช้ หยุด ฟังก์ชั่นจะเริ่มโดยการตั้งค่า STO ตามด้วยการล้าง SI ฟังก์ชันด้านล่างนี้คือฟังก์ชันอ่าน I2C -
ถ่าน I2C_read ที่ไม่ได้ลงชื่อ (ถ่าน ack_mode ที่ไม่ได้ลงชื่อ) {เวลา int ที่ลงนาม = หมดเวลา; ค่าถ่านที่ไม่ได้ลงนาม = 0x00; set_AA; clr_SI; ในขณะที่ ((SI == 0) && (t> 0)) {เวลา -; }; ค่า = I2DAT; ถ้า (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; ในขณะที่ ((SI == 0) && (t> 0)) {เวลา -; }; } คืนค่า; }
ack_mode และ I2C_NACK ทั้งมีการกำหนดในส่วนหัวของแฟ้ม I2C เป็น 0 และ 1 ตามลำดับ
ในทำนองเดียวกันฟังก์ชันเขียนจะถูกสร้างขึ้น -
เป็นโมฆะ I2C_write (ค่าถ่านที่ไม่ได้ลงชื่อ) {เวลา int ที่ลงนาม = หมดเวลา; I2DAT = ค่า; clr_STA; clr_SI; ในขณะที่ ((SI == 0) && (เวลา> 0)) {เวลา -; }; }
กะพริบรหัสและเอาต์พุต
รหัสส่งคืนคำเตือน 0 และ 0 ข้อผิดพลาดและกะพริบโดยใช้วิธีการกะพริบเริ่มต้นโดย Keil หากคุณเป็นมือใหม่โปรดดูการเริ่มต้นใช้งานบทช่วยสอน nuvoton เพื่อทำความเข้าใจวิธีอัปโหลดโค้ด สามารถดูข้อมูลการรวบรวมโค้ดได้ด้านล่าง
สร้างเป้าหมาย 'I2C_EEPROM' คอมไพล์ I2C_EEPROM.c… คอมไพล์ I2C.c… กำลังเชื่อมโยง… ขนาดโปรแกรม: data = 59.2 xdata = 0 code = 2409 การสร้างไฟล์ hex จาก ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 ข้อผิดพลาด, 0 คำเตือน เวลาในการสร้างที่ผ่านไป: 00:00:04 สรุปชุดสร้าง: สำเร็จ 1 ครั้งล้มเหลว 0 ครั้งข้ามไป 0 ครั้ง - เวลาที่ผ่านไป: 00:00:04
กำลังติดตั้งฮาร์ดแวร์บนเขียงหั่นขนมและทำงานตามที่คาดไว้ ดังที่คุณเห็นในภาพด้านล่างเราสามารถเขียนค่าบน EEPROM และอ่านกลับจากหน่วยความจำและแสดงบนจอภาพอนุกรม
ดูวิดีโอด้านล่างเพื่อสาธิตวิธีการทำงานของบอร์ดสำหรับรหัสนี้ หวังว่าคุณจะสนุกกับบทช่วยสอนและเรียนรู้สิ่งที่เป็นประโยชน์หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่าง คุณยังสามารถใช้ฟอรัมของเราเพื่อโพสต์คำถามทางเทคนิคอื่น ๆ