I2C BUS
1
I2C Bus2
ใช้สองสายได้แก่ Serial Data Line (SDA) ในการรับส่งข้อมูลแบบอนุกรมและ Serial Clock Line (SCL) เป็นสายสัญญาณ Clock สามารถรับส่งข้อมูลด้วยความเร็ว 100 kbits/s
การเชื่อมต่อด้วยระบบบัสแบบ I2C
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
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
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();
}
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);
}
ตัวอย่างโปรแกรม
การใช้งาน PCF8591 ADC/DAC7
การใช้งาน 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”
การใช้งาน 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
การใช้งาน PCF8591 ADC/DAC10
การใช้งาน 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--;
}
}
การใช้งาน 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);
}
}
การใช้งาน Real Time Clock DS130713
Vcc, GND ใช้ต่อกับแหล่งจ่ายไฟเลี้ยงของระบบ
X1, X2 ต่อกับคริสตอลความถี่ 32.768 kHz และ C12.5 pF
VBAT ต่อกับแบตเตอรี่ส ารองขนาด 3 V
SDA, SCL ขาส าหรับสื่อสารแบบ I2C
SQW /OUT เป็นขาส าหรับสร้างคล่ืน square wave
การใช้งาน 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
การใช้งาน Real Time Clock DS130715
การเขียนข้อมูลลง chip
1. เขียนไบต์แอดเดรสของชิปโดยให้ R/W =0
2. เขียนแอดเดรสภายในชิปที่ต้องการ3. เขียนข้อมูลลงแอดเดรสนั้น
การใช้งาน Real Time Clock DS130716
การอ่านข้อมูลจาก chip
1. เขียนไบต์แอดเดรสของชิปโดยให ้R/W =1
2. เขียนแอดเดรสภายในชิปที่ต้องการ
3. อ่านข้อมูลจากแอดเดรสนั้น