[ENC28J60] Bài 4: Khởi tạo module enc28j60 (phần 3) – lập trình enc28j60

ENC28j60

Tiếp tục với hàm khởi tạo chip ở bài trước trong chuỗi bài lập trình enc28j60, ở bài này chúng ta sẽ cấu hình và khởi tạo cho các thanh ghi thuộc nhóm PHY

Thông tin về các PHY Registers nằm ở phần 3.3 datasheet 

Các thanh ghi thuộc PHY đều là loại 16bit và không thể trực tiếp truy cập qua giao tiếp SPI, các truy cập vào PHY đều gián tiếp thông qua các thanh ghi được gọi là MII

READING PHY REGISTERS

Để đọc 1 thanh ghi PHY

  1. Ghi địa chỉ của thanh ghi đó vào thanh ghi MIREGADR
  2. Set bit MICMD.MIIRD để bắt đầu thao đac đọc, bit MISTAT.BUSY (bit báo bận) sẽ được set
  3. Đợi 10.24uS, thăm dò bit MISTAT.BUSY để chắc chắn hoạt động đọc hoàn thành
  4. Khi hoàn thành, bit MISTAT.BUSY sẽ tự xóa, chúng ta xóa thủ công bit MICMD.MIIRD và lấy giá trị mong muốn từ thanh ghi MIRDL MIRDH

WRITING PHY REGISTERS

Để ghi 1 thanh PHY

  1. Ghi địa chỉ của thanh ghi đó vào thanh ghi MIREGADR
  2. Ghi giá trị 8bit thấp vào MIWRL
  3. Ghi giá trị 8bit cao vào MIWRH
  4. Ngay sau đó MISTAT.BUSY tự động được set
  5. Sau khoảng 10.24uS, quá trình ghi hoàn tất, bit bận sẽ tự xóa

Khá đơn giản phải không. Viết 2 hàm ghi và đọc PHY thôi nào 🙂

Đừng quên thêm nguyên mẫu hàm vào file .h và thêm cả #define cho các thanh ghi PHYMII nhé !

Bây giờ cấu hình lớp vật lý PHY trong hàm khởi tạo

Quay trở lại mục 6.6 trong datasheet  để xem nhưng thứ cần khởi tạo nhé !

Dưới đây là 1 số khởi tạo thanh ghi PHY theo datasheet yêu cầu, mình cũng set các bit trong thanh ghi EIE để cho phép ngắt

Và thêm #define địa chỉ cho các thanh ghi và bit PHY và 1 số bit trong thanh ghi EIE

Đối với 2 đền LED trên cổng RJ45, nó cũng có hẳn 1 thanh ghi PHY, nhưng mình sẽ để mặc định và không cấu hình thêm

Vậy là quá trình khởi tạo cho module lúc khởi động đã hoàn tất !

Các bạn có thể tải source cho bài này tại đây

Trong bài tiếp theo – lập trình enc28j60, chúng ta sẽ làm việc với bộ đệm TX RX và viết các hàm để ghi đọc các gói tin trên bộ đệm !

Các bạn có thể xem lại các bài trước tại đây:

 

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

  1. Cảm ơn vì bài hướng dẫn của anh, em có một vài thắc mắc mong anh giải đáp.
    1. #define MICMD (0x12|0x40|0x80) //thanh ghi nay thuoc bank 2 nen OR 0x40
    Anh | 0x80 có mục đích gì vậy anh?
    2. #define PHLCON_STRCH 0x0002 … #define PHLCON_LACFG3 0x0800
    của thanh ghi PHLCON em có xem qua datasheet nhưng không biết được địa chỉ của mấy thằng này PHLCON_STRCH, PHLCON_LACFG3… anh xem nó ở đây vậy ạ?
    3. anh có thể giải thích thêm về đoạn này được không ạ
    //**********Advanced Initialisations************//
    cảm ơn anh!

    • 1. Mình có giải thích rồi mà
      2. Trong datasheet nó có địa chỉ LOW và HIGH của các thanh ghi đó, địa chỉ LOW đứng trước địa chỉ HIGH, mình chỉ cần lấy địa chỉ LOW là sẽ biết địa chỉ HIGH thôi. Không cần mất công định nghĩa 2 cái

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