[ENC28J60] Bài 5: Đọc ghi các gói tin trong bộ đệm – lập trình enc28j60

enc28j60

Theo dõi toàn bộ tutorial lập trình enc28j60 tại đây

Viết chức năng đọc các gói tin ( đọc bộ đệm ethernet )

Bây giờ chúng ta sẽ học cách nhận các gói, vì toàn bộ trao đổi trên mạng cục bộ được chia thành các gói.

Việc nhận các gói trong chip xảy ra thông qua bộ đệm vòng.

Chúng ta hãy xem một ví dụ nhận gói trong hình

đọc gói tin trong enc28j60

Trong bộ đệm sẽ chứa rất nhiều gói tin, cứ bắt đầu mỗi gói sẽ là 1 con trỏ dài 2 byte lưu vị trí của gói tin tiếp theo, tiếp đến 4 byte lưu trạng thái nhận, tiếp đó là dữ liệu của gói tin, và 4 byte cuối sẽ lưu giá trị checksum

đọc gói tin trong enc28j60

Trong trường vector status, 2 byte đầu tiền [0->15] chứa độ dài của gói tin, 2 byte tiếp chứa các trạng thái nhận liên quan đến gói đó, các bạn xem chú thích trên bảng nhé !

Thanh ghi EPKTCNT ở bank2 lưu số lượng gói đang nhận, vì vậy, chúng ta sẽ kiểm tra nó nếu > 0 tức là đang có gói tin trong bộ đệm, hãy đọc nó ra !

Giờ hãy tạo một hàm để đọc một gói trong tệp enc28j60.c và tạo một vài biến cục bộ để phục vụ tính toán và thêm 1 biến toàn cục để lưu vị trí cho gói tiếp theo (nhớ thêm nguyên mẫu hàm vào file .h)

Và tạo #define cho thanh ghi EPKTCNT

Mình sẽ tạo thêm 1 biến toàn cục tên là NextPacketPtr, biến này sẽ lưu vị trí của gói tin tiếp theo. Khi khởi động, gói tin sẽ bắt đầu ở vị trí RXSTART_INIT nên các bạn gán vị trí này cho biến NextPacketPtr ngay trong hàm khởi tạo luôn nhé !

đọc gói tin trong enc28j60

Tiếp tục quay trở lại hàm ENC28J60_read_packet, khi kiểm tra và thấy có gói tin mới, chúng ta sẽ đọc nó ra theo các bước sau:

  1. Đặt con trỏ đọc ERDPT vào vị tri bắt đầu của gói tin
  2. Đọc 2 byte đầu tiên trong bộ đệm, đây sẽ là vị trí bắt đầu của gói tin tiếp theo -> nó cũng chính là vị trí kết thúc của gói tin hiện tại
  3. Đọc 2 byte tiếp theo trong bộ đệm, nó chính là độ dài của gói tin [Status vector 0:15]
  4. Đọc 2 byte tiếp theo trong bộ đệm, nó chứa thông tin trạng thái nhận [Status vector 16:31]
  5. Bắt đầu từ bây giờ chính là dữ liệu của gói, các bạn đọc từ vị trí này tới hết độ dài của gói tin nhé, chúng ta có thể trừ đi 4 byte checksum ở cuối nếu không cần kiểm tra lại checksum
  6. Set ERXRDP tới vị trí của gói tin tiếp theo
  7. Sau khi đọc xong chúng ta set bit PKTDEC trong thanh ghi ECON2 để EPKTCNT giảm đi 1

Để đọc buffer, các bạn phải gửi command ở nhóm lệnh có Opcode là Read Buffer Memory = 0x3A. Bởi vậy hãy thêm #define cho nó nhé

Mình sẽ tạo thêm 1 hàm để đọc 1 byte từ buffer cho tiện hen ( nhớ thêm nguyên mẫu hàm cho file .h)

Do nhóm lệnh Read Buffer Memory nó nhận data vào là n/a nên chúng ta nạp vào là gì cũng được. Ở đây mình gửi value=0 luôn.

Đọc 1 byte thì đương nhiên sẽ có đọc nhiều byte, thay vì gọi hàm ENC28J60_read_Byte_Buffer liên tục sẽ chậm (do gửi 2 byte để đọc về 1 byte), chip hỗ trợ chúng ta 1 cách đọc nhanh hơn nhiều, không cần phải gửi Opcode luôn tục)

Cách đọc 1 khối data lớn trong Read Buffer Memory

  1. CS Enable
  2. Gửi Opcode Read Buffer Memory
  3. Liên tục đọc data ra qua giao thức SPI
  4. CS Disable

Bí quyết nằm ở chỗ chúng ta không tắt chân CS nên chip sẽ không reset Opcode đã gửi, do vậy không cần gửi đi gửi lại Opcode nhiều lần

Được rồi, giờ viết nối nội dung cho hàm ENC28J60_read_packet nhé !

Nhớ #define địa chỉ cho thanh ghi ECON2

Viết chức năng gửi các gói tin ( ghi bộ đệm ethernet)

Chương trình gửi gói cũng tương tự như đọc

gửi gói tin cho enc28j60

Hàm gửi buffer ra cho chip ENC28J60

Thêm nguyễn mẫu hàm và #define cho Opcode ENC28J60_WRITE_BUF_MEM

Các bước thiết lập để truyền gói tin – lập trình enc28j60 tutorial

  1. Kiểm tra bit TXRTS trong thanh ghi ECON1, nếu nó đang được xóa thì chip sẵn sàng để truyền
  2. Cài thanh ghi EWRPT (16bit) (con trỏ truyền) địa chỉ bắt đầu lưu bộ đệm truyền
  3. Cài thanh ghi ETXND (16bit) địa chỉ của byte cuối cùng trong bộ đệm
  4. Mở đầu bằng cách truyền byte control=0x00 vào bộ đệm
  5. Truyền gói tin sang cho chip
  6. Set bit TXRTS trong thanh ghi lên 1 để chip ENC28J60 bắt đầu truyền gói tin lên mạng

Thêm nguyên mẫu cho hàm và thêm #define cho thanh ghi EIR vào file .h

Như vậy, mình đã hướng dẫn các bạn viết xong các hàm cơ bản để giao tiếp với chip ENC28J60, bắt đầu từ bây giờ, chúng ta sẽ làm việc, mổ xẻ, bóc tách nội dung bên trong của các gói tin, xử lí các gói tin !

Các bạn có thể tải source của bài hôm nay tại đây

Bài tiếp theo – lập trình enc28j60 tutorial

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

2 bình luận

Đã đóng bình luận.