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

                  Đang tải...
                  X