+ All Categories
Home > Documents > I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3...

I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3...

Date post: 24-Mar-2020
Category:
Upload: others
View: 10 times
Download: 0 times
Share this document with a friend
16
I 2 C BUS 1
Transcript
Page 1: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C BUS

1

Page 2: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C Bus2

ใช้สองสายได้แก่ Serial Data Line (SDA) ในการรับส่งข้อมูลแบบอนุกรมและ Serial Clock Line (SCL) เป็นสายสัญญาณ Clock สามารถรับส่งข้อมูลด้วยความเร็ว 100 kbits/s

การเชื่อมต่อด้วยระบบบัสแบบ I2C

Page 3: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C Bus3

สภาวะบนระบบบสั SDA SCL

1. Bus not busy Hi Hi

2. Start data transfer Hi

3. Stop Hi

4. Data valid การรับส่งข้อมูล1บิตใช ้clock 1ลูก ขณะรับ/ส่ง ข้อมูลบน SDA ต้องคงที่และ SCL Hi ข้อมูลบน SDA เปลี่ยนแปลงได้เมื่อ SCL Lo

X

Change

Hi

Lo

5. Acknowledge ตัวรับจะสง่สัญญาณ Ack เมื่อรับข้อมูลครบ 1 byte แล้ว Lo Hi

Page 4: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C Bus4

การเขียนข้อมูล1. ส่งสัญญาณ start เขียน address

ของตัว Slave และ bit ต่่าสุดเป็น 0 (เขียน)

2. เขียน byte ควบคุม (ขึน้อยู่กับอุปกรณ์ว่าจะเป็นค่าอะไร)

3. เขียนข้อมูล4. ส่งสัญญาณ stop

การอ่านข้อมูล1. ส่งสัญญาณ start เขียน address ของ

ตัว Slave และ bit ต่่าสุดเปน็ 0 (เขียน)2. เขียน byte ควบคุม3. ส่งสัญญาณ stop

4. ส่งสัญญาณ start เขียน address อีกครั้ง และ bit ต่่าสุดเป็น 1 (อ่าน)

5. อ่านข้อมูล6. ส่งสัญญาณ stop

Page 5: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C Bus5

void SCL_low(void)

{

SCL = 0;

I2C_delay();

}

/**********************/

Void I2C_stop(void) // Stop

{

SDA = 0;

SCL_high();

SDA = 1;

}

ตัวอย่างโปรแกรม void I2C_start(void) // Start

{

SDA = 1;

SCL_high();

SDA= 0;

I2C_delay();

SCL_low();

SDA = 1;

}

sbit SCL = P1^5;

sbit SDA = P1^6;

void I2C_delay(void)

{

_nop_(); _nop_();

_nop_(); _nop_();

_nop_(); _nop_();

_nop_(); _nop_();

}

/*****************/

void SCL_high(void)

{

SCL = 1;

I2C_delay();

}

Page 6: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

I2C Bus6

Bit I2C_wrbyte (unsigned dat)

// write data , return 0=ok ,

return 1=error

{

unsigned char i;

bit outbit;

for (i=1;i<=8;i++) // send 8

bits

{

outbit = dat & 0x80;

SDA = outbit; // send 1 bit

dat = dat <<1; // shift 1 bit

SCL_high();

SCL_low();

}

SDA = 1;

SCL_high();

outbit = SDA;

SCL_low();

return(outbit);

}

unsigned char

I2C_rdlastbyte()

// read data last byte

{

unsigned char i, dat;

bit inbit;

dat = 0;

for (i=1;i<=8;i++) //

read 8 bits

{

SCL_high();

inbit = SDA; // read 1

bit

dat = dat <<1;

dat = dat | inbit;

SCL_low();

}

SDA = 1;

SCL_high();

SCL_low();

return(dat);

}

unsigned char I2C_rdbyte()

// read data byte

{

unsigned char i, dat;

bit inbit;

dat = 0;

for (i=1;i<=8;i++) //

read 8 bits

{

SCL_high();

inbit = SDA; // read 1

bit

dat = dat <<1;

dat = dat | inbit;

SCL_low();

}

SDA = 0;

SCL_high();

SCL_low();

SDA = 1;

return(dat);

}

ตัวอย่างโปรแกรม

Page 7: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC7

Page 8: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC8

บิต การใชง้าน รูปแบบ

D0 D1

เลือก Channel ของวงจร A/D 00 Channel 1 01 Channel 210 Channel 3 11 Channel 4

D2 เพิ่มค่าการอ่าน Channel อัตโนมัติ ถ้าใชง้านให้เป็นลอจิก “1”

D3 โปรแกรมให้เป็นลอจิก “0”

D4D5

เลือกสัญญาณอินพุต 4 โหมด แสดงในรูปต่อไป

D6 Enable analogue output ถ้าใช้งานจะเป็นลอจิก “1”

D7 โปรแกรมให้เป็นลอจิก “0”

Page 9: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC9

การอ่านข้อมูล

1. ส่งสัญญาณ start เขียน address และ bit ต่่าสุดเป็น 0 (เขียน)

2. เขียน byte ควบคุม3. ส่งสัญญาณ stop

4. ส่งสัญญาณ start เขียน address อีกคร้ัง และ bit ต่่าสุดเป็น 1 (อ่าน)

5. อ่านข้อมูลที่แปลงจาก Analogueเข้ามา

การเขียนขอ้มูล

1. ส่งสัญญาณ start เขียน address และ bit ต่่าสุดเป็น 0 (เขียน)

2. เขียน byte ควบคุม 40H

3. เขียนข้อมูลท่ีต้องการแปลงเป็น Analogueออกไป

4. ส่งสัญญาณ stop

Page 10: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC10

Page 11: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC11

ตัวอย่าง 1 รับข้อมูล analogue แสดงผลทาง LED ที่ต่อกับ port A ของ 8255

#include <reg52.h>

#include <intrins.h>

#include <acsacc.h>

#include <c:i2c.h>

#define port_A XBYTE[0x9000]

//Port A of 8255

#define port_con XBYTE[0x9003]

//Port Control of 8255

unsigned char buf; //ADC input

buffer

unsigned char ADC_add = 0x90;

void delay_1(unsigned int count)

{

unsigned char i;

while(count)

{

for(i=0;i<226;i++)

count--;

}

}

Page 12: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน PCF8591 ADC/DAC12

ตัวอย่าง 2 รับข้อมูล analogue แสดงผลทาง LED ที่ต่อกับ port A ของ 8255

void ADC_READ(unsigned char addr, unsigned char

ad_con, unsigned char *dat)

{

I2C_start();

if(I2C_wrbyte(addr)) //Write address(write)

if(I2C_wrbyte(ad_con)) //Write control byte

I2C_stop();

I2C_start();

if(I2C_wrbyte(addr|0x01)) //Write address(read)

*dat = I2C_rdbyte(); //Read data

I2C_stop();

}

main()

{

port_con = 0x88;

while(1)

{

ADC_READ(ADC_add,0x40,&buf)

port_A = buf;

dalay_1(1000);

}

}

Page 13: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน Real Time Clock DS130713

Vcc, GND ใช้ต่อกับแหล่งจ่ายไฟเลี้ยงของระบบ

X1, X2 ต่อกับคริสตอลความถี่ 32.768 kHz และ C12.5 pF

VBAT ต่อกับแบตเตอรี่ส ารองขนาด 3 V

SDA, SCL ขาส าหรับสื่อสารแบบ I2C

SQW /OUT เป็นขาส าหรับสร้างคล่ืน square wave

Page 14: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน Real Time Clock DS130714

แผนผังหน่วยความจ าและรีจิสเตอร์ภายใน

บิต 7 บิต 6 บิต 5 บิต 4 บิต 3 บิต 2 บิต 1 บิต 0

00H CH วินาที หลักสิบ วินาที 00-59

01H X นาที หลักสิบ นาที 00-59

02H X 12, 24 A/P 10 HR ชั่วโมง 01-12, 00-23

03H X X X X X วัน 1-7

04H X X วันที่ หลักสิบ วันที่ 01-31

05H X เดือน หลักสิบ เดือน 01-12

06H ปี หลักสิบ ปี 00-99

07H OUT X X SQWE X X RS1 RS0

Page 15: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน Real Time Clock DS130715

การเขียนข้อมูลลง chip

1. เขียนไบต์แอดเดรสของชิปโดยให้ R/W =0

2. เขียนแอดเดรสภายในชิปที่ต้องการ3. เขียนข้อมูลลงแอดเดรสนั้น

Page 16: I2C BUS - มหาวิทยาลัยนเรศวร 08.pdf · I2C Bus 3 สภาวะบนระบบบัส SDA SCL 1. Bus not busy Hi Hi 2. Start data transfer Hi

การใช้งาน Real Time Clock DS130716

การอ่านข้อมูลจาก chip

1. เขียนไบต์แอดเดรสของชิปโดยให ้R/W =1

2. เขียนแอดเดรสภายในชิปที่ต้องการ

3. อ่านข้อมูลจากแอดเดรสนั้น


Recommended