📄 csio.c
字号:
// ***************************************************************************// An 8051 Based Web Server// csio.c: driver code for CS8900A chip// By Mason Kidd 3/14/02// ***************************************************************************#include "csio.h"#include "lcd_disp.h"extern void write_byte(unsigned char io_port, unsigned char out_data);extern unsigned char read_byte(unsigned char io_port);extern void write_word(unsigned char io_port, unsigned int out_data);extern unsigned int read_wordL(unsigned char io_port);extern unsigned int read_wordH(unsigned char io_port);void cs_init(unsigned char *my_MAC_addr){ unsigned int nReturn = 0; // reset the chip write_word(IO_PPPointer, PP_SelfCTL); write_word(IO_PPData, RESET); // wait until chip is ready while (!(nReturn & INITD)) { write_word(IO_PPPointer, PP_SelfST); nReturn = read_wordL(IO_PPData); } // setup RxCTL(0104h) write_word(IO_PPPointer, PP_RxCTL); write_word(IO_PPData, RX_OK_ACCEPT | RX_IA_ACCEPT | RX_BROADCAST_ACCEPT); nReturn = read_wordL(IO_PPData); // write the MAC address starting at 0158h write_word(IO_PPPointer, PP_IA); write_word(IO_PPData, (my_MAC_addr[1] << 8) | my_MAC_addr[0]); write_word(IO_PPPointer, PP_IA + 2); write_word(IO_PPData, (my_MAC_addr[3] << 8) | my_MAC_addr[2]); write_word(IO_PPPointer, PP_IA + 4); write_word(IO_PPData, (my_MAC_addr[5] << 8) | my_MAC_addr[4]); // enable receive and transmit write_word(IO_PPPointer, PP_LineCTL); write_word(IO_PPData, SERIAL_RX_ON | SERIAL_TX_ON);}unsigned char cs_test(void){ unsigned int nReturn; // Read from PPData port, should get 0E63h nReturn = read_wordL(IO_PPData); if (nReturn != 0x630E) return 0; // Read from register RxCFG(0102h), should get 3h write_word(IO_PPPointer, PP_RxCFG); nReturn = read_wordL(IO_PPData); if (nReturn != 0x0003) return 0; lcdout('O'); lcdout('K'); lcdout(' '); lcd_crlf(); return 1;}bit rx_event_poll(void){ unsigned int nReturn = 0x0000; write_word(IO_PPPointer, PP_RxEvent); nReturn = read_wordL(IO_PPData); // write_word(IO_PPPointer, PP_TxEvent);// nReturn = read_wordL(IO_PPData); // write_word(IO_PPPointer, PP_BufEvent);// nReturn = read_wordL(IO_PPData); if ((nReturn & RX_OK) && !(nReturn & RX_HASH)) return 1; return 0;}unsigned int rx_packet(unsigned char *rx_buffer){ unsigned int data nStatus = 0; unsigned int data nLength = 0; unsigned char data i; unsigned char data cDataL, cDataH; nStatus = read_wordH(IO_RxTxData); nLength = read_wordH(IO_RxTxData); for (i = 0; i < nLength; i += 2) { cDataL = read_byte(IO_RxTxData); cDataH = read_byte(IO_RxTxData + 1); rx_buffer[i] = cDataL; rx_buffer[i + 1] = cDataH; } return nLength;} void tx_packet(unsigned char *tx_buffer, unsigned int tx_buffer_len){ unsigned int nReturn = 0; unsigned int i = 0; unsigned char *tx_send = (unsigned char *)tx_buffer; // write transmit command to TxCMD port write_word(IO_TxCMD, 0x00C0); // write transmit size to TxLength port write_word(IO_TxLength, tx_buffer_len); // wait until space is available while (!(nReturn & READY_FOR_TX_NOW)) { write_word(IO_PPPointer, PP_BusST); nReturn = read_wordL(IO_PPData); } // round odd packets up and convert to words tx_buffer_len = (tx_buffer_len + 1) >> 1; for (i = 0; i < tx_buffer_len; i++) {// write_word(IO_RxTxData, *(tx_send++)); write_byte(IO_RxTxData, *(tx_send)); write_byte(IO_RxTxData + 1, *(tx_send + 1)); tx_send += 2; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -