Thông báo

Collapse
No announcement yet.

Đọc, ghi dữ liệu cho EEprom thông qua I2C

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

  • Đọc, ghi dữ liệu cho EEprom thông qua I2C

    em đang tìm hiểu cái giao tiếp i2c master mode, về cơ bản thì hiểu được cách làm việc của i2c master mode rồi và quy trình truyền nhận dữ liệu thông qua i2c master mode. sau đó em viết một đoạn code để ghi dữ liệu vào rom sau đó đọc dữ liệu vừa ghi và xuất ra port B nhưng kỳ lạ là em làm mãi mà nó ko chạy, thậm chí xài code mẫu của cả MikroC nó cũng ko chạy luôn. các anh chỉ dùm coi em sai chỗ nào với ah???


    code của các hàm sử dụng trong chương trình

    Code:
    #include <htc.h>
    #include "i2c_887.h"
    
    void i2c_init()
    {
    	// config IO port
    	TRISC3=1;		//pin SCL is input
    	TRISC4=1;		//pin SDA is input
    	
    	// config SSPCON register
    	SSPCON=0x28;	//SSPEN=1;	enable MSSP module
    					//SMP<3:0> = 1000 I2C master mode Baudrate=Fosc/(4*(SSPADD+1))
    	SSPCON2=0x00;
    	
    	// config frequency clock at SCL pin
    	SSPADD=9;		//100Khz with 4Mhz Xtal
    					//Baudrate=Fosc/(4*(SSPADD+1))
    					
    	SMP=1;			//slew rate control disable for 100khz baudrate
    	SSPIF=0;		//clear Master Synchronous Serial Port (MSSP) Interrupt Flag bit
    }
    
    
    //---------------------------------------------------------
    void i2c_waitforidle()
    {
    	while((SSPCON2 & 0x1F)|R_W);	//waiting for idle and writing
    }
    
    
    //---------------------------------------------------------
    void i2c_start()
    {
    	i2c_waitforidle();		//waiting for idle and writing
    	SEN=1;			//initilazing start condition
    	while(SEN);		//waiting for start condition generated
    }
    
    
    //---------------------------------------------------------
    void i2c_stop()
    {
    	i2c_waitforidle();		//waiting for idle and writing
    	PEN=1;			//initilazing stop condition
    	while(PEN);		//waiting for stop condition generated
    }
    
    
    //---------------------------------------------------------
    void i2c_restart()
    {
    	i2c_waitforidle();		//waiting for idle and writing
    	RSEN=1;			//initilazing Repeat start condition
    	while(RSEN);	//waiting for Restart condition generated
    }
    
    	
    //---------------------------------------------------------
    unsigned char i2c_write(unsigned char data)
    {
    	i2c_waitforidle();		//waiting for idle and writing
    	WCOL=0;			//not transmit data when transmission mode not ready
    	SSPBUF=data;	//send data to SSPBUFF
    	asm("nop");		//waiting for data transmission is completed
    	asm("nop");
    	asm("nop");
    	
    	return (!ACKSTAT);	//return '1' if transmission is acknowledge, everything is ok
    }
    
    
    //---------------------------------------------------------
    unsigned char i2c_read(unsigned char ack)
    {
    	unsigned char data;
    	
    	i2c_waitforidle();		//waiting for idle and writing
    	SSPOV=0;		//not allowed to receive new data while old data is not being read
    	RCEN=1;			//enable receive data
    	while(RCEN);	//waiting for data receiving
    	
    	data=SSPBUF;	//read data
    	
    	ACKDT=ack;		//ack = 1: Not ACK; ack = 0: ACK
    	ACKEN=1;		//acknowledge sequence enable
    	while(ACKEN);	//waiting for ACK signal generated
    	
    	return data;
    }

    chương trình chính:

    Code:
    //*********************************************************
    #include <htc.h>
    #include "i2c_887.h"
    
    __CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & LVP_OFF & DEBUG_OFF &
    BOREN_OFF & CP_ON & CPD_ON & FCMEN_OFF & IESO_OFF);	//1st config. word
    __CONFIG(BOR4V_BOR21V);								//2nd config. word
    
    #define _XTAL_FREQ 4000000		// XTAL 4MHz
    
    
    /******************************************************************************************/
    void main()
    {
    	unsigned char data=0;
    	ANSEL=0;
    	ANSELH=0;
    	
    	TRISB=0;
    	PORTB=0;
    	
    	i2c_init();
    	i2c_start();
    	i2c_write(0xa0);	//truyen dia chi eeprom: 7-bit address + w(0)
    	i2c_write(0x00);	//truyen dia chi thanh ghi cua eeprom
    	i2c_write(0xAA);	//ghi du lieu 0xAA vao eeprom	
    	i2c_stop();
    	
    	__delay_ms(100);
    	__delay_ms(100);
    	
    	i2c_start();
    	i2c_write(0xa0);	//truyen dia chi eeprom: 7-bit address + w(0)
    	i2c_write(0x00);	//truyen dia chi thanh ghi cua eeprom
    	i2c_restart();		//tao dieu kien restart
    	i2c_write(0xa1);	//truyen dia chi eeprom: 7-bit address + R(1)
    	data=i2c_read(1);	//doc du lieu tu eeprom
    	i2c_stop();
    	
    	while(1)
    	{
    		PORTB=data;
    	}
    }

    code mẫu của MikroC
    Code:
    void main(){
      ANSEL  = 0;                // Configure AN pins as digital I/O
      ANSELH = 0;
      PORTB = 0;
      TRISB = 0;                 // Configure PORTB as output
    
      I2C1_Init(100000);         // initialize I2C communication
      I2C1_Start();              // issue I2C start signal
      I2C1_Wr(0xA0);             // send byte via I2C  (device address + W)
      I2C1_Wr(2);                // send byte (address of EEPROM location)
      I2C1_Wr(0xAA);             // send data (data to be written)
      I2C1_Stop();               // issue I2C stop signal
    
      Delay_100ms();
    
      I2C1_Start();              // issue I2C start signal
      I2C1_Wr(0xA0);             // send byte via I2C  (device address + W)
      I2C1_Wr(2);                // send byte (data address)
      I2C1_Repeated_Start();     // issue I2C signal repeated start
      I2C1_Wr(0xA1);             // send byte (device address + R)
      PORTB = I2C1_Rd(0u);       // Read the data (NO acknowledge)
      I2C1_Stop();               // issue I2C stop signal
    }
    và chả cái nào chịu chạy, em mô phỏng bằng proteus, và cả mạch thực tế
    Attached Files
    Last edited by xe đạp; 11-09-2012, 09:46.

  • #2
    ko đưa mạch mô phỏng lên, bạn dùng EEPROM bạn set địa chỉ cho EEPROM đúng chưa

    Comment


    • #3
      địa chỉ rom đảm bảo đúng anh ah

      Comment


      • #4
        đưa mạch của bạn lên xem @@

        Comment


        • #5
          em update lại cái mạch rồi đấy anh

          Comment


          • #6
            WP nối GND thử xem

            Comment


            • #7
              thử hết rồi anh ah, nói chung là mãi mà chưa làm được cái I2C

              Comment


              • #8
                mình ko biết nhiều về HTC nên cũng bó tay,

                Comment


                • #9
                  Mình thì ít khi dùng I2C cứng nếu tốc độ không yêu cầu cao ... toàn dùng I2C mềm ( vì chân I/O nào làm I2C cũng được hết ) . MikroC của bạn nếu là loại " chùa " thì có thể bị lỗi . Bạn dùng I2C mềm đi , chắc đảm bảo là chạy !
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    vừa làm xong quả i2c mềm, đúng là chạy thật, nhưng mà dùng pic có i2c cứng mà ko xài kể cũng phí

                    Comment


                    • #11
                      Nguyên văn bởi xe đạp Xem bài viết
                      vừa làm xong quả i2c mềm, đúng là chạy thật, nhưng mà dùng pic có i2c cứng mà ko xài kể cũng phí
                      Chào bác Xe đạp, Mình cũng sử dụng Mikroe, cũng sử dụng i2c mềm để đọc và ghi dữ liệu lên rom M24C02 sử dụng AT89C52 như bác Quế Dương nói, nhưng không đọc và ghi được, chưa tìm ra nguyên nhân tại sao? (mình mới mô phỏng thôi chưa làm phần cứng)
                      Đồng chí làm thế nào để nó chạy ngon có thể chia sẻ với mình được không?
                      trân trọng cảm ơn đồng chí rất nhiều
                      à nếu đồng chí rảnh thì gửi cho mình cái projects của đồng chí xem được không?
                      địa chỉ e-mail của mình nguyenxuantruong@live.com
                      một lần nữa cảm ơn đồng chí và các bạn

                      Comment


                      • #12
                        cái I2C mình có lưu trên blog của mình, bạn có thể vào để xem. còn một lưu ý nữa là nếu làm mạch thật mà dùng I2C cứng, nếu dùng dây nối thì cho dây ngắn tí kẻo nó nhiễu
                        tri-iuh: Software I2C for PIC Microcontroller

                        Comment


                        • #13
                          mình làm lại rồi, nhưng mà thế này, không hiểu tại sao khi mình chạy mô phỏng thì write được nhưng mà read nó toàn kết quả là ff hết , đồng thời ACK =1? tại sao thế nhỉ, chắc là phải làm phần cứng thật xem thế nào thôi.
                          một lần nữa cảm ơn bạn Xe đạp rất nhiều, chúc bạn có nhiều sức khỏe, vui vẻ, viên mãn
                          Trân trọng!..
                          Xuân Trường

                          Comment


                          • #14
                            Đây đoạn code mình viết thử đây, nó write được rồi, nhưng read không được (mình viết bằng ngôn ngữ Passcal) ngôn ngữ C mình không hiểu


                            program i2cmikrolib;

                            // Software I2C connections
                            var Soft_I2C_Scl : sbit at P1_0_bit;
                            var Soft_I2C_Sda : sbit at P1_1_bit;
                            var byte1, byte2 : byte;

                            procedure tre ();
                            begin
                            delay_ms (1000);
                            end;

                            begin
                            Soft_I2C_Init(); // Initialize Soft I2C communication
                            Soft_I2C_Start(); // send start condition
                            Soft_I2C_Write(0xA0); // send address devie + W (0)
                            Soft_I2C_Write(0x00); //send address registor
                            Soft_I2C_Write(0xAA); // send 1 byte data
                            Soft_I2C_Write (0x55); // send 1 byte data
                            Soft_I2C_Stop (); // send stop condition
                            tre ();
                            Soft_I2C_Start(); // send start condition
                            Soft_I2C_Write(0xA0); // send address devic + W (0) 1010 000 0
                            Soft_I2C_Write (0x00); // send address registor
                            Soft_I2C_Start(); // send restart condition
                            Soft_I2C_Write (0xA1); // send address device + R (1) 1010 000 1

                            byte1 := Soft_I2C_Read (0); // read 1 byte
                            byte2 := Soft_I2C_Read (1) ; // read 1 byte
                            Soft_I2C_Stop (); // send stop condition
                            while true do
                            begin
                            P2 := 0;
                            tre ();
                            P2 := byte1;
                            tre ();
                            P2 := byte2;
                            tre ();
                            end;
                            end.
                            và đương nhiên kết quả mô phỏng được cái nàyClick image for larger version

Name:	taisao.jpg
Views:	1
Size:	115.3 KB
ID:	1375748

                            Comment


                            • #15
                              trong MikroC bạn xem phần help sẽ có các ví dụ mẫu về giao tiếp i2c, nó viết khá rõ, có mạch minh họa nữa. bạn có thể tham khảo trong đó mà. mình thích nhất MikroC ở khoản help, rất trực quan

                              Comment

                              Về tác giả

                              Collapse

                              xe đạp Tìm hiểu thêm về xe đạp

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

                              Collapse

                              Đang tải...
                              X