Thông báo

Collapse
No announcement yet.

cần giúp đỡ về PIC18F2550 !!!

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

  • cần giúp đỡ về PIC18F2550 !!!

    Tình hình là em đang nghiên cứu con PIC8F2550 về giao tiếp USB, và em cũng hình dung được một chút về USB, nhưng em không hiểu ở chỗ con PIC8F2550 nó nhận ( hoặc ghi ) dữ liệu và cất vào ở đâu ?
    Trong datasheet thì em thấy nó có hướng dẫn mô tả Endpoint và khoảng trống dành cho Endpoint, vậy có phải khoảng trống này dành để lưu trữ dữ liệu nhận được ( hoặc ghi ) vào đây? nếu dữ liệu là được lưu trữ trong khoảng trống này sau khi nhận dữ liệu cũng như là viết dữ liệu vào đây để truyền đi, thì làm cách nào để truy cập vào khoảng trống này để viết ( hoặc đọc ) dữ liệu, vì khoảng trống này là do người sử dụng định nghĩa ?
    Và trong datasheet cũng có cái SPP đọc thấy thì nó có 2 chế độ: CPU hoặc SIE. SIE thì nó bảo là chỉ dành cho truyền dẫn đẳng thời hoặc dữ liệu lớn. CPU thì em không rõ lắm. Vậy dữ liệu có thể đọc hoặc ghi trong SPP này không? và nếu được thì ở chế độ nào?

  • #2
    hì, theo tôi hiểu là nó quản lý theo ống pipe, như bạn nói là endpoint điểm cuối để xác định mà nhận hay là truyền .
    trong pic này có 1 bộ nhớ RAM để lưu bạn ạ.
    Nếu code bằng CCS thì bạn có thể chơi Bulk bằng cách dùng dll của Windriver tạo ra như anh Hưng (HVKTQS) hướng dẫn.
    Hoặc có thể chơi HID nếu code với MikroC
    Việc quản lý nhận và truyền thì compiler đã hộ trợ sẵn rồi, chủ yếu là làm việc trên PC
    Với HID có thể chơi API của Microsoft
    Còn với lớp khác có thể là WinUSB, ko thì dll của Windriver cho nó lành.
    Nói chung USB cũng chẳng có gì hay cả, chơi rs232 cho nó tiện và thông dụng.
    Thân
    My Face :

    Comment


    • #3
      cám ơn bạn đã trả lời !!!
      mình vẫn không hiểu vấn đề bạn nói cho lắm, nếu bạn viết bằng CCS thì đúng là trong CCS có các hàm hổ trợ cho chuẩn USB, nhưng ở đây là mình muốn khai báo bằng tay và cũng muốn hiểu phần cứng lưu dữ liệu vào đâu của RAM và cái SPP như mình nói ở trên. Bạn có thể nói rõ để mình hiểu được không ?
      Hiện tại thì mình đang dùng laptop nên ko có cổng COM nên làm cái giao tiếp USB cho tiện.
      thanks !!!

      Comment


      • #4
        Mọi việc truyền đều nhờ phần cứng rồi.Mình chỉ kích cho nó truyền hay nhận thôi.Tuy là vÙng dữ liệu do mình đặt nhưng phải hợp lý.Bộ mô tả endpoint nằm bắt đầu từ địa chỉ 0x400 trên Ram.Còn địa chỉ dữ liệu nằm từ 0x500(xem datasheet).Phần tác động truyền nhận là thanh ghi trạng thái trong bộ mô tả endpoint.Cpu mode là chế độ pic được phép ghi/đọc dữ liệu vào vÙng lưu dữ liệu(nên nhớ usb là ngoại vi được tích hợp vào pic).SIE mode là chế độ module usb truyền nhận dữ liệu.Mọi việc truyền đều nhờ phần cứng rồi.Mình chỉ kích cho nó truyền hay nhận thôi.Tuy là vÙng dữ liệu do mình đặt nhưng phải hợp lý.Bộ mô tả endpoint nằm bắt đầu từ địa chỉ 0x400 trên Ram.Còn địa chỉ dữ liệu nằm từ 0x500(xem datasheet).Phần tác động truyền nhận là thanh ghi trạng thái trong bộ mô tả endpoint.Cpu mode là chế độ pic được phép ghi/đọc dữ liệu vào vÙng lưu dữ liệu(nên nhớ usb là ngoại vi được tích hợp vào pic).SIE mode là chế độ module usb truyền nhận dữ liệu.
        , , ,

        Comment


        • #5
          theo bạn rptdnmqs thì USB chỉ truyền và nhân, còn CPU có nhiệm vụ ghi và đọc dữ liệu. Vậy mình hình dung như sau :

          Endpoint 0 có 4 thanh ghi đế cấu hình là:
          BD0STAT có địa chỉ là 400h
          BD0CNT có địa chỉ là 401h // cai nay minh khai báo là 32 byte
          BD0ADRL có địa chỉ là 402h // cái này mình cho địa chỉ bắt đầu là 500h
          BD0ADRH có địa chỉ là 403h và kết thúc là ở 51Fh, tương ứng khoảng trống là 32byte//
          còn BD0STAT theo bạn nói đây là thanh ghi tác động truyền nhận.
          vậy trong datasheet của PIC18F2550 thì thanh ghi BD0STAT có 2 chế độ CPU và SIE, trong chế độ SIE thì thanh ghi này chỉ nhận các giá trị của PID, còn trong chế độ CPU thì nó điều khiển các chức năng khác, và theo ý bạn ở trên thì :
          Khi ở giai đoạn gói SETUP ( lúc này chỉ là thời điểm mới cắm USB vào host ) thì thanh ghi BD0STAT phải ở chế độ SIE và giá trị mà nó nhận được chỉ là giá trị của PID.
          Khi nó ở giai đoạn khác thì có thể chuyển thanh ghi này sang chế độ CPU để điều khiển chức năng khác.
          Nhưng mình thắc mắc khi ở giai đoạn gói DATA0 thì thanh ghi này ở chế độ nào SIE hay CPU, và khi đó cái khoảng trống 32 byte mà mình định nghĩa ở trên để làm gì, làm sao mình truy cập vào khoảng trống đó ???

          Rất mong bạn trả lời !!!
          thanks!!!

          Comment


          • #6
            HID sẽ tiện cho việc giao tiếp hơn, đỡ khoản driver lằng nhằng. Bạn có thể sử dụng thư viện USB cho PIC18 (trình dịch C18) trong bộ thư viện của MicroChip. Phần giao diện trên PC cũng có sẵn luôn. Tham khảo cái đó rồi tự sửa theo yêu cầu của mình.
            123...

            Comment


            • #7
              Cũng gần đúng rồi.Nhưng hai cái BD0ADRL và BD0ADRH là cặp thanh ghi lưu địa chỉ đầu của vÙng dữ liệu endpoint 0.Tức BD0ADRL_out=0x00;BD0ADRH_out=0x05;
              BD0ADRL_in:BD0ADRH_in=0x500+max_packet;
              khi cắm vào thì host yêu cầu reset.Trong hàm reset thì ta đặt lại giá trị BD0STAT_out để nhận gói setup.Nói chung bạn đọc kĩ datasheet+code ccs thì sẽ rõCũng gần đúng rồi.Nhưng hai cái BD0ADRL và BD0ADRH là cặp thanh ghi lưu địa chỉ đầu của vÙng dữ liệu endpoint 0.Tức BD0ADRL_out=0x00;BD0ADRH_out=0x05;
              BD0ADRL_in:BD0ADRH_in=0x500+max_packet;
              khi cắm vào thì host yêu cầu reset.Trong hàm reset thì ta đặt lại giá trị BD0STAT_out để nhận gói setup.Nói chung bạn đọc kĩ datasheet+code ccs thì sẽ rõ
              , , ,

              Comment


              • #8
                thực chất mình cũng đọc kỹ code của CCS rồi nhưng mình vẫn không hiểu code cho lắm.
                BD0ADRL_in:BD0ADRH_in=0x500+max_packet; mình không hiểu chỗ này cho lắm. Có phải ý bạn là địa chỉ bắt đầu lưu dữ liệu là 500h và khi có dữ liệu thì nó sẽ tự động tăng lên 1, tăng đến khi nào bằng khoảng trống 32byte như mình định nghĩa ở trên ? và nếu như vậy thì khoảng trống 32byte tạo ra là để lưu trữ dữ liệu? Vậy làm sao mình đọc được gói dữ liệu mà host gửi vào ( ví dụ: host gửi yêu cầu reset USB thì làm sao mình đọc được cái yêu cầu này )?

                thanks!!!

                Comment


                • #9
                  Nguyên văn bởi nbb3i Xem bài viết
                  HID sẽ tiện cho việc giao tiếp hơn, đỡ khoản driver lằng nhằng. Bạn có thể sử dụng thư viện USB cho PIC18 (trình dịch C18) trong bộ thư viện của MicroChip. Phần giao diện trên PC cũng có sẵn luôn. Tham khảo cái đó rồi tự sửa theo yêu cầu của mình.
                  cám ơn bạn đã trả lời, nhưng hiện tại mình đang dùng CCS, trình dịch C18 mà bạn nói mình cũng ko biết, bạn có thể gửi mình link về phần mềm này được không ?

                  Comment


                  • #10
                    mấy bữa nay diễn đàn bị gì á, không vào được, mãi hôm nay mới vào được, mong mọi người tiếp tục giúp đỡ mình !!!

                    Comment


                    • #11
                      Uh.Nó bị mất hết băng thông.Chắc bị ngập lụt đường xá.Bạn cứ luyện datasheet+code ccs là ok.Mình cũng từng làm theo cách này.Cứ từ không hấp tấp được đâu.đâu.
                      , , ,

                      Comment


                      • #12
                        mình cũng biết là không thể vội vàng được, nhưng mà mình đọc code mà ko hiểu nó đọc dữ liệu trong Endpoint ở chỗ nào, bạn giúp mình tìm cái code đó được ko? ( code mình xem chủ yếu là trong pic18_usb.c, pic_usb.h, USB.c ), còn nữa trong CCS có hàm usb_kbhit() hàm này dùng để kiểm tra Endpoint có nhận được dữ liệu hay chưa, nhưng mình tìm mãi mà ko thấy nó viết code cho hàm này, mà hình như trong CCS không có hàm đọc dữ liệu thì phải mình tìm mãi mà ko thấy ?

                        Comment


                        • #13
                          Bạn nên đặt câu hỏi cho bản thân là:nơi lưu dữ liệu,thanh ghi nào điều khiển truyền nhận.Nhờ đó xác định hàm truyền nhận.Tìm hiểu xem nó bắt đầu từ đâu.Bạn cố gắng đọc code và so sánh với datasheet.Tôi cũng phải đọc datasheet không dưới 30 lần đâu.Vì dốt tiếng anh. xem nó bắt đầu từ đâu.Bạn cố gắng đọc code và so sánh với datasheet.Tôi cũng phải đọc datasheet không dưới 30 lần đâu.Vì dốt tiếng anh.
                          , , ,

                          Comment


                          • #14
                            thanks, mình sẽ cố gắng tìm hiểu thêm, hy vọng bạn vẫn tiếp tục theo dõi topic này của mình !!!

                            Comment


                            • #15
                              bạn ơi cho mình hỏi ngoài lè 1 chút đoạn code này nghĩa là sao vậy : buf_desc_ptr = (BUFDESC *)((unsigned char *)(&BD0O)+(USTAT&0x7C));
                              mình cũng tìm hiểu rồi nhưng không hiểu, mình không giỏi lập trình C vì cũng đang tập tành viết C, bạn giải thích giúp mình được không ?
                              thanks !!!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X