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

                              • nhathung1101
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi nhathung1101
                                Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                                Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                                Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                                Hôm qua, 22:18
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                                Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                                Hôm qua, 14:51
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                                Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                                Hôm qua, 14:39
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                                Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                                Hôm qua, 14:28
                              • bqviet
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi bqviet
                                Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                                21-02-2025, 20:26
                              • mèomướp
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi mèomướp
                                Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                                21-02-2025, 12:32
                              • vi van pham
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi vi van pham
                                Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                                Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                                20-02-2025, 21:31
                              • bqviet
                                Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                bởi bqviet
                                Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                                20-02-2025, 17:22
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.

                                Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...
                                20-02-2025, 11:52
                              • vi van pham
                                Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                bởi vi van pham
                                Uống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?

                                Cái khó bó cái...
                                19-02-2025, 23:05
                              Đang tải...
                              X