Trong tutorial này, chúng ta sẽ làm quen với module ENC28J60 và giao tiếp với ENC28J60, module này có thể xử lý hầu hết các yêu cầu về giao thức mạng. Module kết nối trực tiếp tới hầu hết các vi điều khiển thông qua chuẩn giao tiếp SPI với tốc độ truyền/nhận lên đến 20MHz.
Theo dõi toàn bộ tutorial giao tiếp với ENC28J60 tại đây
Chuẩn bị cho chuỗi bài học giao tiếp với ENC28J60
Sau một hồi đắn đo, mình đã quyết định thực hiện toàn bộ tutorial giao tiếp với ENC28J60 trên công cụ mô phỏng Proteus do phần này hỗ trợ mô phỏng ic ENC28J60
Còn về vi điều khiển và trình dịch thì mình chọn làm việc trên chip Atmega328, trình dịch Codevision AVR bởi :
- So với các dòng 8051, PIC, thì dòng AVR có tốc độ nhanh hơn, bộ nhớ cao hơn
- Với STM8 thì chip này chưa hỗ trợ mô phỏng trên proteus
- Với STM32 thì phải cài các phiên bản cao hơn mới hỗ trợ mô phỏng, tuy nhiên mô phỏng chip stm32 thì trình mô phỏng chạy rất chậm, hay đơ
- Trình dịch AVR hỗ trợ tạo project sinh code rất tiện lợi, nó cũng hỗ trợ nhiều thư viện giúp ta có nhiều thời gian tập trung làm việc với chip ENC28J60 nhiều hơn mà không phải lọ mọ đi code từng thanh ghi trong chip avr
- Khi mô phỏng chúng ta debug SPI, UART rất tiện lợi
Do vậy, các bạn chuẩn bị các công cụ sau để theo dõi khóa học này nhé !
- Máy tính đã cài Winpcap
- Phần mềm mô phỏng Proteus 8.4
- Trình dịch CodeVision AVR
Vẽ chương trình mô phỏng
Khởi tạo project
Mở CodeVision AVR, vào File -> New, tích chọn Project -> OK
Chọn YES -> tích chọn AT90,ATtiny, ATmega,FPSLIC
Trong cửa sổ CodeWizardAVR, các bạn chọn tab Chip và chọn chip ATmega328P, chọn thạch anh tốc độ 16,000000 Mhz rồi tích vào biểu tượng răng cưa để tạo project
Phần mềm sẽ bắt ta lưu lại 1 số file, các bạn chọn vị trí lưu project với tên gì tùy các bạn ! Sau đó project sẽ được mở ra.
Xóa toàn bộ code phần mềm đã sinh cho các bạn rồi copy chỗ code mình đã khởi tạo sẵn cho các bạn vào
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <mega328p.h> #include <delay.h> #include <spi.h> #include "uart.h" void main(void) { #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0xff; DDRB=0xff; DDRB.4=0; PORTC=0xff; DDRC=0xff; PORTD=0xff; DDRD=0xff; // SPI initialization // SPI Type: Master // SPI Clock Rate: 4000,000 kHz // SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; UART_init(); #asm("sei") UART_putString("IOT47.com - ENC28J60 tutorial !!!\r\n"); while (1) { } } |
Ở đây mình có include thư viện <spi.h> <delay.h> đây là 2 thư viện phần mềm đã hỗ trợ sẵn cho chúng ta. Còn thư viện “uart.h” là do mình viết thêm, các bạn tải 2 file uar.h và uart.c về tại đây nhé !
Sau khi tải xong 2 file thư viện uart về thì các bạn bỏ nó vào cùng chỗ lưu project. Sau đó vào Project – > Configure
Click ADD và tiến hành Add file uart.c vào nhé !
Như vậy là thư viện uart đã được thêm vào project. Các bạn ấn vào icon Build để biên dịch chương trình
Sau khi biên dịch xong nhận được thông báo không lỗi , không cảnh báo là OK !
File hex sẽ được sinh ra trong thư mục exe, chạy thử code và được như này là OK !
Kết luận
Như vậy, chúng ta đã hoàn thành các bước chuẩn bị cho hành trình phá đảo module enc28j60, hành trình phía trước sẽ rất vất vả và dài hơi, các bạn hãy chú ý theo dõi từng bài một nhé !
Các bạn có thể tải project mình đã chuẩn bị sẵn tại đây !
Muốn học thì nhất định phải có tài liệu:
Bài tiếp theo trong chuỗi bài học giao tiếp với ENC28J60
cảm ơn anh nhiều nhiều!
cảm ơn anh nhiều ạ, rất là bổ ích 🙂