Thông báo

Collapse
No announcement yet.

Giao Tiếp I2c

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    Cách gửi xung, đọc và ghi dữ liệu của con 24c64 và 24c00 có giống nhau ko các bác?
    Thanks!

    Comment


    • #32
      Nguyên văn bởi dsdaihiep Xem bài viết
      Mình thấy luồng này khá quan trọng vậy mà lâu rùi chẳng thấy ai vào nhỉ,
      Mình đồng ý với các bác là khi làm với VDK, tuyệt vời và hiệu quả nhất là nên nạp CT vào VDK, thực hành trên mạch thật, chứ chỉ mô phỏng trên Proteus thui thì chưa thật sự là vọc VDK đc
      Mình Share dưới đây những Procedure cần thiết cho giao tiếp IIC mà mình đã sử dụng rất nhiều trong các MẠCH THẬT, khi kết nối 89S52 với EEPROM 24C64 hay như RTC DS1307

      (Nếu các bạn thấy hiệu quả nhớ thanks đấy nha )
      Còn nếu các bạn muốn Code và Schematic đấy đủ cho 1 thử nghiệm như đọc ghi dữ liệu với 24Cxx thì Quote lại nhé.
      Bạn ơi có thể cho mình xin cái schemtic ứng dụng để làm thử ko

      Comment


      • #33
        Nguyên văn bởi dsdaihiep Xem bài viết
        Mình thấy luồng này khá quan trọng vậy mà lâu rùi chẳng thấy ai vào nhỉ,
        Mình đồng ý với các bác là khi làm với VDK, tuyệt vời và hiệu quả nhất là nên nạp CT vào VDK, thực hành trên mạch thật, chứ chỉ mô phỏng trên Proteus thui thì chưa thật sự là vọc VDK đc
        Mình Share dưới đây những Procedure cần thiết cho giao tiếp IIC mà mình đã sử dụng rất nhiều trong các MẠCH THẬT, khi kết nối 89S52 với EEPROM 24C64 hay như RTC DS1307

        (Nếu các bạn thấy hiệu quả nhớ thanks đấy nha )
        Còn nếu các bạn muốn Code và Schematic đấy đủ cho 1 thử nghiệm như đọc ghi dữ liệu với 24Cxx thì Quote lại nhé.
        dsdaihip ui, mình giờ mới bắt đầu tập tành viết về C cho con 89, mình đang tìm hiểu về giao tiếp giữa 89 voi 24c64 theo i2c, bạn có thể cho mình xin ít tài liệu tham khảo, được ví dụ cụ thể càng tốt, bạn cho mình xin sơ đồ kết nối và một chương tình đọc, ghi cụ thể được không? bạn có thể gửi qua mail cho mình với bị vì mình không down được tren này(không biết tại sao, mình đã đăng ký rồi mà) mình cảm ơn rất nhiều!!!!!!!!! địa chỉ mail của mình: dangdongcun@yahoo.com.vn

        Comment


        • #34
          Em vừa mới học lập trình.em đang làm phần cứng về điều khiển led bằng giao thức i2c.mạch của em gồm 1 con master và 1 con slave có địa chỉ 0000001
          em viết ra nhưng nạp vào mạch nó không chạy
          vì đưa ra sơ đồ với mạch thì em làm trên mạch cứng nên không thể đưa lên được.
          em chỉ có thể đưa code lên ,vì em muốn hỏi xem code em viết có bị lỗi không ạ.

          #include <mega32.h>
          #include <delay.h>

          // I2C Bus functions
          #asm
          .equ __i2c_port=0x15 ;PORTC
          .equ __sda_bit=1
          .equ __scl_bit=0
          #endasm
          #include <i2c.h>
          #define cbi(port,bit) port &=~(1<<bit)//xoa bit ve 0
          #define sbi(port,bit) port|=(1<<bit)//set bit len 1
          //sbi (PORTC,0); //trang thai ban dau sda va scl o muc cao
          //sbi (PORTC,1);
          void start_i2c (){
          sbi (PORTC,0);
          sbi (PORTC,1);
          delay_us(10) ;
          cbi (PORTC,1);
          delay_us(10);
          cbi(PORTC,0);
          };
          void stop_i2c (){
          cbi (PORTC,0);
          cbi (PORTC,1);
          sbi (PORTC,0);
          delay_us(10);
          sbi(PORTC,1);
          delay_us(10);
          cbi(PORTC,0);

          };
          void clock_i2c(){
          delay_us(4);
          sbi(PORTC,0);
          delay_us(4);
          cbi(PORTC,0);
          };
          void send_bit(unsigned char x){
          if (x==0x80) sbi(PORTC,1);
          else cbi(PORTC,1);
          clock_i2c();
          };
          void send_byte(unsigned char byte){
          char i,data,temp;
          for (i=0;i<8;i++){
          temp=byte;
          byte=byte<<1;
          data=temp & 0x80;
          send_bit(data); //data o day chinh la gia tri cua bit msb
          }
          };
          /*unsigned char ReadByte(void) //Doc 1 Byte tu ROM
          {
          unsigned char i,bytin,x;
          int read;
          x=PINC.1;
          bytin = 0;
          bytin = bytin |x;
          for(i=0;i<8;i++)
          {
          clock_i2c();
          read = x;
          bytin = bytin << 1;
          bytin = bytin | read;
          }
          return(bytin);
          }*/

          void ack_i2c(){
          cbi(PORTC,1);
          clock_i2c();
          sbi(PORTC,1);
          };
          /*void NoAck_i2c(){
          sbi(PORTC,1);
          clock_i2c();
          cbi(PORTC,1);
          };
          */
          /*unsigned char ReadByte(){
          unsigned char i,bytin;
          int x,read;
          bytin=0x00;
          for (i=0;i<8;i++){
          x=PINC.1;
          read=x;
          bytin=bytin|read;
          clock_i2c();
          bytin=bytin<<1;
          }
          return (bytin);
          }*/
          /*void repeat_start(){
          start_i2c ();
          }; */

          // Declare your global variables here

          void main(void)
          {
          ACSR=0x80;
          SFIOR=0x00;

          // I2C Bus initialization
          //i2c_init();
          DDRA=0x80;
          DDRC=0xC0;
          while (1)
          {
          //sbi (PORTA,0);
          start_i2c();
          send_byte (00000110);
          delay_ms(10);
          send_byte(00000010) ;
          ack_i2c();
          send_byte(10101111);
          ack_i2c();
          delay_us(4);
          sbi (PORTA,0);
          send_byte(00100000);
          ack_i2c();
          send_byte(11000010);
          // delay_ms(10);
          ack_i2c();
          send_byte(11100100);
          // delay_ms(10);
          // NoAck_i2c();
          stop_i2c();
          delay_ms(20);
          };
          }

          Comment


          • #35
            các pác ơi ai có tài liệu viết chương trình cho vdk = C k ?

            Comment


            • #36
              Mình đang làm đề tài về mảng này bạn có thể chia sẻ cùng mình được không !

              Nguyên văn bởi dsdaihiep Xem bài viết
              Mình thấy luồng này khá quan trọng vậy mà lâu rùi chẳng thấy ai vào nhỉ,
              Mình đồng ý với các bác là khi làm với VDK, tuyệt vời và hiệu quả nhất là nên nạp CT vào VDK, thực hành trên mạch thật, chứ chỉ mô phỏng trên Proteus thui thì chưa thật sự là vọc VDK đc
              Mình Share dưới đây những Procedure cần thiết cho giao tiếp IIC mà mình đã sử dụng rất nhiều trong các MẠCH THẬT, khi kết nối 89S52 với EEPROM 24C64 hay như RTC DS1307

              (Nếu các bạn thấy hiệu quả nhớ thanks đấy nha )
              Còn nếu các bạn muốn Code và Schematic đấy đủ cho 1 thử nghiệm như đọc ghi dữ liệu với 24Cxx thì Quote lại nhé.
              Chào bạn " dsdaihiep "
              Mình đang làm đề tài về mảng này bạn có thể chia sẻ cùng mình được không !
              Chân thành cảm ơn bạn !

              thanhxuan_cdt06@yahoo.com.vn

              Comment


              • #37
                Hi,
                Vụ I2C này làm với PIC thì rẹc rẹc nhưng làm với 89 thì cũng vả mồ hôi. Xin gửi các bác đoạn code I2C và cách dùng nó.
                Code:
                #include <reg2051.h>
                //#include <reg52.h>
                //#include <intrins.h>
                //#include "E:\KeilC_uVision4\common.h"
                
                
                sbit SCL = P3^0;
                sbit SDA = P3^1;
                
                
                //extern delay_nop();
                
                
                void delay_nop()
                {
                	_nop_();
                	_nop_();
                	_nop_();
                	_nop_();
                }
                
                
                void i2c_start(void)
                {
                	SDA = 1;
                	delay_nop();
                	SCL = 1;
                	delay_nop();
                	SDA = 0;
                	delay_nop();
                	SCL = 0;
                }
                void i2c_stop(void)
                {
                	SCL = 0;
                	SDA = 0;
                	delay_nop();
                	SCL = 1;
                	delay_nop();
                	SDA = 1;
                }
                unsigned char i2c_read(bit ack)
                {
                	unsigned char data i, result;
                	
                	result = 0;
                	SDA = 1; //select input direction
                	delay_nop();
                	SCL = 0;
                	for(i = 0; i < 8; i++)
                	{
                		delay_nop();
                		SCL = 1;
                		delay_nop();
                		result <<= 1;
                		if(SDA == 1) result++;
                		SCL = 0;
                	}
                	delay_nop();
                	SDA = (ack == 1)? 0:1;
                	delay_nop();
                	SCL = 1;
                	delay_nop();
                	SCL = 0;
                	return result;
                }
                bit i2c_write(unsigned char value)
                {
                	unsigned char data i, temp;
                	bit bdata ack;
                	
                	temp = value;
                	SCL = 0;
                	SCL = 0;
                	for(i = 0; i < 8; i++)
                	{
                		delay_nop();
                		SDA = (temp & 0x80)? 1:0;
                		delay_nop();
                		SCL = 1;
                		SCL = 1;
                		delay_nop();
                		SCL = 0;
                		SCL = 0;
                		temp <<= 1;
                	}
                	SDA = 1;	// read ACK
                	delay_nop();
                	SCL = 1;
                	SCL = 1;
                	ack = SDA;
                	delay_nop();
                	SCL = 0;
                	SCL = 0;
                	return ack;
                }
                Cách dùng nó vào DS1307, nếu dùng cho AT24xx thì thay lại cái khai báo địa chỉ cho đúng.
                Code:
                #include <reg2051.h>
                //#include <reg52.h>
                #include <intrins.h>
                #include "E:\KeilC_uVision4\common.h"
                	  
                #define RTC_SLAVE_ADDRESS	0xD0
                #define RTC_READ_COMMAND	RTC_SLAVE_ADDRESS | 0x01
                #define RTC_WRITE_COMMAND	RTC_SLAVE_ADDRESS
                
                
                /*
                struct Time
                {
                	char second;
                	char minute;
                	char hour;
                	//char day;
                	//char date;
                	//char month;
                	//char year;
                };
                */
                extern i2c_start();
                extern i2c_stop();
                extern bit i2c_write(unsigned char value);
                extern unsigned char i2c_read(bit ack);
                
                
                extern delay_us(unsigned int us);
                /*
                void delay_us(unsigned int us)
                {
                	while(us--);
                }
                */
                extern delay_nop();
                
                
                void DS1307_init() 
                {
                	unsigned char x;
                	
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);	//Write slave address
                	i2c_write(0x00);	
                	i2c_start();	
                	i2c_write(RTC_READ_COMMAND);
                	x = i2c_read(0);	// Read second with NACK
                	i2c_stop();
                	delay_us(10);
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(0x00);	// Go to Second Reggister
                	i2c_write(x & 0x7F);	// start DS1307
                	i2c_stop();
                	
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(0x07);	// Go to Control Reggister
                	i2c_write(0x10);	// configure RTC
                	i2c_stop();
                }
                
                
                struct Time DS1307_get_time()
                {
                	struct Time t;
                	
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);	
                	i2c_write(0x00);		// Go to top of memory
                	i2c_start();	
                	i2c_write(RTC_READ_COMMAND);
                	t.second = i2c_read(1);	// Read with ACK
                	t.minute = i2c_read(1);
                	t.hour = i2c_read(0);
                	i2c_stop();
                	return t;
                }
                /*
                struct Time DS1307_get_date_time()
                {
                	struct Time t;
                	
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);	
                	i2c_write(0x00);		// Go to top of memory
                	i2c_start();	
                	i2c_write(RTC_READ_COMMAND);
                	t.second = i2c_read(1);	// Read with ACK
                	t.minute = i2c_read(1);
                	t.hour = i2c_read(1);
                	t.day = i2c_read(1);
                	t.date = i2c_read(1);
                	t.month = i2c_read(1);
                	t.year = i2c_read(0);
                	i2c_stop();
                	return t;
                }
                *
                void DS1307_set_time(struct Time t)
                {
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(0x00);
                	i2c_write(t.second);
                	i2c_write(t.minute);
                	i2c_write(t.hour);
                	i2c_stop();
                }
                /*
                void DS1307_set_date_time(struct Time t)
                {
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(0x00);
                	i2c_write(t.second);
                	i2c_write(t.minute);
                	i2c_write(t.hour);
                	i2c_write(t.day);
                	i2c_write(t.date);
                	i2c_write(t.month);
                	i2c_write(t.year);
                	i2c_stop();
                }
                */
                /*
                void DS1307_write(char addr, char value)
                {
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(addr);
                	i2c_write(value);
                	i2c_stop();
                }
                unsigned char DS1307_read(char addr)
                {
                	unsigned char value;
                
                
                	i2c_start();
                	i2c_write(RTC_WRITE_COMMAND);
                	i2c_write(addr);
                	i2c_start();
                	i2c_write(RTC_READ_COMMAND);
                	value = i2c_read(0);
                	i2c_stop();
                	return value;
                }
                */
                Chúc các bác thành công.
                Thân ái.
                Đường đến những ngày vinh quang không còn xa
                Con đường chúng ta... chúng ta đã chọn.

                Comment


                • #38
                  Nguyên văn bởi dsdaihiep Xem bài viết
                  Mình thấy luồng này khá quan trọng vậy mà lâu rùi chẳng thấy ai vào nhỉ,
                  Mình đồng ý với các bác là khi làm với VDK, tuyệt vời và hiệu quả nhất là nên nạp CT vào VDK, thực hành trên mạch thật, chứ chỉ mô phỏng trên Proteus thui thì chưa thật sự là vọc VDK đc
                  Mình Share dưới đây những Procedure cần thiết cho giao tiếp IIC mà mình đã sử dụng rất nhiều trong các MẠCH THẬT, khi kết nối 89S52 với EEPROM 24C64 hay như RTC DS1307

                  (Nếu các bạn thấy hiệu quả nhớ thanks đấy nha )
                  Còn nếu các bạn muốn Code và Schematic đấy đủ cho 1 thử nghiệm như đọc ghi dữ liệu với 24Cxx thì Quote lại nhé.
                  BẠN CÓ THỂ GỬI Code và Schematic đấy đủ CHO MÌNH ĐƯỢC KO redarmylfc9@gmail.com

                  Comment

                  Về tác giả

                  Collapse

                  chimgokien Tìm hiểu thêm về chimgokien

                  Bài viết mới nhất

                  Collapse

                  • mèomướp
                    Trả lời cho Công thức điện tử
                    bởi mèomướp
                    Dạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
                    Hôm qua, 21:21
                  • mèomướp
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi mèomướp
                    Dạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
                    Hôm qua, 20:31
                  • yname11
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi yname11
                    Ok , thanks bác đã chỉ...
                    Hôm qua, 15:06
                  • nguyendinhvan
                    Công thức điện tử
                    bởi nguyendinhvan
                    Sau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !

                    Chập thì thay. Cháy thì tháo
                    Làm thì láo. Báo thì hay
                    May thì khoe. Rủi thì bỏ
                    Thành tích nhỏ. Báo thành to
                    Làm cho có. Báo chi li
                    Sai cả li. Báo
                    ...
                    Hôm qua, 00:35
                  • yname11
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi yname11
                    có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
                    25-11-2024, 22:31
                  • mèomướp
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi mèomướp
                    Dạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
                    25-11-2024, 22:14
                  • bactho
                    Trả lời cho Tự làm máy đo Cuộn cảm
                    bởi bactho
                    Hay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
                    25-11-2024, 21:48
                  • yname11
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi yname11
                    màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
                    25-11-2024, 21:43
                  • bactho
                    Trả lời cho các bạn giúp mình về file HEX với!!!
                    bởi bactho
                    Bạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
                    25-11-2024, 21:21
                  • mèomướp
                    Trả lời cho Xin hỏi về màn hình laptop
                    bởi mèomướp
                    Dạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
                    25-11-2024, 20:43
                  Đang tải...
                  X