00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #include "enc28j60_spi_rx.h"
00046 #include "enc28j60_spi.h"
00047
00048
00049
00050 unsigned int rx_next_pkt;
00051 unsigned int rx_pkt_len;
00052 unsigned char receive_status[STATUS_LEN];
00053 unsigned char rx_initialized;
00054
00055
00056
00057
00058
00062 char rx_init(){
00063
00064 select_bank(1);
00065
00066 if((read_reg8(EPKTCNT,NO_DUMMY) > 0) & (rx_initialized == 0)){
00067 rx_initialized = 1;
00068 select_bank(0);
00069
00070 spi_read((char*) &rx_next_pkt, PTR_LEN);
00071 spi_read(&receive_status,STATUS_LEN);
00072
00073 unsigned int rec_len = *receive_status;
00074
00075 int ERDPT_tmp = read_reg16(ERDPT,NO_DUMMY);
00076
00077 if(ERDPT_tmp > rx_next_pkt){
00078 rx_pkt_len = RX_END - ERDPT_tmp + rx_next_pkt - RX_START;
00079 }
00080 else{
00081 rx_pkt_len = rx_next_pkt - ERDPT_tmp;
00082 }
00083
00084 if((rec_len & 0x0001) > 0)
00085 rx_pkt_len -= 5;
00086 else
00087 rx_pkt_len -= 4;
00088 }
00089 else return -1;
00090
00091 return 0;
00092 }
00093
00097 char rx_free(){
00098
00099 if(rx_initialized == 1){
00100 select_bank(0);
00101
00102 write_reg16(ERDPT,rx_next_pkt);
00103
00104 write_reg16(ERXRDPT,rx_next_pkt);
00105
00106 bf_set(ECON2,ECON2_PKTDEC);
00107 rx_initialized = 0;
00108 return 0;
00109 }
00110 return -1;
00111 }
00112
00116 inline unsigned int rx_getc(){
00117
00118 if(rx_pkt_len--)
00119 return (unsigned int) spi_getc();
00120 else
00121 return -1;
00122 };
00123
00127 unsigned int rx_read(void* ptr, int length){
00128
00129 if(rx_pkt_len == 0)
00130 return 0;
00131 else if(length >= rx_pkt_len){
00132 int bytes_readed = rx_pkt_len;
00133 spi_read(ptr, rx_pkt_len);
00134 rx_pkt_len = 0;
00135 return bytes_readed;
00136 }
00137 else{
00138 spi_read(ptr, length);
00139 rx_pkt_len -= length;
00140 return length;
00141 }
00142 }
00143
00147 unsigned int rx_getline(void* ptr, int max_length){
00148
00149 max_length--;
00150
00151 if(rx_pkt_len == 0){
00152 ((char*)ptr)[0] = 0;
00153 return 0;
00154 }
00155 else if(max_length >= rx_pkt_len){
00156 int bytes_readed = spi_getline(ptr, rx_pkt_len);
00157 ((char*)ptr)[bytes_readed] = 0;
00158 rx_pkt_len -= bytes_readed;
00159 return bytes_readed;
00160 }
00161 else{
00162 int bytes_readed = spi_getline(ptr, max_length);
00163 ((char*)ptr)[bytes_readed] = 0;
00164 rx_pkt_len -= bytes_readed;
00165 return bytes_readed;
00166 }
00167 }
00168
00172 inline int rx_left(){
00173
00174 return rx_pkt_len;
00175 }
00176
00180 inline unsigned char rx_isempty(){
00181
00182 return (rx_pkt_len > 0) ? 0 : 1;
00183 }
00184
00188 inline void rx_cut_padding(unsigned char length){
00189
00190 rx_pkt_len -= length;
00191 return;
00192 }