Teste Ethernet: Verificare daca este buna cablarea si eventual afisarea pe un LCD a rezultatului verificarii si tipul acesteia: straight, crossover sau rollover. Afisarea a 10 tipuri diferte de teste pe LCD
1) Testerul va afisa pe ecran firele asa cum sunt conectate intre cele doua mufe.
2) Se afiseaza daca un fir este corect conectat. In caz ca nu avem conexiune corecta se va desena o linie intrerupta si mufa la care s-a detectat eroarea.
3) Se afiseaza daca un cablu este intrerupt.
Teste pentru 3 tipuri de cablu:
4) straight-through 5) crossover 6) rollover
7) Afiseaza lungimea cablului.
8) Trimite un numar egal de pachete pe fiecare fir si contorizeaza la celalat capat ⇒ afiseaza procentajul de pachete care au ajuns la destinatie pentru tot cablul (eventual pentru fiecare din cele 8 fire in parte)
9) Calculeaza lungimea cablului
10) Verificarea conditiilor pentru CAT5 respectiv CAT5e <sau alternativ> voi implementa teste pentru attenuation, crosstalk (inca nu stiu exact cum)
Pentru comunicrea cu LCD-ul am folosit API-ul definit in laboratorul de PM:
/************************************************************************ * DEFINE-uri pentru parametrizarea modulului LCD ************************************************************************/ #define LcdDATA_DDR DDRA // Portul pe care conectam firele de date la LCD-ul #define LcdDATA_PORT PORTA #define LcdDATA_PIN PINA #define LcdCMD_DDR DDRA // Portul pe care conectam firele de comenzi la LCD #define LcdCMD_PORT PORTA #define LcdCMD_PIN PINA #define LcdD4 PA0 // Pin-ul pentru firul de date D4 de pe LCD #define LcdD5 PA1 // Pin-ul pentru firul de date D5 de pe LCD #define LcdD6 PA2 // Pin-ul pentru firul de date D6 de pe LCD #define LcdD7 PA3 // Pin-ul pentru firul de date D7 de pe LCD #define LcdRS PA4 // Pinul pentru selectare operatie (LCD) #define LcdRW PA5 // Pinul pentru Read/ Write (LCD) #define LcdE PA6 // Pinul de Enable (LCD) #define LCD_INSTR_4wire 0x28 // 4 fire date, font 5x8 #define LCD_INSTR_display 0x0C // Display On, Cursor On, Blinking On ( 1 Display Cursor Blink ) #define LCD_INSTR_clearDisplay 0x01 // Clear Display #define LCD_INSTR_returnHome 0x02 // Return Cursor and LCD to Home Position #define LCD_INSTR_nextLine 0xC0 // Return Cursor and LCD to Home Position #define LCD_INSTR_gotoCGRAM 0x40 // go to Character Generator RAM /************* * API LCD * *************/ void LCD_init(); // Initializare modul LCD.Trebuie apelata inainte de a se face orice operatie cu LCD-ul void LCD_writeInstruction(unsigned char _instruction); // Trimite o instructiune catre lcd (vezi datasheet) void LCD_writeData(unsigned char _data); // Trimite date catre LCD pentru afisare void LCD_write(unsigned char _byte); // trimite un bute catre LCD la modul general (nu conteaza daca e instructiune sau date) void LCD_waitNotBusy(); // Asteptam pana cand lcd-ul devine disponibil pt o noua comanda void LCD_waitInstructions(unsigned char _instructions); // Asteapta un numar de cicli de ceas. void LCD_print(char* _msg); // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere) void LCD_print2(char* _msg1, char* _msg2); // Afisare pe 2 lini pe LCD void LCD_printDecimal2u(unsigned int _n); // Afisare numar in baza 10 pe LCD void LCD_printHexa(unsigned int _n); // Afisare numar in baza 16 pe LCD
Pentru programarea: Design ENC28J60 - controller Ethernet cu interfata SPI, am folosit functiile:
// 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 // functions extern uint8_t enc28j60ReadOp(uint8_t op, uint8_t address); extern void enc28j60WriteOp(uint8_t op, uint8_t address, uint8_t data); extern void enc28j60ReadBuffer(uint16_t len, uint8_t* data); extern void enc28j60WriteBuffer(uint16_t len, uint8_t* data); extern void enc28j60SetBank(uint8_t address); extern uint8_t enc28j60Read(uint8_t address); extern void enc28j60Write(uint8_t address, uint8_t data); extern void enc28j60PhyWrite(uint8_t address, uint16_t data); extern void enc28j60Init(uint8_t* macaddr); extern void enc28j60PacketSend(uint16_t len, uint8_t* packet); extern uint16_t enc28j60PacketReceive(uint16_t maxlen, uint8_t* packet); extern uint8_t enc28j60getrev(void);