Thông báo

Collapse
No announcement yet.

Giao thức TCP/IP và Web server với AVR

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Em tưởng tượng như thế này có đúng không anh vuxuansyhut? Anh có nói một đoạn là "Buffer của enc28j60 được truy cập theo cơ chế FIFO tức first in first out. Nó giống như stack (ngăn xếp ) của vi điều khiển ở chỗ đã lấy ra là ngăn xếp lại được dồn xuống (ở mcu là dồn lên vì cơ chế mcu là LIFO - last in first out)"
    Có phải là sau khi mình đã đọc thì dữ liệu ở thanh ghi có địa chỉ n thì dữ liệu ở thanh ghi bên dưới(n+1) trong buffer sẽ đẩy lên thanh ghi bên trên hay sao ạ? Có phải vì vậy và khi đọc 2 lần địa chỉ 0 lại cho ra 2 kết quả khác nhau ko ạ?
    Nếu đúng như vậy thì em chỉ thắc mắc ở đoạn tại sao thầy Tâm lại đọc từ địa chỉ 0000h thôi ạ? Vì em nghĩ là địa chỉ bắt đầu buffer nhận thầy đặt là 0x0600. Còn nếu em hiểu như vậy không đúng thì xin anh chỉ giáo!

    Comment


    • Nguyên văn bởi sotuoi Xem bài viết
      Chào Thầy Tâm,
      Cho em hỏi, khi mạch mình kết nối vào web server trên internet (đang trạng thái giử kết nối), làm thế nào gói tin HTTP response từ server đó chạy đúng đường về tới mạch của mình. Vì lúc này ip của web server là ip WAN, còn ip mạch mình chỉ là ip LAN.
      THANH NHI
      Khi máy tính gửi bản tin HTTP request đi, để ra được internet, trước hết nó phải qua gateway (chính là modem ADSL nếu ta kết nối bằng ADSL). Tại đây (gateway) có 1 chức năng rất quan trọng là NAT (Network Address Translate): gateway sẽ thay địa chỉ IP nguồn (source IP address) trong header của gói tin IP (đang là địa chỉ LAN của máy tính) bằng địa chỉ IP WAN (của gateway).

      Vì vậy khi HTTP server nhận được bản tin HTTP request thì địa chỉ IP nguồn trong đó đã là địa chỉ IP WAN của gateway, như vậy HTTP server sẽ trả lời (HTTP reponse) theo địa chỉ này và đến được gateway (như vậy địa chỉ đích của bản tin HTTP reponse là IP WAN của gateway).

      Lúc này, gateway lại thực hiện chức năng NAT một lần nữa, và thay địa chỉ IP đích (destination IP address) trong IP Header (đang là địa chỉ IP WAN của gateway) thành địa chỉ IP LAN của máy tính đã gửi HTTP request, và chuyển bản tin vào trong mạng LAN, như vậy sẽ đến được máy tính cần thiết.

      Cơ chế này (NAT) dùng cho mọi dịch vụ khác chứ không riêng gì HTTP. Còn làm sao để gateway "nhớ" được máy tính nào đã gửi request để thay lại đúng địa chỉ IP LAN của máy tính đó,... thì còn phụ thuộc vào loại NAT đang sử dụng,...

      Comment


      • Nguyên văn bởi vuxuansyhut Xem bài viết
        Lại xin phép thày Tâm trả lời bạn nacdanh90. Xin thày bỏ qua cho em. Sai thì thày đừng cười nhé. Hihi. Buffer của enc28j60 được truy cập theo cơ chế FIFO tức first in first out. Nó giống như stack (ngăn xếp ) của vi điều khiển ở chỗ đã lấy ra là ngăn xếp lại được dồn xuống (ở mcu là dồn lên vì cơ chế mcu là LIFO - last in first out). Nên khi bạn thấy chương trình đọc 2 lần ở địa chỉ 0 thì không phải sai đâu. Bạn có thể tham khảo trang 19 của datasheet enc28j60.
        Còn tại sao nó lại ở địa chỉ 0 thì bạn có thể tham khảo trang 43 [ATTACH=CONFIG]41946[/ATTACH]
        trong đó cho biết 2 byte đầu của buffer nhận là Next Packet Pointer
        Rất cảm ơn vuxuansyhut, bạn trả lời các câu hỏi của các bạn khác rất rõ ràng và chính xác, chứng tỏ bạn cũng là 1 chuyên gia trong mảng này. Dạo này công việc tại cơ quan rất bận rộn nên nhiều lúc không có thời gian online, được bạn hỗ trợ thì còn gì bằng. Thank vuxuansyhut!

        Comment


        • Em tưởng tượng như thế này có đúng không anh vuxuansyhut? Anh có nói một đoạn là "Buffer của enc28j60 được truy cập theo cơ chế FIFO tức first in first out. Nó giống như stack (ngăn xếp ) của vi điều khiển ở chỗ đã lấy ra là ngăn xếp lại được dồn xuống (ở mcu là dồn lên vì cơ chế mcu là LIFO - last in first out)"
          Có phải là sau khi mình đã đọc thì dữ liệu ở thanh ghi có địa chỉ n thì dữ liệu ở thanh ghi bên dưới(n+1) trong buffer sẽ đẩy lên thanh ghi bên trên hay sao ạ? Có phải vì vậy và khi đọc 2 lần địa chỉ 0 lại cho ra 2 kết quả khác nhau ko ạ?
          Nếu đúng như vậy thì em chỉ thắc mắc ở đoạn tại sao thầy Tâm lại đọc từ địa chỉ 0000h thôi ạ? Vì em nghĩ là địa chỉ bắt đầu buffer nhận thầy đặt là 0x0600. Còn nếu em hiểu như vậy không đúng thì xin anh chỉ giáo!
          Mình hiểu ý của bạn. Mình nghĩ thế này không bít có đúng không. Khi đọc datasheet của enc28j60 trang 28 nói về tập lệnh giao tiếp SPI , ở lệnh Read Buffer Memory có Argument không thay đổi đồng nghĩa với việc nó sẽ truy nhập địa chỉ theo offset, và địa chỉ đầu là next packet pointer. Giá trị 0x0600 là giá trị cấu hình ban đầu cho dịa chỉ bộ đệm nhận.( Bạn có thể xem thêm trong hàm enc28j60Init và chuỗi cấu hình Enc28j60( prog_char enc28j60_config[44] PROGMEM). Nên 0x0600 chỉ có ý ngiax là nơi bắt đầu bộ đêm nhận không có ý nghĩa truy nhập theo địa chỉ.

          Giải pháp điện tử của bạn

          Comment


          • Rất cảm ơn vuxuansyhut, bạn trả lời các câu hỏi của các bạn khác rất rõ ràng và chính xác, chứng tỏ bạn cũng là 1 chuyên gia trong mảng này. Dạo này công việc tại cơ quan rất bận rộn nên nhiều lúc không có thời gian online, được bạn hỗ trợ thì còn gì bằng. Thank vuxuansyhut!
            Em cũng mới tìm hiểu vấn đề này theo hướng dẫn của thày Tâm. Khi bắt đầu em cũng gặp những thắc mắc giống các bạn nhưng lại ngại không dám hỏi vì thấy thày Tâm bận quá. Để chi sẻ một khối lượng kiến thức lớn như vậy thật không đơn giản mà lại theo cách rất dễ hiểu như của thày lại càng khó Mà những vấn đề này lại liên quan sâu đến phần cứng của hệ thống. Để giải thích lại phải lật lại nhiều vấn đề. Trong khi đó luồng này đã đi tới lớp ứng dụng, theo em nghĩ là cốt lõi.

            Giải pháp điện tử của bạn

            Comment


            • Em cảm ơn thầy và anh vuxuansyhut. Em cũng bắt tay vào làm Project này muộn quá nên hỏi nhiều câu có vẻ hơi buồn cười, ngớ ngẩn xin anh và thầy đừng cười em.hi. Em thấy thầy Tâm cũng bận, a đã nghiên cứu project của thầy Tâm rất kĩ nên có gì không hiểu em hỏi anh được không ạ? A có thể cho em xin địa chỉ mail của anh được không ạ?

              Comment


              • Mình cũng mới tìm hiểu đề tài này được vài tuần. Cũng thắc mắc nhiều. Khi đọc mỗi dòng code của thày Tâm mình luôn muốn biết nó có ý nghĩa như thế nào. Trên luồng này mình thấy ít bạn hỏi sâu về các vấn đề như bạn. Gmail của mình là vuxuansyhut@gmail.com yahoo mail la vuxuansy_bkak51@yahoo.com. Rất vui được thảo luận cùn bạn.

                Giải pháp điện tử của bạn

                Comment


                • Gửi số liệu

                  Các bạn cho mình hỏi nếu muốn truyền số liệu sang 1 địa chỉ IP tĩnh trên mạng Internet thì làm sao, ví dụ như có máy tính nằm ở một vị trí nào đó, có IP tĩnh hoặc dùng No-IP chẳng hạn, còn cái module ENC28J60 nằm ở đâu đó, khoảng 10 phút gửi thông số về cái máy tính kia, thì phải làm sao, tức là sever là tĩnh , còn các Module ENC28J60 là động.
                  |

                  Comment


                  • Nguyên văn bởi vutrv Xem bài viết
                    Các bạn cho mình hỏi nếu muốn truyền số liệu sang 1 địa chỉ IP tĩnh trên mạng Internet thì làm sao, ví dụ như có máy tính nằm ở một vị trí nào đó, có IP tĩnh hoặc dùng No-IP chẳng hạn, còn cái module ENC28J60 nằm ở đâu đó, khoảng 10 phút gửi thông số về cái máy tính kia, thì phải làm sao, tức là sever là tĩnh , còn các Module ENC28J60 là động.
                    Bạn có thể dùng UDP hay TCP để gửi về cho máy tính có IP tĩnh (hay dựa vào domain name).

                    Comment


                    • Thầy cho em hỏi mạch của em dùng atmega 32 + modul ENC28j60 mua ở thiên minh:
                      ENC28J60 Header Board - www.tme.vn - Linh kien, Sensors, Kit Phat trien,GSM, GMS, GPRS, RF, Mach nap 8051, PIC, AVR, ARM, EPROM, Flash... + Ft232Rl để debug. Khi em cắm modul enc28j60 vào và cắm rắc usb vào máy tính để vừa cấp nguồn 5V vừa debug. Nhưng sao cứ báo : USB device not recognized. và khi em rút module này ra thì FT232 vẫn hoạt động tốt. Nguồn cho modul ENC28j60 em lấy từ nguồn 5v của cổng qua Asm1117-3.3V.

                      Comment


                      • Nguyên văn bởi nacdanh90 Xem bài viết
                        Thầy cho em hỏi mạch của em dùng atmega 32 + modul ENC28j60 mua ở thiên minh:
                        ENC28J60 Header Board - www.tme.vn - Linh kien, Sensors, Kit Phat trien,GSM, GMS, GPRS, RF, Mach nap 8051, PIC, AVR, ARM, EPROM, Flash... + Ft232Rl để debug. Khi em cắm modul enc28j60 vào và cắm rắc usb vào máy tính để vừa cấp nguồn 5V vừa debug. Nhưng sao cứ báo : USB device not recognized. và khi em rút module này ra thì FT232 vẫn hoạt động tốt. Nguồn cho modul ENC28j60 em lấy từ nguồn 5v của cổng qua Asm1117-3.3V.
                        EN28j60 cần dòng khá lớn, cấp qua USB không đủ, sẽ làm sụt áp, không đủ nguồn cho FT232

                        Comment


                        • Vâng ạ! Em thử cấp nguồn riêng thì được thầy ạ! Em cảm ơn thầy!

                          Comment


                          • Thầy và các anh giải thích giúp em vẫn đề này với ạ! Trong bản tin ARP request em bắt được từ wireShark gói tin này có độ dài là 42bytes. và mỗi lần em dùng máy tính ping đến một IP thì em thấy nó gửi 12 gói tin broadcast ARP request.
                            Enc28j60 của em nhận được cả 12 paket đó.
                            Nhưng khi em gửi byte cao và byte thấp của biến len về máy tính thì gộp lại cả biến len lại có độ dài là 64bytes?

                            Comment


                            • Nguyên văn bởi nacdanh90 Xem bài viết
                              Thầy và các anh giải thích giúp em vẫn đề này với ạ! Trong bản tin ARP request em bắt được từ wireShark gói tin này có độ dài là 42bytes. và mỗi lần em dùng máy tính ping đến một IP thì em thấy nó gửi 12 gói tin broadcast ARP request.
                              Enc28j60 của em nhận được cả 12 paket đó.
                              Nhưng khi em gửi byte cao và byte thấp của biến len về máy tính thì gộp lại cả biến len lại có độ dài là 64bytes?
                              Trong giao thức Ethernet, chiều dài phần data (payload), được qui định tối đa là 1500 bytes, tối thiểu là 46 bytes, bạn có thể xem lại ở phần đầu, phần giao thức ethernet, hình minh họa cấu trúc khung ethernet (hình này để nhầm là 64). Khi gửi gói IP có kích thước nhỏ hơn 46 byte, cần phải chèn thêm các byte padding cho đủ 46, nhưng thông tin về chiều dài gói IP trong header IP vẫn chính xác. Trong firmware của chúng ta, biến len của giao thức ethernet (trả về bởi hàm enc28j60PacketReceive) được tính là chiều dài phần payload này + ethernet header len + CRC = 46 +14 + 4 = 64. Còn phần mềm wireshark khi bắt gói tin sẽ báo đúng kích thước thật của gói IP. Chính vì vậy xem trên wireshark, bạn sẽ thấy kích thước thực của gói IP là 42 bytes, trong khi đó biến len trong trong hàm ethGetframe là chiều dài của frame ethernet nên nó là 64.
                              Last edited by nttam79; 28-03-2012, 01:11.

                              Comment


                              • Vâng ạ! Em cảm ơn thầy. E quên mất con số 64 đó trong hình vẽ của thầy.hi. Nhưng e xem lại data sheets của enc28j60 đoạn SAMPLE RECEIVE PACKET LAYOUT phần Packetdata nó gồm: Destination Address,Source Address,type/Length, Data. Vậy thì trong hàm enc28j60PacketReceive thầy gán biến len=các bit từ 0..15 của RECEIVE STATUS VECTORS thì đây được coi là chiều dài của riêng phần data(+padding thêm vào cho đủ 64byte nếu data <64byte) chứ không tính chiều dài của các trường Destination Address,Source Address,type/Length ạ?Nếu theo như giải thích bên trên của thầy thì em hiểu như vậy!Ko biết có đúng không ạ?

                                Em hỏi về vấn đề này hơi kĩ mong thầy và các anh thông cảm! Em chưa muốn chuyển sang tầng khác trong khi tầng đầu tiên chưa hiểu rõ bản chất!
                                Last edited by nacdanh90; 27-03-2012, 22:53.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X