lowpowerlab / spiflash Goto Github PK
View Code? Open in Web Editor NEWArduino library for read/write access to SPI flash memory chips
License: GNU General Public License v3.0
Arduino library for read/write access to SPI flash memory chips
License: GNU General Public License v3.0
Hi, i use the node.ino example of the RFM69 Library. But on compiling i got these error the obove error....
I am using the SPIFlash library on my device and it works great when the flash chip is present. I have found, however, that if the chip is not present, the library hangs when calling flash.initialize()
from my Arduino sketch.
I have found that when a chip is not present on my hardware SPI.transfer(0)
returns 255, which makes readStatus()
always return 255, which makes busy()
always return 1, which makes while(busy());
in command()
loop forever, which makes my firmware hang.
The problem is that a flash chip not present looks like a busy flash chip. I think it would be great if a no present flash chip were not busy.
For my journey down this rabbit hole, see PaxInstruments/t400-firmware#125
I'm trying to compile this for my Mega2560 board, but is tild that SS_FLASHMEM is not declared.
I do not know how and what to defined this as
Whether to support other size flash other than 4Mb flash
Not a big issue, but in the SPIFlash_ReadWrite example, the LED pin is defined at the top, but is hardcoded to 9 in the actual use.
Note: Bug found when using:
Hardware
Moteino Trace Antenna RFM69HCW 915MHz with Flash Memory Chip
LowPowerLab BME280 Board
1 400mAh LiPo battery (from Adafruit)
1 MOhm resistor from VIN to A7 - Battery Monitor
1 MOhm resistor from A7 to Ground
1 Solderless breadboard
Software
Default LowPowerLab WeatherMote Example sketch that was configured to the network.
Arduino: 1.6.11 (Mac OS X), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
/Applications/Arduino.app/Contents/Java/arduino-builder -dump-prefs -logger=machine -hardware /Applications/Arduino.app/Contents/Java/hardware -hardware /Users/WenhuiZhang/Library/Arduino15/packages -tools /Applications/Arduino.app/Contents/Java/tools-builder -tools /Applications/Arduino.app/Contents/Java/hardware/tools/avr -tools /Users/WenhuiZhang/Library/Arduino15/packages -built-in-libraries /Applications/Arduino.app/Contents/Java/libraries -libraries /Users/WenhuiZhang/Documents/Arduino/libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=0X2341_0X0042 -ide-version=10611 -build-path /var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino6 -prefs=runtime.tools.avr-gcc.path=/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2 -verbose /Users/WenhuiZhang/Downloads/SPIFlash/examples/SPIFlash_ReadWrite/SPIFlash_ReadWrite.ino
/Applications/Arduino.app/Contents/Java/arduino-builder -compile -logger=machine -hardware /Applications/Arduino.app/Contents/Java/hardware -hardware /Users/WenhuiZhang/Library/Arduino15/packages -tools /Applications/Arduino.app/Contents/Java/tools-builder -tools /Applications/Arduino.app/Contents/Java/hardware/tools/avr -tools /Users/WenhuiZhang/Library/Arduino15/packages -built-in-libraries /Applications/Arduino.app/Contents/Java/libraries -libraries /Users/WenhuiZhang/Documents/Arduino/libraries -fqbn=arduino:avr:mega:cpu=atmega2560 -vid-pid=0X2341_0X0042 -ide-version=10611 -build-path /var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino6 -prefs=runtime.tools.avr-gcc.path=/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2 -verbose /Users/WenhuiZhang/Downloads/SPIFlash/examples/SPIFlash_ReadWrite/SPIFlash_ReadWrite.ino
Using board 'mega' from platform in folder: /Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14
Using core 'arduino' from platform in folder: /Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14
Build options changed, rebuilding all
Detecting libraries used...
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash/DMASPI.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash/SPIFlash.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src/SPI.cpp" -o "/dev/null"
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/dev/null"
Generating function prototypes...
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/preproc/ctags_target_for_gcc_minus_e.cpp"
"/Applications/Arduino.app/Contents/Java/tools-builder/ctags/5.8-arduino10/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/preproc/ctags_target_for_gcc_minus_e.cpp"
Compiling sketch...
"/Users/WenhuiZhang/Library/Arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.3-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10611 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/cores/arduino" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/variants/mega" "-I/Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash" "-I/Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI/src" "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp" -o "/var/folders/qd/xz6y3zgn0sb8g920b3p_6tph0000gn/T/build437cbc79e0e0f2bf32157c84dc737f09.tmp/sketch/SPIFlash_ReadWrite.ino.cpp.o"
/Users/WenhuiZhang/Downloads/SPIFlash/examples/SPIFlash_ReadWrite/SPIFlash_ReadWrite.ino: In function 'void setup()':
SPIFlash_ReadWrite:69: error: 'class SPIFlash' has no member named 'initialize'
if (flash.initialize())
^
/Users/WenhuiZhang/Downloads/SPIFlash/examples/SPIFlash_ReadWrite/SPIFlash_ReadWrite.ino: In function 'void loop()':
SPIFlash_ReadWrite:100: error: 'class SPIFlash' has no member named 'chipErase'
flash.chipErase();
^
SPIFlash_ReadWrite:101: error: 'class SPIFlash' has no member named 'busy'
while(flash.busy());
^
SPIFlash_ReadWrite:107: error: 'class SPIFlash' has no member named 'readDeviceId'
Serial.println(flash.readDeviceId(), HEX);
^
Multiple libraries were found for "SPIFlash.h"
Used: /Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash
Not used: /Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash-master
Using library SPIFlash at version 2.5.0 in folder: /Users/WenhuiZhang/Documents/Arduino/libraries/SPIFlash
Using library SPI at version 1.0 in folder: /Users/WenhuiZhang/Library/Arduino15/packages/arduino/hardware/avr/1.6.14/libraries/SPI
exit status 1
'class SPIFlash' has no member named 'initialize'
I get the following error while compiling software that includes the SPIFlash library
SPIFlash.h:110:8: error: expected unqualified-id before '{' token
Hello. I'm writing this issue with hope that you could give me some help or guidance.
I've ported your library to work with CH552 microcontrollers, it was simple because your library is easy to use and well written. Source is here https://github.com/DeqingSun/ch55xduino/tree/ch55xduino/ch55xduino/ch55x/libraries/SPIFlash
During my tests, I'm facing a strange behavior when I'm reading data. I'm using a W25Q32 (4MB)
Let me explain step-by-step what happens, maybe you've already been through this. Any help is appreciated:
Notice there is a pattern in the readings, only the page 1,2,4,8 and 16 contains the byte I wrote.
//I'm reading the flash like this:
for (int j=0; j<16; j++) {
readBytes((j*256), _sbuffer, 255);
for (uint8_t i=0; i<255; i++) {
USBSerial_print(_sbuffer[i], HEX);
USBSerial_print(".");
}
}
OUTPUT:
Reading addr: 0 until 255
1) AA.AA.AA.AA.AA.AA.AA.AA.AA.AA. . (abbreviated for brevity reason) . .AA.AA.AA.AA.
Reading addr: 256 until 511
2) AA.AA.AA.AA.AA.AA.AA.AA.AA.AA. . . .AA.AA.AA.AA.
Reading addr: 512 until 767
3) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 768 until 1023
4) AA.AA.AA.AA.AA.AA.AA.AA.AA.AA. . . .AA.AA.AA.AA.
Reading addr: 1024 until 1279
5) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 1280 until 1535
6) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 1536 until 1791
7) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 1792 until 2047
8) AA.AA.AA.AA.AA.AA.AA.AA.AA.AA. . . .AA.AA.AA.AA.
Reading addr: 2048 until 2303
9) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 2304 until 2559
10) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 2560 until 2815
11) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 2816 until 3071
12) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 3072 until 3327
13) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 3328 until 3583
14) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 3584 until 3839
15) FF.FF.FF.FF.FF.FF.FF.FF.FF.FF. . . .FF.FF.FF.FF.
Reading addr: 3840 until 4095
16) AA.AA.AA.AA.AA.AA.AA.AA.AA.AA. . . .AA.AA.AA.AA.
Any chance of changing the library name to prevent a conflict with the following:
https://github.com/Marzogh/SPIFlash
Always seems to give a "library update is available" message which is annoying. When you go in to manage the libraries, it comes up with a different SPIFlash by Prajwal Bhattaram - I have never used this library but it somehow seems integrated to the Arduino environment.
How to use this library for black pill STM32F401CCU6?
The files SPIFlash.cpp and SPIFlash.h, as I understand it, are an "add-on" over the main SPI library from Arduino?
I am using an arduino IDE and two cores to work with a microcontroller STM32F401CCU6.
Each kernel folder has its own files with examples for working with SPI.
Accordingly, I have three folders on the PC with the same file names in them:
#include <SPI.h>
I think the JEDEC ID is 3 bytes:
https://www.winbond.com/resource-files/w25x40cl_e01.pdf
1: Manufacturer Id
2: Memory type
3: Capacity type
This:
uint32_t jedecid = 0;
jedecid |= (uint32_t)SPI.transfer(0) << 16;
jedecid |= SPI.transfer(0) << 8;
jedecid |= SPI.transfer(0);
yields EF3013 and EF4016 on 2 boards I have
when recording page 256 (0x100)repeat recording page 0 (0x01) and when recording page 257 (0x101) repeat recording page 1(0x01) ..... etc
does not read correctly page 256(0x100) or higher
the above using TestFlash example
SPI.begin must be call even in the SPI library with " transaction" included in the Arduino IDE 1.8.5.
See that example : https://www.arduino.cc/en/Tutorial/SPITransaction.
A good place to include it could be in SPIFlash initialize around line 94 and delete around line 70
/// setup SPI, read device ID etc...
boolean SPIFlash::initialize()
{
_SPCR = SPCR;
_SPSR = SPSR;
pinMode(_slaveSelectPin, OUTPUT);
SPI.begin();
#ifdef SPI_HAS_TRANSACTION
_settings = SPISettings(4000000, MSBFIRST, SPI_MODE0);
#endif
also to get the complete jedecID (3 bytes):
in SPIFlash.h ๐
line 106: uint32_t readDeviceId();
in SPIFlash.cpp:
uint32_t SPIFlash::readDeviceId()
{
#if defined(AVR_ATmega32U4) // Arduino Leonardo, MoteinoLeo
command(SPIFLASH_IDREAD); // Read JEDEC ID
#else
select();
SPI.transfer(SPIFLASH_IDREAD);
#endif
uint32_t jedecid = SPI.transfer(0) ;
jedecid = jedecid << 16 & 0x00ffffff ;
jedecid |= SPI.transfer(0) << 8 ;
jedecid |= SPI.transfer(0);
unselect();
return jedecid;
}
The example code in SPIFlash_ReadWrite.ino does not seem to work unless you add SPI.begin() before flash.initialize(). I noticed this when the "node" example from the RFM69 library worked but this example did not.
This library works perfectly fine on Arduino 1.0.6 but inside the new release 1.6.0 the sketch hangs very soon. Is easy to check using the SPIFlash_ReadWrite example. I think this issue is because of changes on SPI.h library but didn't found any solution.
According to datasheet, powered down chip will ignore every instruction except "Release from Power-Down" and "Device ID". This includes the Read Status Register.
In such scenario (at least on my platform) SPI.transfer(SPIFLASH_STATUSREAD) always returns 0xFF, so while(busy()) loop will never complete.
This loop is executed before sending instruction to the chip, so there is no way to access flash after sleeping it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.