source: rtos_arduino/trunk/arduino_lib/libraries/Ethernet2/src/utility/w5500.cpp@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 6.3 KB
Line 
1/*
2 * Copyright (c) 2010 by WIZnet <support@wiznet.co.kr>
3 *
4 * This file is free software; you can redistribute it and/or modify
5 * it under the terms of either the GNU General Public License version 2
6 * or the GNU Lesser General Public License version 2.1, both as
7 * published by the Free Software Foundation.
8 *
9 * - 10 Apr. 2015
10 * Added support for Arduino Ethernet Shield 2
11 * by Arduino.org team
12 */
13
14#include <stdio.h>
15#include <string.h>
16#include "Arduino.h"
17
18#include "utility/w5500.h"
19//#if defined(W5500_ETHERNET_SHIELD)
20
21// W5500 controller instance
22W5500Class w5500;
23
24#define SPI_CS 10
25#define slaveSelectPin 10
26
27void W5500Class::init(void)
28{
29 delay(1000);
30#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)
31 initSS();
32 SPI.begin();
33/*#elif defined(ARDUINO_ARCH_SAMD)
34 pinMode (slaveSelectPin, OUTPUT);
35 digitalWrite(slaveSelectPin, HIGH);
36 SPI.begin();
37 //SPI.setClockDivider(2);
38 //SPI.setDataMode(SPI_MODE0); */
39#else
40 SPI.begin(SPI_CS);
41 // Set clock to 4Mhz (w5500 should support up to about 14Mhz)
42// SPI.setClockDivider(SPI_CS, 21);
43// SPI.setClockDivider(SPI_CS, 6); // 14 Mhz, ok
44// SPI.setClockDivider(SPI_CS, 3); // 28 Mhz, ok
45 SPI.setClockDivider(SPI_CS, 2); // 42 Mhz, ok
46 SPI.setDataMode(SPI_CS, SPI_MODE0);
47#endif
48 for (int i=0; i<MAX_SOCK_NUM; i++) {
49 uint8_t cntl_byte = (0x0C + (i<<5));
50 write( 0x1E, cntl_byte, 2); //0x1E - Sn_RXBUF_SIZE
51 write( 0x1F, cntl_byte, 2); //0x1F - Sn_TXBUF_SIZE
52 }
53}
54
55uint16_t W5500Class::getTXFreeSize(SOCKET s)
56{
57 uint16_t val=0, val1=0;
58 do {
59 val1 = readSnTX_FSR(s);
60 if (val1 != 0)
61 val = readSnTX_FSR(s);
62 }
63 while (val != val1);
64 return val;
65}
66
67uint16_t W5500Class::getRXReceivedSize(SOCKET s)
68{
69 uint16_t val=0,val1=0;
70 do {
71 val1 = readSnRX_RSR(s);
72 if (val1 != 0)
73 val = readSnRX_RSR(s);
74 }
75 while (val != val1);
76 return val;
77}
78
79void W5500Class::send_data_processing(SOCKET s, const uint8_t *data, uint16_t len)
80{
81 // This is same as having no offset in a call to send_data_processing_offset
82 send_data_processing_offset(s, 0, data, len);
83
84}
85
86void W5500Class::send_data_processing_offset(SOCKET s, uint16_t data_offset, const uint8_t *data, uint16_t len)
87{
88
89 uint16_t ptr = readSnTX_WR(s);
90 uint8_t cntl_byte = (0x14+(s<<5));
91 ptr += data_offset;
92 write(ptr, cntl_byte, data, len);
93 ptr += len;
94 writeSnTX_WR(s, ptr);
95
96}
97
98void W5500Class::recv_data_processing(SOCKET s, uint8_t *data, uint16_t len, uint8_t peek)
99{
100 uint16_t ptr;
101 ptr = readSnRX_RD(s);
102
103 read_data(s, ptr, data, len);
104 if (!peek)
105 {
106 ptr += len;
107 writeSnRX_RD(s, ptr);
108 }
109}
110
111void W5500Class::read_data(SOCKET s, volatile uint16_t src, volatile uint8_t *dst, uint16_t len)
112{
113 uint8_t cntl_byte = (0x18+(s<<5));
114 read((uint16_t)src , cntl_byte, (uint8_t *)dst, len);
115}
116
117uint8_t W5500Class::write(uint16_t _addr, uint8_t _cb, uint8_t _data)
118{
119#if defined(ARDUINO_ARCH_AVR)|| defined(ARDUINO_ARCH_SAMD)
120 setSS();
121 //SerialUSB.println("dentro avr");
122 SPI.transfer(_addr >> 8);
123 SPI.transfer(_addr & 0xFF);
124 SPI.transfer(_cb);
125 SPI.transfer(_data);
126 resetSS();
127/*#elif defined(ARDUINO_ARCH_SAMD)
128 digitalWrite(slaveSelectPin, LOW);
129 //SerialUSB.println("dentro samd");
130 SPI.transfer(_addr >> 8);
131 SPI.transfer(_addr & 0xFF);
132 SPI.transfer(_cb);
133 SPI.transfer(_data);
134 digitalWrite(slaveSelectPin, HIGH);*/
135#else
136 SPI.transfer(SPI_CS, _addr >> 8, SPI_CONTINUE);
137 SPI.transfer(SPI_CS, _addr & 0xFF, SPI_CONTINUE);
138 SPI.transfer(SPI_CS, _cb, SPI_CONTINUE);
139 SPI.transfer(SPI_CS, _data);
140#endif
141 return 1;
142}
143
144uint16_t W5500Class::write(uint16_t _addr, uint8_t _cb, const uint8_t *_buf, uint16_t _len)
145{
146#if defined(ARDUINO_ARCH_AVR)|| defined(ARDUINO_ARCH_SAMD)
147 setSS();
148 SPI.transfer(_addr >> 8);
149 SPI.transfer(_addr & 0xFF);
150 SPI.transfer(_cb);
151 for (uint16_t i=0; i<_len; i++){
152 SPI.transfer(_buf[i]);
153 }
154 resetSS();
155/*#elif defined(ARDUINO_ARCH_SAMD)
156 digitalWrite(slaveSelectPin, LOW);
157 SPI.transfer(_addr >> 8);
158 SPI.transfer(_addr & 0xFF);
159 SPI.transfer(_cb);
160 for (uint16_t i=0; i<_len; i++){
161 SPI.transfer(_buf[i]);
162 }
163 digitalWrite(slaveSelectPin, HIGH);*/
164#else
165 uint16_t i;
166 SPI.transfer(SPI_CS, _addr >> 8, SPI_CONTINUE);
167 SPI.transfer(SPI_CS, _addr & 0xFF, SPI_CONTINUE);
168 SPI.transfer(SPI_CS, _cb, SPI_CONTINUE);
169 for (i=0; i<_len-1; i++){
170 SPI.transfer(SPI_CS, _buf[i], SPI_CONTINUE);
171 }
172 SPI.transfer(SPI_CS, _buf[i]);
173
174#endif
175 return _len;
176}
177
178uint8_t W5500Class::read(uint16_t _addr, uint8_t _cb)
179{
180#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)
181 setSS();
182 SPI.transfer(_addr >> 8);
183 SPI.transfer(_addr & 0xFF);
184 SPI.transfer(_cb);
185 uint8_t _data = SPI.transfer(0);
186 resetSS();
187/*#elif defined(ARDUINO_ARCH_SAMD)
188 digitalWrite(slaveSelectPin, LOW);
189 SPI.transfer(_addr >> 8);
190 SPI.transfer(_addr & 0xFF);
191 SPI.transfer(_cb);
192 uint8_t _data = SPI.transfer(0);
193 digitalWrite(slaveSelectPin, HIGH);*/
194
195#else
196 SPI.transfer(SPI_CS, _addr >> 8, SPI_CONTINUE);
197 SPI.transfer(SPI_CS, _addr & 0xFF, SPI_CONTINUE);
198 SPI.transfer(SPI_CS, _cb, SPI_CONTINUE);
199 uint8_t _data = SPI.transfer(SPI_CS, 0);
200#endif
201 return _data;
202}
203
204uint16_t W5500Class::read(uint16_t _addr, uint8_t _cb, uint8_t *_buf, uint16_t _len)
205{
206#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)
207 setSS();
208 SPI.transfer(_addr >> 8);
209 SPI.transfer(_addr & 0xFF);
210 SPI.transfer(_cb);
211 for (uint16_t i=0; i<_len; i++){
212 _buf[i] = SPI.transfer(0);
213 }
214 resetSS();
215/*#elif defined(ARDUINO_ARCH_SAMD)
216 digitalWrite(slaveSelectPin, LOW);
217 SPI.transfer(_addr >> 8);
218 SPI.transfer(_addr & 0xFF);
219 SPI.transfer(_cb);
220 for (uint16_t i=0; i<_len; i++){
221 _buf[i] = SPI.transfer(0);
222 }
223 digitalWrite(slaveSelectPin, HIGH);*/
224
225#else
226 uint16_t i;
227 SPI.transfer(SPI_CS, _addr >> 8, SPI_CONTINUE);
228 SPI.transfer(SPI_CS, _addr & 0xFF, SPI_CONTINUE);
229 SPI.transfer(SPI_CS, _cb, SPI_CONTINUE);
230 for (i=0; i<_len-1; i++){
231 _buf[i] = SPI.transfer(SPI_CS, 0, SPI_CONTINUE);
232 }
233 _buf[_len-1] = SPI.transfer(SPI_CS, 0);
234
235
236#endif
237 return _len;
238}
239
240void W5500Class::execCmdSn(SOCKET s, SockCMD _cmd) {
241 // Send command to socket
242 writeSnCR(s, _cmd);
243 // Wait for command to complete
244 while (readSnCR(s))
245 ;
246}
247//#endif
Note: See TracBrowser for help on using the repository browser.