Thông báo

Collapse
No announcement yet.

Ngâm cứu ENC28J60 để giao tiếp với mạng Internet

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

  • #46
    Nguyên văn bởi laiquangtuye Xem bài viết
    unsigned char myIpAddr[4] = {192,168,1,60} ; // my IP address

    Địa chỉ IP mình thay đổi lại là thế này, còn tc mọi thứ còn lại là không thay đổi
    mình sử dụng pic dòng LF nên chỉ việc kết nối thẳng vào mạch thôi, vậy mà mấy tuần rồi mà ko chịu chạy, pó tay. Không ai cứu giúp hết ah.
    Tốt nhất bạn nên xem lại phần cứng của mình. Của tôi chạy rất tốt, phần cứng tôi tự thiết kế chứ ko mua của ai hết, còn firmware thì ko thay đổi j hết.
    Theo tôi bạn nên dùng icpip stack của microchip là hay nhất. Nó cho phep thiết kế web hoành tráng chứ ko như của MikroC rất đơn giản chỉ là cai table. Nhưng đương nhiên là phân cứng phải thiết kế tôt hơn nhưng đổi lại thì nhưng j nó làm được lại quá hay. Gởi bạn 2 hình ảnh để bạn xem và so sánh.
    Attached Files
    kit phát triển các loại:
    Đã có LPC2103 kit, AT91SAM7S kit và J_Link V.7.

    Comment


    • #47
      Bạn nên làm Ethernet với TCP Stack 4.55 và C18 của Microchip, nếu bạn dùng MokroC thì bạn sẽ không làm được gì nhiêu đâu vì:
      - Thư viện Ethernet của MikroC được viết trên TCP Stack 3. rất cũ và kém ổn định
      - Cấu trúc Javascript,html rất vớ vẩn,và không xây dựng được web sever lớn, để update thông tin phải reload (ko dùng được AJAX)
      - Hỗ trợ rất ít ứng dụng.

      Tóm lại để làm một cách chuyên nghiệp thì nên dùng thẳng TCP Stack của Microchip !

      Comment


      • #48
        OK! Và cuối cùng với sự giúp đỡ hết sức nhiệt tình của Anh Linhnc308 thì mình đã làm chạy ngon lành, và mình cũng công nhận cái thằng MikroC cho cái code cùi bắp thiệt, trang web trong đơn giản thật chả hoành tráng chút nào. Cảm ơn mọi người và đặc biệt cảm ơn Anh Linhnc308 rất rất nhiều!

        Comment


        • #49
          Cái code của microchip, nếu mình ko dùng eeprom ngoài thì mình sửa chỗ nào nhỉ!

          Comment


          • #50
            Nguyên văn bởi david Xem bài viết
            Bạn nên làm Ethernet với TCP Stack 4.55 và C18 của Microchip, nếu bạn dùng MokroC thì bạn sẽ không làm được gì nhiêu đâu vì:
            - Thư viện Ethernet của MikroC được viết trên TCP Stack 3. rất cũ và kém ổn định
            - Cấu trúc Javascript,html rất vớ vẩn,và không xây dựng được web sever lớn, để update thông tin phải reload (ko dùng được AJAX)
            - Hỗ trợ rất ít ứng dụng.

            Tóm lại để làm một cách chuyên nghiệp thì nên dùng thẳng TCP Stack của Microchip !
            Theo mình biết thì javascript chạy trên Browser mà, liên quan thì đến tcp/ip stack mà bạn dùng nó để so sánh.
            Diễn đàn Vi điều khiển:

            Comment


            • #51
              Nguyên văn bởi minhtuan04 Xem bài viết
              Theo mình biết thì javascript chạy trên Browser mà, liên quan thì đến tcp/ip stack mà bạn dùng nó để so sánh.
              hi!
              Bạn đã thử code Javascript và html sử dụng MikroC để dịch chưa?
              Có vẻ bạn ko hiểu ý mình !

              Comment


              • #52
                Nguyên văn bởi david Xem bài viết
                hi!
                Bạn đã thử code Javascript và html sử dụng MikroC để dịch chưa?
                Có vẻ bạn ko hiểu ý mình !
                mình ngồi nguyên mấy ngày nghiên cứu html và javascript. Mình định thêm mấy cái nút nhấn botton để điều khiển và thêm mấy cái text box nhưng thật là khó khăn. Về html nó có vẻ thay đổi đi rất nhiều. Công nhận làm cực thiệt.
                Bạn đã thử cái đó chưa. Giúp mình tạo nút thử và thử điều khiển một led bằng cái nút botton thử coi. Mình làm hoài mà chẳng được, có không báo lỗi gì mà trang web ko chạy.

                Comment


                • #53
                  hi bạn,
                  bạn vào đây xem:
                  http://lecongcuong.dyndns.info
                  cái này mình dùng C18 và TCP Stack4.55 đây!

                  Comment


                  • #54
                    Nguyên văn bởi david Xem bài viết
                    hi!
                    Bạn đã thử code Javascript và html sử dụng MikroC để dịch chưa?
                    Có vẻ bạn ko hiểu ý mình !
                    Mình không dùng MikroC, nhưng quả là vô lý khi nói "Cấu trúc Javascript,html rất vớ vẩn,và không xây dựng được web sever lớn, để update thông tin phải reload (ko dùng được AJAX)"

                    Ajax cũng reload vậy thôi, có điều nó auto reload, và cái embedded webserver cũng ko thể xây dựng 1 cái server lớn, vài chục connections là nó xử lý hết nổi ngay.

                    Còn giải quyết vấn đề điều khiển, lấy trạng thái của server mà không cần gởi request thì mình chỉ bạn, nếu bạn viết java hay actionscript, bạn nên viết 1 ứng dụng java hay Flash, sau đó nhúng vào cái website đó, cái ứng dụng của bạn có thể là 1 cái Socket Client, còn cái Socket server thì dùng các BSD API, Microchip TCP/IP stack có cung cấp đầy đủ các BSD để bạn làm đó

                    Ngoài ra bạn có thể đăng nhập sử dụng HTTP Serurity ở mức basic, nếu muốn sử dụng SSL thì mua ở Mircochip direct.

                    Tóm lại, Javascript hay HTML chỉ là 1 đoạn text thôi, có liên quan gì đến xử lý ở server

                    Mình đã làm cái Embedded Webserver sử dụng TCP/IP Stack của Microchip, nhưng không lấy cái mẫu web mà nó đưa để làm, mình làm hoàn toàn bằng FLASH, dung lượng nhỏ, giao diện đẹp, và có thể kết nối với server thông qua Socket, chẳng cần phải gởi request liên tục, Rảnh mình up hình lên cho xem, chỉ mất có 50% ROM của dspic33FJ256GP506
                    Diễn đàn Vi điều khiển:

                    Comment


                    • #55
                      Bạn tuấn rảnh hướng dẫn mọi người tạo một giao diện web đơn giản dạng flash được không. Tôi thấy ý tưởng của bạn rất hay và quan tâm đên nó. Từ trước làm chỉ toàn bằng mã HTML và mấy cái script thôi.
                      Ethernet-RS232, PIC Webserver, RFID Reader
                      CallerID, Cảnh báo BTS, ...
                      0988006696
                      linhnc308@gmail.com
                      http://linhnc308.blogspot.com

                      Comment


                      • #56
                        Nguyên văn bởi minhtuan04 Xem bài viết
                        Mình không dùng MikroC, nhưng quả là vô lý khi nói "Cấu trúc Javascript,html rất vớ vẩn,và không xây dựng được web sever lớn, để update thông tin phải reload (ko dùng được AJAX)"
                        Cấu trúc Javascript,html rất vớ vẩn : Bạn hãy mở example của MikroC ra xem nó viết html và Javascript có đúng chuẩn không ?
                        và không xây dựng được web sever lớn : MikroC ko co tool kiểu như MPFS2, code viết cho web và code viết cho VDK được gộp chung lại và dùng MikroC để dich,như vậy nếu web xây dụng với nhiều page,image thì bó tay (thêm vào bảng một cột trong vi dụ của nó,nó đã ko hiểu rồi)
                        để update thông tin phải reload (ko dùng được AJAX) : reload và dùng AJAX khác nhau như thế nào thì ko cần phải bàn đúng ko.

                        Cái mình nói ở đây là sự hạn chế của MikroC.
                        Rât muốn xem cái web của bạn làm !

                        Comment


                        • #57
                          Em cho giao tiếp giữa dsPIC30F4013 và ENC28J60
                          Đoạn code sau em làm nháy LEDA và LEDB nhưng không được.
                          Các anh xem giúp em xem nhầm lẫn chỗ nào.Em đang rất gấp.
                          Phần cứng: CS - RB1
                          RST - RB9
                          SDI - RF2
                          SDO - RF3
                          SCK - RF6


                          Code:
                          #include	<p30f4013.h>
                          
                          	_FOSC(CSW_FSCM_OFF & FRC_PLL4);
                          	_FWDT(WDT_OFF);
                          	_FBORPOR(PBOR_OFF & MCLR_EN);
                          	_FGS(CODE_PROT_OFF);
                          
                          #define ADDR_MASK        0x1F
                          #define BANK_MASK        0x60
                          #define SPRD_MASK        0x80
                          // All-bank registers
                          #define EIE              0x1B
                          #define EIR              0x1C
                          #define ESTAT            0x1D
                          #define ECON2            0x1E
                          #define ECON1            0x1F
                          // Bank 0 registers
                          #define ERDPTL           (0x00|0x00)
                          #define ERDPTH           (0x01|0x00)
                          #define EWRPTL           (0x02|0x00)
                          #define EWRPTH           (0x03|0x00)
                          #define ETXSTL           (0x04|0x00)
                          #define ETXSTH           (0x05|0x00)
                          #define ETXNDL           (0x06|0x00)
                          #define ETXNDH           (0x07|0x00)
                          #define ERXSTL           (0x08|0x00)
                          #define ERXSTH           (0x09|0x00)
                          #define ERXNDL           (0x0A|0x00)
                          #define ERXNDH           (0x0B|0x00)
                          #define ERXRDPTL         (0x0C|0x00)
                          #define ERXRDPTH         (0x0D|0x00)
                          #define ERXWRPTL         (0x0E|0x00)
                          #define ERXWRPTH         (0x0F|0x00)
                          #define EDMASTL          (0x10|0x00)
                          #define EDMASTH          (0x11|0x00)
                          #define EDMANDL          (0x12|0x00)
                          #define EDMANDH          (0x13|0x00)
                          #define EDMADSTL         (0x14|0x00)
                          #define EDMADSTH         (0x15|0x00)
                          #define EDMACSL          (0x16|0x00)
                          #define EDMACSH          (0x17|0x00)
                          // Bank 1 registers
                          #define EHT0             (0x00|0x20)
                          #define EHT1             (0x01|0x20)
                          #define EHT2             (0x02|0x20)
                          #define EHT3             (0x03|0x20)
                          #define EHT4             (0x04|0x20)
                          #define EHT5             (0x05|0x20)
                          #define EHT6             (0x06|0x20)
                          #define EHT7             (0x07|0x20)
                          #define EPMM0            (0x08|0x20)
                          #define EPMM1            (0x09|0x20)
                          #define EPMM2            (0x0A|0x20)
                          #define EPMM3            (0x0B|0x20)
                          #define EPMM4            (0x0C|0x20)
                          #define EPMM5            (0x0D|0x20)
                          #define EPMM6            (0x0E|0x20)
                          #define EPMM7            (0x0F|0x20)
                          #define EPMCSL           (0x10|0x20)
                          #define EPMCSH           (0x11|0x20)
                          #define EPMOL            (0x14|0x20)
                          #define EPMOH            (0x15|0x20)
                          #define EWOLIE           (0x16|0x20)
                          #define EWOLIR           (0x17|0x20)
                          #define ERXFCON          (0x18|0x20)
                          #define EPKTCNT          (0x19|0x20)
                          // Bank 2 registers
                          #define MACON1           (0x00|0x40|0x80)
                          #define MACON2           (0x01|0x40|0x80)
                          #define MACON3           (0x02|0x40|0x80)
                          #define MACON4           (0x03|0x40|0x80)
                          #define MABBIPG          (0x04|0x40|0x80)
                          #define MAIPGL           (0x06|0x40|0x80)
                          #define MAIPGH           (0x07|0x40|0x80)
                          #define MACLCON1         (0x08|0x40|0x80)
                          #define MACLCON2         (0x09|0x40|0x80)
                          #define MAMXFLL          (0x0A|0x40|0x80)
                          #define MAMXFLH          (0x0B|0x40|0x80)
                          #define MAPHSUP          (0x0D|0x40|0x80)
                          #define MICON            (0x11|0x40|0x80)
                          #define MICMD            (0x12|0x40|0x80)
                          #define MIREGADR         (0x14|0x40|0x80)
                          #define MIWRL            (0x16|0x40|0x80)
                          #define MIWRH            (0x17|0x40|0x80)
                          #define MIRDL            (0x18|0x40|0x80)
                          #define MIRDH            (0x19|0x40|0x80)
                          // Bank 3 registers
                          #define MAADR1           (0x00|0x60|0x80)
                          #define MAADR0           (0x01|0x60|0x80)
                          #define MAADR3           (0x02|0x60|0x80)
                          #define MAADR2           (0x03|0x60|0x80)
                          #define MAADR5           (0x04|0x60|0x80)
                          #define MAADR4           (0x05|0x60|0x80)
                          #define EBSTSD           (0x06|0x60)
                          #define EBSTCON          (0x07|0x60)
                          #define EBSTCSL          (0x08|0x60)
                          #define EBSTCSH          (0x09|0x60)
                          #define MISTAT           (0x0A|0x60|0x80)
                          #define EREVID           (0x12|0x60)
                          #define ECOCON           (0x15|0x60)
                          #define EFLOCON          (0x17|0x60)
                          #define EPAUSL           (0x18|0x60)
                          #define EPAUSH           (0x19|0x60)
                          // PHY registers
                          #define PHCON1           0x00
                          #define PHSTAT1          0x01
                          #define PHHID1           0x02
                          #define PHHID2           0x03
                          #define PHCON2           0x10
                          #define PHSTAT2          0x11
                          #define PHIE             0x12
                          #define PHIR             0x13
                          #define PHLCON           0x14
                          
                          // ENC28J60 ERXFCON Register Bit Definitions
                          #define ERXFCON_UCEN     0x80
                          #define ERXFCON_ANDOR    0x40
                          #define ERXFCON_CRCEN    0x20
                          #define ERXFCON_PMEN     0x10
                          #define ERXFCON_MPEN     0x08
                          #define ERXFCON_HTEN     0x04
                          #define ERXFCON_MCEN     0x02
                          #define ERXFCON_BCEN     0x01
                          // ENC28J60 EIE Register Bit Definitions
                          #define EIE_INTIE        0x80
                          #define EIE_PKTIE        0x40
                          #define EIE_DMAIE        0x20
                          #define EIE_LINKIE       0x10
                          #define EIE_TXIE         0x08
                          #define EIE_WOLIE        0x04
                          #define EIE_TXERIE       0x02
                          #define EIE_RXERIE       0x01
                          // ENC28J60 EIR Register Bit Definitions
                          #define EIR_PKTIF        0x40
                          #define EIR_DMAIF        0x20
                          #define EIR_LINKIF       0x10
                          #define EIR_TXIF         0x08
                          #define EIR_WOLIF        0x04
                          #define EIR_TXERIF       0x02
                          #define EIR_RXERIF       0x01
                          // ENC28J60 ESTAT Register Bit Definitions
                          #define ESTAT_INT        0x80
                          #define ESTAT_LATECOL    0x10
                          #define ESTAT_RXBUSY     0x04
                          #define ESTAT_TXABRT     0x02
                          #define ESTAT_CLKRDY     0x01
                          // ENC28J60 ECON2 Register Bit Definitions
                          #define ECON2_AUTOINC    0x80
                          #define ECON2_PKTDEC     0x40
                          #define ECON2_PWRSV      0x20
                          #define ECON2_VRPS       0x08
                          // ENC28J60 ECON1 Register Bit Definitions
                          #define ECON1_TXRST      0x80
                          #define ECON1_RXRST      0x40
                          #define ECON1_DMAST      0x20
                          #define ECON1_CSUMEN     0x10
                          #define ECON1_TXRTS      0x08
                          #define ECON1_RXEN       0x04
                          #define ECON1_BSEL1      0x02
                          #define ECON1_BSEL0      0x01
                          // ENC28J60 MACON1 Register Bit Definitions
                          #define MACON1_LOOPBK    0x10
                          #define MACON1_TXPAUS    0x08
                          #define MACON1_RXPAUS    0x04
                          #define MACON1_PASSALL   0x02
                          #define MACON1_MARXEN    0x01
                          // ENC28J60 MACON2 Register Bit Definitions
                          #define MACON2_MARST     0x80
                          #define MACON2_RNDRST    0x40
                          #define MACON2_MARXRST   0x08
                          #define MACON2_RFUNRST   0x04
                          #define MACON2_MATXRST   0x02
                          #define MACON2_TFUNRST   0x01
                          // ENC28J60 MACON3 Register Bit Definitions
                          #define MACON3_PADCFG2   0x80
                          #define MACON3_PADCFG1   0x40
                          #define MACON3_PADCFG0   0x20
                          #define MACON3_TXCRCEN   0x10
                          #define MACON3_PHDRLEN   0x08
                          #define MACON3_HFRMLEN   0x04
                          #define MACON3_FRMLNEN   0x02
                          #define MACON3_FULDPX    0x01
                          // ENC28J60 MICMD Register Bit Definitions
                          #define MICMD_MIISCAN    0x02
                          #define MICMD_MIIRD      0x01
                          // ENC28J60 MISTAT Register Bit Definitions
                          #define MISTAT_NVALID    0x04
                          #define MISTAT_SCAN      0x02
                          #define MISTAT_BUSY      0x01
                          // ENC28J60 PHY PHCON1 Register Bit Definitions
                          #define PHCON1_PRST      0x8000
                          #define PHCON1_PLOOPBK   0x4000
                          #define PHCON1_PPWRSV    0x0800
                          #define PHCON1_PDPXMD    0x0100
                          // ENC28J60 PHY PHSTAT1 Register Bit Definitions
                          #define PHSTAT1_PFDPX    0x1000
                          #define PHSTAT1_PHDPX    0x0800
                          #define PHSTAT1_LLSTAT   0x0004
                          #define PHSTAT1_JBSTAT   0x0002
                          // ENC28J60 PHY PHCON2 Register Bit Definitions
                          #define PHCON2_FRCLINK   0x4000
                          #define PHCON2_TXDIS     0x2000
                          #define PHCON2_JABBER    0x0400
                          #define PHCON2_HDLDIS    0x0100
                          
                          // ENC28J60 Packet Control Byte Bit Definitions
                          #define PKTCTRL_PHUGEEN  0x08
                          #define PKTCTRL_PPADEN   0x04
                          #define PKTCTRL_PCRCEN   0x02
                          #define PKTCTRL_POVERRIDE 0x01
                          
                          // SPI operation codes
                          #define ENC28J60_READ_CTRL_REG       0x00
                          #define ENC28J60_READ_BUF_MEM        0x3A
                          #define ENC28J60_WRITE_CTRL_REG      0x40
                          #define ENC28J60_WRITE_BUF_MEM       0x7A
                          #define ENC28J60_BIT_FIELD_SET       0x80
                          #define ENC28J60_BIT_FIELD_CLR       0xA0
                          #define ENC28J60_SOFT_RESET          0xFF
                          
                          
                          // start with recbuf at 0/
                          #define RXSTART_INIT     0x0
                          // receive buffer end
                          #define RXSTOP_INIT      (0x1FFF-0x0600-1)
                          // start TX buffer at 0x1FFF-0x0600, pace for one full ethernet frame (~1500 bytes)
                          #define TXSTART_INIT     (0x1FFF-0x0600)
                          // stp TX buffer at end of mem
                          #define TXSTOP_INIT      0x1FFF
                          //
                          // max frame length which the conroller will accept:
                          #define MAX_FRAMELEN        1500    
                          #define CS	LATBbits.LATB1		//chip select: B1
                          #define ms_count 125			//so dem tuong ung voi 1ms, cho timer1
                          
                          static int MyMAC[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
                          static int MyIP[4] = {192,168,1,23};
                          //static unsigned int mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}; 
                          //static unsigned int myip[4] = {10,0,0,24};
                          int MACAddr[6];
                          int IPAddr[4];
                          int wwwport=80;
                          
                          unsigned int time_out;
                          static unsigned int Enc28j60Bank;
                          static unsigned int NextPacketPtr;
                          
                          #define waitspi() while(!SPI1STATbits.SPIRBF)
                          #define LOW(a)  (a & 0xFF)
                          #define HIGH(a) ((a>>8) & 0xFF)
                          
                          void Init_PORTS(void) 
                          {	ADPCFG = 0xFFFF;
                          	//LATD = 0;		//xoa thanh ghi chot
                          	LATB = 0;	
                          	LATF = 0;
                          	TRISB = 0;
                          	_TRISF2 = 1;			//SDI
                          	_TRISF3 = 0;			//SDO
                          	_TRISF6 = 0;			//SCK
                          
                          }
                          
                          //Chuong trinh con khoi tao Timer 1, tran 360*50 lan moi giay
                          //------------------------------------------------------------------------------
                          void Init_TMR1(void) {
                          	TMR1 = 0;			//Xoa so dem trong TMR1
                          	PR1 = ms_count;		//Tiemr 1 tran sau moi ms
                          	_T1IF = 0;			//Xoa co ngat cua Timer 1
                          	T1CON = 0x0020;		//Dung Fcy lam clock, prescale = 1:64, tat Timer 1
                          	_T1IE = 1;			//Cho phep ngat Timer 1
                          }
                          
                          //Chuong trinh con khoi tao module SPI, che do master
                          //------------------------------------------------------------------------------
                          
                          void Init_SPI(void) {
                          
                          	SPI1CON = 0x073A;	//PPRE*SPRE = 1:8, 1 MHz SPI clock, SMP = 1, Master
                          
                          	SPI1STATbits.SPIROV = 0; //No overflow occurred
                          	SPI1STATbits.SPIEN = 1;	 // Enable module SPI
                          }
                          
                          void DelayMs(unsigned n)	//Tao tre mot so ms
                          {
                          	PR1=n*ms_count;			//dat nguong tran vao PR1
                          	time_out=0;				//Xoa co het thoi gian cho
                          	T1CONbits.TON=1;		//bat timer 1
                          	while (time_out==0);	//Cho den khi het thoi gian cho
                          	T1CONbits.TON=0;		//Tat timer 1
                          	TMR1=0;
                          	
                          }
                          
                          void _ISR _T1Interrupt(void) 
                          {
                          	_T1IF = 0;			//Xoa co ngat
                          	time_out = 1;
                          }
                          
                          unsigned int enc28j60ReadOp(unsigned int op, unsigned int address)
                          {
                                  CS=0;
                                  // issue read command
                                  SPI1BUF = op | (address & ADDR_MASK);
                                  waitspi();
                                  // read data
                                  SPI1BUF = 0x00;
                                  waitspi();
                                  // do dummy read if needed (for mac and mii, see datasheet page 29)
                                  if(address & 0x80)
                                  {
                                          SPI1BUF = 0x00;
                                          waitspi();
                                  }
                                  // release CS
                                  CS=1;
                                  return(SPI1BUF);
                          }
                          
                          void enc28j60WriteOp(unsigned int op, unsigned int address, unsigned int data)
                          {		//_LATB3=0;
                                  CS=0;
                                  // issue write command
                                  SPI1BUF = op | (address & ADDR_MASK);  //ADDR_MASK=0x1F
                                  waitspi();
                                  // write data
                                  SPI1BUF = data;
                                  waitspi();
                                  CS=1; //_LATB3=1;
                          }
                          void enc28j60ReadBuffer(unsigned long len, unsigned int* data)
                          {
                                  CS=0;
                                  // issue read command
                                  SPI1BUF = ENC28J60_READ_BUF_MEM;
                                  waitspi();
                                  while(len)
                                  {
                                          len--;
                                          // read data
                                          SPI1BUF = 0x00;
                                          waitspi();
                                          *data = SPI1BUF;
                                          data++;
                                  }
                                  *data='\0';
                                  CS=1;
                          }
                          
                          void enc28j60WriteBuffer(unsigned long len, unsigned int* data)
                          {
                                  CS=0;
                                  // issue write command
                                  SPI1BUF = ENC28J60_WRITE_BUF_MEM;
                                  waitspi();
                                  while(len)
                                  {
                                          len--;
                                          // write data
                                          SPI1BUF = *data;
                                          data++;
                                          waitspi();
                                  }
                                  CS=1;
                          }
                          
                          void enc28j60SetBank(unsigned int address)
                          {
                                  // set the bank (if needed)
                                  if((address & BANK_MASK) != Enc28j60Bank)  //BANK_MASK=0x60
                                  {
                                          // set the bank
                                          enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, (ECON1_BSEL1|ECON1_BSEL0));
                                          enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, (address & BANK_MASK)>>5);
                                          Enc28j60Bank = (address & BANK_MASK);
                                  }
                          }
                          
                          unsigned int enc28j60Read(unsigned int address)
                          {
                                  // set the bank
                                  enc28j60SetBank(address);
                                  // do the read
                                  return enc28j60ReadOp(ENC28J60_READ_CTRL_REG, address);
                          }
                          
                          void enc28j60Write(unsigned int address, unsigned int data)   
                          {
                                  // set the bank    
                                  enc28j60SetBank(address);
                                  // do the write
                                  enc28j60WriteOp(ENC28J60_WRITE_CTRL_REG, address, data);
                          }
                          
                          // read upper 8 bits
                          unsigned long enc28j60PhyReadH(unsigned int address)
                          {
                          
                          	// Set the right address and start the register read operation
                          	enc28j60Write(MIREGADR, address);
                          	enc28j60Write(MICMD, MICMD_MIIRD);
                                  DelayMs(2);
                          
                          	// wait until the PHY read completes
                          	while(enc28j60Read(MISTAT) & MISTAT_BUSY);
                          
                          	// reset reading bit
                          	enc28j60Write(MICMD, 0x00);
                          	
                          	return (enc28j60Read(MIRDH));
                          }
                          
                          void enc28j60PhyWrite(unsigned int address, unsigned long data)
                          {
                          		
                                  // set the PHY register address
                                  enc28j60Write(MIREGADR, address);
                                  // write the PHY data
                                  enc28j60Write(MIWRL, LOW(data));
                                  enc28j60Write(MIWRH, HIGH(data));  
                                  // wait until the PHY write completes
                                  while(enc28j60Read(MISTAT) & MISTAT_BUSY);
                          		{
                                          DelayMs(5);
                                  }
                          }
                          
                          void enc28j60Init(unsigned int* macaddr)
                          {
                          	// perform system reset
                               enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET); 
                               DelayMs(2);
                               while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY)); _LATB3=1;
                          
                          	// check CLKRDY bit to see if reset is complete
                                  // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.
                          	//while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
                          	// do bank 0 stuff
                          	// initialize receive buffer
                          	// 16-bit transfers, must write low byte first
                          	// set receive buffer start address
                          	NextPacketPtr = RXSTART_INIT;
                                  // Rx start
                          	enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
                          	enc28j60Write(ERXSTH, RXSTART_INIT>>8);
                          	// set receive pointer address
                          	enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
                          	enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
                          	// RX end
                          	enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
                          	enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
                          	// TX start
                          	enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
                          	enc28j60Write(ETXSTH, TXSTART_INIT>>8);
                          	// TX end
                          	enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
                          	enc28j60Write(ETXNDH, TXSTOP_INIT>>8);  
                          	// do bank 1 stuff, packet filter:
                                  // For broadcast packets we allow only ARP packtets
                                  // All other packets should be unicast only for our mac (MAADR)
                                  //
                                  // The pattern to match on is therefore
                                  // Type     ETH.DST
                                  // ARP      BROADCAST
                                  // 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
                                  // in binary these poitions are:11 0000 0011 1111
                                  // This is hex 303F->EPMM0=0x3f,EPMM1=0x30
                          	enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
                          	enc28j60Write(EPMM0, 0x3f);
                          	enc28j60Write(EPMM1, 0x30);
                          	enc28j60Write(EPMCSL, 0xf9);
                          	enc28j60Write(EPMCSH, 0xf7);
                                  //do bank 2 stuff
                          	// enable MAC receive
                          	enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
                          	// bring MAC out of reset
                          	enc28j60Write(MACON2, 0x00); 
                          	// enable automatic padding to 60bytes and CRC operations
                          	enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
                          	// set inter-frame gap (non-back-to-back)
                          	enc28j60Write(MAIPGL, 0x12);
                          	enc28j60Write(MAIPGH, 0x0C);
                          	// set inter-frame gap (back-to-back)
                          	enc28j60Write(MABBIPG, 0x12);
                          	// Set the maximum packet size which the controller will accept
                                  // Do not send packets longer than MAX_FRAMELEN:
                          	enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF);	
                          	enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
                          	// do bank 3 stuff
                                  // write MAC address
                                  // NOTE: MAC address in ENC28J60 is byte-backward
                                  enc28j60Write(MAADR5, macaddr[0]);
                                  enc28j60Write(MAADR4, macaddr[1]);
                                  enc28j60Write(MAADR3, macaddr[2]);
                                  enc28j60Write(MAADR2, macaddr[3]);
                                  enc28j60Write(MAADR1, macaddr[4]);
                                  enc28j60Write(MAADR0, macaddr[5]); 
                          	// no loopback of transmitted frames
                          	enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);   
                          	// switch to bank 0
                          	enc28j60SetBank(ECON1);
                          	// enable interrutps
                          	//enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
                          	// enable packet reception
                          	
                          	//enc28j60WriteOp(0b10000000, 0x1F, 0x04); _LATB5=1;
                          	enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
                          	//BFSReg(ECON1, 0b100);
                          }
                          
                          
                          // read the revision of the chip:
                          unsigned int enc28j60getrev(void)
                          {
                          	return(enc28j60Read(EREVID));
                          }
                          
                          // link status
                          unsigned int enc28j60linkup(void)
                          {
                                  // bit 10 (= bit 3 in upper reg)
                          	return(enc28j60PhyReadH(PHSTAT2) && 4);
                          }
                          
                          void enc28j60PacketSend(unsigned long len, unsigned int* packet)
                          {
                          	// Set the write pointer to start of transmit buffer area
                          	enc28j60Write(EWRPTL, LOW(TXSTART_INIT));
                          	enc28j60Write(EWRPTH, HIGH(TXSTART_INIT));
                          	// Set the TXND pointer to correspond to the packet size given
                          	enc28j60Write(ETXNDL, LOW(TXSTART_INIT + len));
                          	enc28j60Write(ETXNDH, HIGH(TXSTART_INIT + len));
                          	// write per-packet control byte (0x00 means use macon3 settings)
                          	enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
                          	// copy the packet into the transmit buffer
                          	enc28j60WriteBuffer(len, packet);
                          	// send the contents of the transmit buffer onto the network
                          	enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);
                                  // Reset the transmit logic problem. See Rev. B4 Silicon Errata point 12.
                          	if( (enc28j60Read(EIR) & EIR_TXERIF) ){
                                          enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
                                  }
                          }
                          
                          // Gets a packet from the network receive buffer, if one is available.
                          // The packet will by headed by an ethernet header.
                          //      maxlen  The maximum acceptable length of a retrieved packet.
                          //      packet  Pointer where packet data should be stored.
                          // Returns: Packet length in bytes if a packet was retrieved, zero otherwise.
                          unsigned long enc28j60PacketReceive(unsigned long maxlen, unsigned int* packet)
                          {
                          	unsigned long rxstat;
                          	unsigned long len;
                          	// check if a packet has been received and buffered
                          	//if( !(enc28j60Read(EIR) & EIR_PKTIF) ){
                                  // The above does not work. See Rev. B4 Silicon Errata point 6.
                          	if( enc28j60Read(EPKTCNT) ==0 ){
                          		return(0);
                                  }
                          
                          	// Set the read pointer to the start of the received packet
                          	enc28j60Write(ERDPTL, LOW(NextPacketPtr));
                          	enc28j60Write(ERDPTH, HIGH(NextPacketPtr));
                          	// read the next packet pointer
                          	NextPacketPtr  = LOW(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0));
                          	NextPacketPtr |= HIGH(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0));
                          	// read the packet length (see datasheet page 43)
                          	len  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);
                          	len |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;
                                  len-=4; //remove the CRC count
                          	// read the receive status (see datasheet page 43)
                          	rxstat  = LOW(enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0));
                          	rxstat |= HIGH((unsigned long) enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0));
                          	// limit retrieve length
                                  if (len>maxlen-1){
                                          len=maxlen-1;
                                  }
                                  // check CRC and symbol errors (see datasheet page 44, table 7-3):
                                  // The ERXFCON.CRCEN is set by default. Normally we should not
                                  // need to check this.
                                  if ((rxstat & 0x80)==0){
                                          // invalid
                                          len=0;
                                  }else{
                                          // copy the packet from the receive buffer
                                          enc28j60ReadBuffer(len, packet);
                                  }
                          	// Move the RX read pointer to the start of the next received packet
                          	// This frees the memory we just read out
                          	enc28j60Write(ERXRDPTL, LOW(NextPacketPtr));
                          	enc28j60Write(ERXRDPTH, HIGH(NextPacketPtr));
                          	// decrement the packet counter indicate we are done with this packet
                          	enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);
                          	return(len);
                          }
                          
                          int main(void)
                          {
                          	Init_PORTS();		//Khoi tao cac chan I/O
                          	Init_SPI();			//Khoi tao module SPI, che do master
                          	Init_TMR1();		//Khoi tao Timer 1, timer van chua chay
                          	DelayMs(2);
                          	T1CONbits.TON = 1;	//Bat Timer 1
                          
                          	enc28j60Init(MyMAC); 
                          
                                  //0x880 is PHLCON LEDB=on, LEDA=on
                          	enc28j60PhyWrite(PHLCON,0x880);
                          	DelayMs(1000); 
                          
                          	// 0x990 is PHLCON LEDB=off, LEDA=off
                          	// enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00);
                          	enc28j60PhyWrite(PHLCON,0x990);
                          	DelayMs(1000);
                          
                          	// 0x880 is PHLCON LEDB=on, LEDA=on
                          	enc28j60PhyWrite(PHLCON,0x880);
                          	DelayMs(1000);
                          	
                          	//0x990 is PHLCON LEDB=off, LEDA=off
                          	enc28j60PhyWrite(PHLCON,0x990);
                          	DelayMs(1000);
                          	
                                  enc28j60PhyWrite(PHLCON,0x476);
                          	DelayMs(100);
                          
                                  while(1) {};
                          	
                          	return(0);
                          }

                          Comment


                          • #58
                            Vậy có ai hoàn thiện cái giao diện web tốt không. Sao chỉ nghe nói thôi vậy, nếu có ai đó ra tay giúp đỡ cho cái luồng này ngày càng mạnh lên thì tốt quá. Mình nghĩ, để làm được thì bỏ ra khá là nhiều công sức nhưng ôm cái cục của mình nghiên cứu được suốt đời thì cũng không có gì là tự hào là ta làm được cả. Nên đồng chí nào có tấm lòng thì chia sẻ để mọi người cùng học hỏi trao đổi với nhau nào. Mình nghĩ như vậy không biết có vấn đề gì không? Nếu có thì cáo lỗi nhé!

                            Comment


                            • #59
                              Nguyên văn bởi laiquangtuye Xem bài viết
                              Vậy có ai hoàn thiện cái giao diện web tốt không. Sao chỉ nghe nói thôi vậy, nếu có ai đó ra tay giúp đỡ cho cái luồng này ngày càng mạnh lên thì tốt quá. Mình nghĩ, để làm được thì bỏ ra khá là nhiều công sức nhưng ôm cái cục của mình nghiên cứu được suốt đời thì cũng không có gì là tự hào là ta làm được cả. Nên đồng chí nào có tấm lòng thì chia sẻ để mọi người cùng học hỏi trao đổi với nhau nào. Mình nghĩ như vậy không biết có vấn đề gì không? Nếu có thì cáo lỗi nhé!
                              Nếu như bạn nghĩ thì mình không tham gia diễn đàn rồi, mình cũng từ diễn đàn mà học được nhiều thứ. Tuy nhiên bạn phải thông cảm, làm đã mất thời gian, nhưng ngồi viết đễ diễn giải cho người khác hiểu lại mất cả đống thời gian nữa. Nếu ở không thì không nói làm gì, ai cũng kiếm cơm mà.


                              Tất nhiên là khi nào rảnh, mình sẽ viết lại hết những gì mình làm cho các bạn tham khảo, thực chất cũng không quá phức tạp, vì cái phần driver hầu hết các hãng sản xuất chíp đã cung cấp, chủ yếu vẫn là ứng dụng của mình để làm gì thôi
                              Diễn đàn Vi điều khiển:

                              Comment


                              • #60
                                Hay lắm, Nếu có thời gian hơn nữa bạn có thể đi sâu vào nội dung để mọi người cùng them khảo thì rất hoan nghênh. Mình thấy giao diện web mà bạn tạo ra khá là đẹp.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X