Thông báo

Collapse
No announcement yet.

Trợ giúp] Dò lỗi trong code giao tiếp MCP3421 (ADC18 bit)

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

  • Trợ giúp] Dò lỗi trong code giao tiếp MCP3421 (ADC18 bit)

    Chào các bác !
    ​Em đang dính quả với MCP3421, không nhận được đúng dữ liệu.
    ​MCU sẽ đọc liên tiếp 3 hoặc 4 byte dữ lieu từ MCP gồm 2 hoặc 3 byte ADC và 1 byte config của MCP cuối cùng.
    ​Tuy nhiên, MCU chỉ nhận được byte đầu tiên trong chuỗi dữ lieu, các byte sau trả về 0xFF.
    Bác nào đi qua cho em xin đôi lời chỉ giáo.
    ​Phía dưới là code của em. Dùng I2C mềm.

    ​Code khởi tạo MCP
    Code:
    void MCP3421Init(){
        SCL=1;
        SDA=1;
        SDA_DIR=1; // giai phong SDA cua duong truyen I2C
    }
    ​
    ​Code hàm Start
    Code:
    void MCP3421Start(){
        SDA_DIR=0; // SDA la pin output
        SDA=0; // keo SDA xuong truoc
        SCL=0; // keo SCL xuong sau
    }
    ​
    ​Code hàm Write
    Code:
    unsigned char MCP3421WriteData(unsigned char data){
        SDA_DIR=0; // SDA la pin output
        for(int i=0;i<8;i++){
            SDA=((data & 0x80) >0 ); // out bit 7
            SCL=0; // keo SCL xuong 0 chuan bi phat xung clock
            SCL=1; // clock
            SCL=0; //
            data<<=1; // dich trai 1 bit
        }
        // set SDA la input de nhan ACK tu MCP
        SDA_DIR=1;
        // phat xung clock xac nhan ACK
        SCL=0;
        SCL=1;
        unsigned char ack = (unsigned char)SDA;
        SCL=0;
        return ack;
    }
    ​
    ​Hàm Read
    Code:
    unsigned char MCP3421ReadData(unsigned char ack){
        SDA_DIR=1; // SDA la chan input de lay du lieu
        unsinged char retval=0;
        for(int i=0;i<8;i++){
            retval<<=1; // dich trai de ghi bit vao bit 0
            SCL=0; // chuan bi clock
            SCL=1; // clock
            retval |= (unsigned char)SDA; // lay bit tra ve
            SCL=0; // ket thuc clock
        }
        if(ack>0){ // neu co yeu cau xuat clock xu ly ACK
            SCL=0;
            SCL=1;
            SCL=0;
        }
        return retval;
    }
    ​
    ​Hàm Stop
    Code:
    void MCP3421Stop(){
        SCL=1; // kéo SCL len truoc
        SDA=1; // keo SDA len sau
    }
    ​
    Setup MCP
    ​Chỗ này có 1 vấn đề là nếu gán sai địa chỉ vẫn có ACK xuất hiện. Theo em được biết thì ACK sẽ xuất hiện do device trùng địa chỉ và xuất ra SDA khi có xung thứ 9 của SCL.
    Code:
    void Setup(){
        MCP3421Init();
        MCP3421Start();
        MCP3421WriteData(0xD0); // dia chi MCP
        MCP3421WriteData(0x9C); // 12 bit ADC, continuous mode, 1V/V
    }
    ​
    ​Nhận data
    Chỗ này chỉ nhận được byte middle biến thiên theo điện áp vào trên MCP, còn các dữ lieu về sau đều là 0xFF.
    Code:
    void Get(){
        MCP3421Start();
        MCP3421WriteData(0xD1); // dia chi MCP + read data
        delay_us(20);
        MCP3421Start(); // re start
        unsigned char midle = MCP3421ReadData(1); // nhan byte ADC midle
        unsigned char low=MCP3421ReadData(1);     // nhan byte ADC low
        unsigned char config = MCP3421ReadData(0); // nhan byte cau hinh cua MCP
        MCP3421Stop();
    }
    ​
    ​PS: Em không thấy mục nào phù hợp bài này nên đặt tạm đây. Mod thấy phù hợp mục khác thì move giúp em nhé !

  • #2
    Nếu bạn chưa cần tốc độ nhanh thì thử cân nhắc MCP3551, ADC 22 bit, trôi nhiệt cực thấp ... hàng khủng nhất của Microchip. Truyền tin với chiếc này dễ hơn nhiều vì là SPI.
    Phần mềm tự do hoặc không dùng máy tính nữa !.

    Comment


    • #3
      Nếu là là MCP... hàng nhái mua ở minh hà thì đừng cố. Làm thế nào nó cũng không chạy đúng được đâu.
      Phần mềm tự do hoặc không dùng máy tính nữa !.

      Comment


      • #4
        Nguyên văn bởi duong_act Xem bài viết
        Chào các bác !
        ​Em đang dính quả với MCP3421, không nhận được đúng dữ liệu.
        ​MCU sẽ đọc liên tiếp 3 hoặc 4 byte dữ lieu từ MCP gồm 2 hoặc 3 byte ADC và 1 byte config của MCP cuối cùng.
        ​Tuy nhiên, MCU chỉ nhận được byte đầu tiên trong chuỗi dữ lieu, các byte sau trả về 0xFF.
        Bác nào đi qua cho em xin đôi lời chỉ giáo.
        ​Phía dưới là code của em. Dùng I2C mềm.

        ​PS: Em không thấy mục nào phù hợp bài này nên đặt tạm đây. Mod thấy phù hợp mục khác thì move giúp em nhé !
        Lúc nhận đc byte đầu thì master có send ACK cho slave chưa?
        Thấy trong timing diagram thì Slave có ACK nó mới send tiếp.
        Trong code chỉ thấy 3 cái Read...

        Comment


        • #5
          Nguyên văn bởi htc2k14 Xem bài viết

          Lúc nhận đc byte đầu thì master có send ACK cho slave chưa?
          Thấy trong timing diagram thì Slave có ACK nó mới send tiếp.
          Trong code chỉ thấy 3 cái Read...
          ​Là thế nào bác ơi ?
          ​Master sẽ xuất ACK hay MCP xuất ACK lúc SCL clock thứ 9 vậy bác ?
          ​Hiện tại em đang để master xuất xung trên SCL còn MCP sẽ xuất mức 0 ra SDA. SCL clock 1 xung thu 9 cho ACK trong mỗi hàm Read rồi.

          Comment


          • #6
            Nguyên văn bởi bqviet Xem bài viết
            Nếu là là MCP... hàng nhái mua ở minh hà thì đừng cố. Làm thế nào nó cũng không chạy đúng được đâu.
            Éc !
            Em mua đúng của Minh Hà luôn bác ơi .

            ​Bác biết chỗ nào bán hàng zin MCP3421, MCP3551, hay MCP3422 không chỉ em phát.
            Đang nước sôi lửa bỏng mà gặp nhái nữa chắc em toi.

            Comment


            • #7
              bqviet. htc2k14 :
              Mới sáng sớm em lại mò vào đây cảm ơn 2 bác !

              htc2k14 Nhờ bác nhắc về ACK em đã sửa ngay chỗ này. Lúc trước em chờ ACK từ MCP, sau sửa lại cho MASTER phát ACK thì đã nhận đủ dữ liệu rồi nhé !

              bqviet. Cảm ơn bác nhắc về MCP3551 và chất lượng MCP3421 dỏm, em sẽ tìm hiểu thêm con này. MCP3421 giờ đã chạy rồi, chất lượng chắc em phải kiểm chứng thêm bác ạ.

              Comment


              • #8
                Nguyên văn bởi duong_act Xem bài viết
                htc2k14 :
                Mới sáng sớm em lại mò vào đây cảm ơn 2 bác !

                htc2k14 Nhờ bác nhắc về ACK em đã sửa ngay chỗ này. Lúc trước em chờ ACK từ MCP, sau sửa lại cho MASTER phát ACK thì đã nhận đủ dữ liệu rồi nhé !
                Ò vì thấy trong timing diagram nó chỉ như thế nên đoán chắc là bạn quên thêm vào chứ nếu chip hư thì đã ko nhận đc byte đầu.

                Comment


                • #9
                  Nguyên văn bởi htc2k14 Xem bài viết

                  Ò vì thấy trong timing diagram nó chỉ như thế nên đoán chắc là bạn quên thêm vào chứ nếu chip hư thì đã ko nhận đc byte đầu.
                  ​Thực ra mình đã xem khá kỹ cái timing đó rồi và cũng đã thấy chỗ đó có ACK.
                  Nhưng lại nhầm ở chỗ đáng lẽ master sẽ xuất ACK ra ở xung thứ 9 thì mình lại chờ ACK từ MCP.
                  Kết quả là MCP và master cùng chờ

                  Comment


                  • #10
                    Ku còn may chán. Anh đặt con MAX 6675 3 chỗ không chạy được. Cuối cùng đặt chỗ ku Tuấn (Hoàng Phát) ok luôn. Anh khuyên ku lần sau đặt hàng chỗ này.
                    Đêm nay tớ không ngủ - ngày mai tớ ngủ bù

                    Comment


                    • #11
                      Nguyên văn bởi nhathung1101 Xem bài viết
                      Ku còn may chán. Anh đặt con MAX 6675 3 chỗ không chạy được. Cuối cùng đặt chỗ ku Tuấn (Hoàng Phát) ok luôn. Anh khuyên ku lần sau đặt hàng chỗ này.
                      Cảm ơn bác !
                      Em sẽ tham khảo thêm

                      Comment


                      • #12
                        Ò, mình nghĩ bạn cũng kinh nghiệm nhiều vs dòng PIC này nên chắc có vđề chỉ là thiếu sót chút thôi.

                        Comment


                        • #13
                          Nguyên văn bởi htc2k14 Xem bài viết
                          Ò, mình nghĩ bạn cũng kinh nghiệm nhiều vs dòng PIC này nên chắc có vđề chỉ là thiếu sót chút thôi.
                          Pic thì mình không vấn đề gì. Còn con MCP này là ADC mình chơi quả liều. Chưa dùng bao giờ nhưng chơi dự án luôn

                          Comment


                          • #14
                            Nguyên văn bởi duong_act Xem bài viết
                            Pic thì mình không vấn đề gì. Còn con MCP này là ADC mình chơi quả liều. Chưa dùng bao giờ nhưng chơi dự án luôn
                            Mà vì sao phải dùng giao thức này? Thấy cũng ít người dùng nó mà.

                            Comment


                            • #15
                              Nguyên văn bởi htc2k14 Xem bài viết

                              Mà vì sao phải dùng giao thức này? Thấy cũng ít người dùng nó mà.
                              Mình cần một ADC tầm >14 bit, để có thể đọc được điện áp trên 1 cảm biến khoảng cách có giới hạn 12mm, độ chính xác 1um hay 0.5um gì đó.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X