[CẦN HỖ TRỢ] Về việc giao tiếp I2C giữa thiết bị 5v và 3.3v

cenakhoa

em thích màu hồng
hiện giờ em đang cần con chip PCA9306 của TI có chức năng sau đây

http://electronicctu.net/Thread-Giao-tiep-I2C-giua-thiet-bi-3-3Volt-va-5Volt.html

=> em đang cần gấp để tham gia cuộc thi D.I.D của khoa điện mình nhưng Việt Nam ko bán và ship hàng chắc cũng ko kịp, em ko ngờ tới tình huống này. Mong các anh, các chị, các bạn, ai có con này hoặc một module hay ic tương tự hỗ trợ em. Em xin cám ơn !!!
 

Manhdd

Cố Vấn CLB
Staff member
Bạn cần ứng dụng gì vậy? Giao tiếp với DS1307 à?
 

ĐỨC HUẤN

Thành Viên PIF
đúng vậy. lúc trước mình cũng không để ý tới, bây giờ mới thấy.muốn giao tiếp I2C giữa 1 con VDK 5V và 1 con VDK 3.3 thì làm thế nào? mong các anh chị và các bạn chỉ giáo với.
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Nếu mình nhớ không nhầm thì cứ gắn bình thường (gắn thêm 2 trở kéo lên vào nguồn 3.3V) vậy là ok
 
Nếu mình nhớ không nhầm thì cứ gắn bình thường (gắn thêm 2 trở kéo lên vào nguồn 3.3V) vậy là ok
con nào có 5V tolerance mới giao tiếp thẳng với 5V dc, chứ msp430g2 value line max voltage output có 3V6 à anh Hiếu ơi:|
 

Manhdd

Cố Vấn CLB
Staff member
Vậy có cách "chữa cháy" đây: 2 điện trở kéo lên vào nguồn 5V của DS1307.

Cách này tuy có hơi "ngu" một chút khi kéo điện áp trên SDL và SDA của MSP430 lên 5V, nhưng hình như không để lại hậu quả gì.

Kinh nghiệm là mình có thử rồi: Kéo 2 dây SDL và SDA trên Launch pad qua mạch DS1307. Giao tiếp bình thường. Gỡ ra không thấy gì khác lạ. Chỉ nhận ra là mình vừa mới "ngu" thôi :d
 

cowboyhere

Cố Vấn CLB
Staff member
em cũng góp chút ngu kiến cho cenakhoa có thêm lựa chọn: con 74ls07 chuyển mức logic 1(5vttl) ra mức lo gic 1(mos) chắc sẽ chuyển thành 3.3V được, còn mức 0 thì là 0 luôn.
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
con nào có 5V tolerance mới giao tiếp thẳng với 5V dc, chứ msp430g2 value line max voltage output có 3V6 à anh Hiếu ơi:|
E cứ gắn như a nói thử xem, gắn 2 trở kéo lên vào nguồn của Lauchpad...được hay không là biết liền :D :D :D, tin a đi
 

cenakhoa

em thích màu hồng
mình giờ hok biết sao nữa, ko biết là phần cứng sai hay phần mềm sai đây :((( hay mình post code đọc ds1307 lên nhé
 

cenakhoa

em thích màu hồng
Anh em xem code mình viết cho module uscib0 i2c đúng chưa,mấy ngày nay làm ko đc buồn quá trời
phần hiển thị đảm bảo ko sai, anh em xem dùm phần đọc từ 1307 về

PHP:
#include <msp430g2553.h>
#include "ds1307.h"
#include "lcd.h"

unsigned char data_i2c[8];
// SU DUNG MODULE B0

//#################################################################################################################################

void i2c_init(void)
{
	 //make sure that UCSWRST PHAI BANG 1 KHI CONFIG NEU KO SE GAY RA LOI KHO HIEU
	UCB0CTL1 |= UCSWRST;
    P1DIR |= BIT6 + BIT7 ; // Set SCL, SDA  as Output
    P1REN |= BIT6 + BIT7; // enable Pull-Ups or down on SCL and SDA
    P1OUT |= BIT6 + BIT7; // Set Pull-Ups on SCL and SDA
    P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
    P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
    /*
    UCMST Bit 3 Master mode select. When a master loses arbitration in a multi-master environment (UCMM = 1) the
    UCMST bit is automatically cleared and the module acts as slave.
    0 Slave mode
    1 Master mode

    UCMODEx Bits 2-1 USCI Mode. The UCMODEx bits select the synchronous mode when UCSYNC = 1.
    00 3-pin SPI
    01 4-pin SPI (master/slave enabled if STE = 1)
    10 4-pin SPI (master/slave enabled if STE = 0)
    11 I2C mode

    UCSYNC Bit 0 Synchronous mode enable
    0 Asynchronous mode
    1 Synchronous mode*/
    UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
    UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = 0x68;                         // Set slave address DS1307
    UCB0CTL1 ^= UCSWRST;                     // Clear SW reset, resume operation
}

//#################################################################################################################################

void i2c_timeread(void)
	{
	UCB0CTL1 |= UCTR + UCTXSTT;  // I2C Transmitter
	while(UCTXSTT==0);
	while(UCB0TXIFG==0);
    UCB0TXBUF = 0x00;  // DIA CHI DAU MUON DOC
	while(UCB0TXIFG==0);
    i2c_stop();
	UCB0CTL1 ^= UCTR;  // receiver
	i2c_start();
    while(UCB0RXIFG==0);
	data_i2c[0]=UCB0RXBUF;//giay
    while(UCB0RXIFG==0);
	data_i2c[1]=UCB0RXBUF;//phut
    while(UCB0RXIFG==0);
	data_i2c[2]=UCB0RXBUF;//gio
    while(UCB0RXIFG==0);
	data_i2c[3]=UCB0RXBUF;//thu
    while(UCB0RXIFG==0);
	data_i2c[4]=UCB0RXBUF;//ngay
    while(UCB0RXIFG==0);
	data_i2c[5]=UCB0RXBUF;//thang
    while(UCB0RXIFG==0);
	data_i2c[6]=UCB0RXBUF;//nam
    while(UCB0RXIFG==0);
	data_i2c[7]=UCB0RXBUF; //finish reading, config
    i2c_stop();
	}

//#################################################################################################################################

void i2c_hienthi(void)
{
	lcd_gotoxy(1,0);
	switch(data_i2c[3])
	{
	case 1:
	lcd_puts("SUN");
	break;
	case 2:
	lcd_puts("MON");
	break;
	case 3:
	lcd_puts("TUE");
	break;
	case 4:
	lcd_puts("WED");
	break;
	case 5:
	lcd_puts("THU");
	break;
	case 6:
	lcd_puts("FRI");
	break;
	case 7:
	lcd_puts("SAT");
	break;
	}
	lcd_puts(",");
	lcd_putnumber(data_i2c[4]>>4);
	lcd_putnumber(data_i2c[4]&0x0F);
	lcd_puts("/");
	lcd_putnumber(data_i2c[5]>>4);
	lcd_putnumber(data_i2c[5]&0x0F);
	lcd_puts("/20");
	lcd_putnumber(data_i2c[6]>>4);
	lcd_putnumber(data_i2c[6]&0x0F);
	lcd_gotoxy(8,1);
	lcd_putnumber(data_i2c[2]>>4);
	lcd_putnumber(data_i2c[2]&0x0F);
	lcd_puts(":");
	lcd_putnumber(data_i2c[1]>>4);
	lcd_putnumber(data_i2c[1]&0x0F);
	lcd_puts(":");
	lcd_putnumber(data_i2c[0]>>4);
	lcd_putnumber(data_i2c[0]&0x0F);

}

//#################################################################################################################################

void i2c_start()
{
	UCB0CTL1 |= UCTXSTT;                    // I2C start condition
    while (UCB0CTL1 & UCTXSTT);             // Loop until I2C STT is sent
}

//#################################################################################################################################

void i2c_stop()
{
    UCB0CTL1 |= UCTXSTP;                  // Generate I2C stop condition
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
}

//#################################################################################################################################
 

cenakhoa

em thích màu hồng
Tình hình là với đoạn code trên cắm trực tiếp, điện trở kéo lên 3.3 hay 5v j cũng không chạy cả mọi người à. Mình đã coi data sheet và thấy cái này



mình đã cháy 2 con chip và 1 launch pad rùi, thiệt tình mình không dám liều thêm nữa :((
 
Hình như mình có con này, có gì qua KTX mình cho nhé.....chắc qua lễ vì Phòng mình chuẩn bị đi chơi rồi
 
Một chuyện nữa....bạn chú ý vào Jumper P1.6 chưa? bạn đã rút nó ra chưa? vì Jumper này sẽ kéo chân SCL của MSP xuống Mass đấy.....
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
Tình hình là với đoạn code trên cắm trực tiếp, điện trở kéo lên 3.3 hay 5v j cũng không chạy cả mọi người à. Mình đã coi data sheet và thấy cái này



mình đã cháy 2 con chip và 1 launch pad rùi, thiệt tình mình không dám liều thêm nữa :((
Nếu theo datasheet nguy cơ tèo chíp trên lauchpad là do kéo trở lên nguồn 5V. Còn kéo lên 3V6 thì làm sao mà tèo chip được :D :D :D
 

cenakhoa

em thích màu hồng
Một chuyện nữa....bạn chú ý vào Jumper P1.6 chưa? bạn đã rút nó ra chưa? vì Jumper này sẽ kéo chân SCL của MSP xuống Mass đấy.....
rút ra rùi, bạn có con pca9306 hả, tối nay mình qua mượn đc hem, mình đang cần gấp
 
ok, qua KTX đi..../. nói trước là con này nhỏ chút zị đó, nên mua thêm kính lúp về hàn....kaka
à nếu chưa có số mình thì gọi vào đây 01649770057
 

muahoanang3102

Trứng gà
cái này là do phần cứng chứ không phải phần mềm đâu! mình đã làm nó thành công rồi! phải dùng IC chuyên dụng mới giao tiếp được ổn định. còn dùng cách khác cũng được nhưng hơi lu bu một tí!
 

cenakhoa

em thích màu hồng
vậy bạn gửi lên topic này cái sỏuce code cho mình tham khảo với :D please
 
Top