博客首页 | 排行榜 |

设计我最赞的博客

个人档案
博文分类
网络启动的闹钟 (Net-Enabled Alarm Clock)  2008-08-30 16:57
Unlike old-school mechanical alarm clocks that you have to set manually, DJ‘s Internet-connected alarm clock provides three primary features: automatic time setting on power-up,streaming MP3 music, and remote management. The PIC24FJ64-based clock is connected to an ENC28J60 Ethernet chip, an MP3 decoder chip, an organic LED graphical display, and a 24LC512 EEPROM for storage.

My wife is a morning person. She gets up at the crack of dawn and goes to bed early. I‘m more likely to wake at the crack of noon and work late into the night. What do we have in common? Like most people, we both use an alarm clock to make sure we get up when we need to. My old alarm clock was, well, old, and needed to be replaced. So, I recently designed an alarm clock with features to suit my high-tech lifestyle (see Photo 1)。


Most alarm clocks use a radio, beeper,or CD player to wake you up. My clock accesses my MP3 collection on the server in my home office via an Ethernet port. The network connection enables me to remotely manage the clock as well. I can easily set alarms and choose music from my office without waking up my wife. The clock also has a built-in GUI so I can manage it locally. Its OLED display and photocell enable it to adapt to different lighting conditions (from bright sun to pitch black)。


Now you too can build a customized alarm clock. In this article,I‘ll describe the design process from start to finish.

SYSTEM OVERVIEW
I built my clock around a Microchip Technology PIC24FJ64 processor (see Figure 1)。 I chose the DIP package for easy prototyping (see Photos 2a and 2b)。 The Microchip 24LC512 EEPROM chip has sufficient hardware resources to connect to the Microchip ENC28J60 Ethernet chip and an STMicroelectronics STA013 MP3 decoder. It has 64 KB of EEPROM, a 128 × 64 pixel OLED display, seven buttons, volume control,power control, and a photocell. That‘s a lot of peripherals for such a small chip, and I use every resource available to talk to them.



The PIC24FJ64GA002 is a 28-pin chip with 64 KB of instruction memory and 8 KB of RAM. The 28-pin DIP package is compatible with breadboards and the evaluation board,which enables you to move chips between the various stages of development without having to reprogram them. Every pin is needed, and some serve dual purposes. The reconfigurable pin feature ensures that no pins are wasted and that signals can be routed to the closest pin for a clean layout. For example, the 32-kHz clock circuit is sensitive to switching noise, so the pin next to it is assigned to a signal that never changes after the clock starts. Normally, that pin would have been part of the high-speed oscillator,but I use the internal RC oscillator to free up two more pins.

I chose the PIC24FJ64 for its large amount of RAM. The MP3 decoder chip has a small buffer, and you can‘t rely on the TCP stream to provide data fast enough. Thus, half of the PIC24FJ64's RAM is dedicated to a buffer for the MP3 stream, leaving 4 KB for the remaining tasks. The CPU pins are configured to provide two SPI busses, one I2C bus, three ADC inputs,one serial port, and seven GPIO pins. The serial port shares pins with the in-circuit programming jack (with series resistors to protect against shorts), and one of the ADCs doubles as a mute control.

Most projects are all about doing one thing well. This project is about doing many things well enough, with the PIC24FJ64 controlling everything(see Figure 2)。


Now let‘s examine each module connected to the PIC24FJ64 and what the processor does with it.

NETWORK
The ENC28J60 Ethernet chip handles networking (again in a 28-pin DIP package)。 The magnetics are contained in the RJ-45 jack, leaving only a 25-MHz crystal oscillator and some discretes to complete the circuit. Because the two LEDs are inside the cabinet to avoid light pollution,they're reprogrammed to indicate transmit and receive traffic instead of link and activity.

The PIC24FJ64 talks to the network chip via a SPI bus running at 4 MHz,which is shared with the MP3 chip. While the Microchip TCP/IP stack is used, the default parameters (buffer size and timeouts) weren‘t aggressive enough to smoothly stream MP3 data. The receive buffer was made much larger (600 bytes) than the transmit buffer (100 bytes)。 The retry timeout was decreased well below the "standard" value to 5 ms. If a packet is missed, there may not even be a gap in the music.

In addition to the MP3 stream,there‘s also a DHCP module to configure the network stack and an SNTP module to retrieve the current time. SNTP is the "simple" form of NTP; it requires only one request packet and one response packet, and can use broadcast UDP.[1]

DISPLAY
The display for an alarm clock has to work in conditions that most displays never encounter. It has to be visible in bright daylight,but shouldn't shine too brightly in a dark room. Most alarm clocks have seven-segment LED displays, which can be dimmed as needed. LCDs are either not visible at night or require a backlight that appears as a grey rectangle at night. I wanted the advantages of LEDs with the flexibility of LCDs, so I turned to OLED technology. The OLED display I chose uses a SPI bus,so any display that uses SPI (OLED,LCD, and VFD) can be used without major changes in the schematics. If you want to use a display with a parallel bus,you can use a PIC with more pins.

The OLED display is a matrix of tiny LEDs. Each can be set to one of 16 brightness levels. In addition, the drive current can be set to one of three levels. During the day, the drive current is maximized and the pixel values are used to control the brightness of the display, according to the photocell readings. At night, in addition to using the lowest (non-off) pixel value, the drive current is reduced to its lowest level, resulting in a dim display, which is suitable for night viewing.

One catch with the OLED display is that you can‘t apply drive power until the controller chip is running. So, the PIC24FJ64 has one GPIO that controls a pair of transistors that switch on the 12-V power for the OLED, after it‘s had time to come out of reset. The power rail also has extreme current swings, so it is bypassed with both a large electrolytic capacitor and a low-ESR tantalum.


Note that ceramics can't be used here!Ceramic capacitors are piezoelectric, so those types of current swings cause the capacitor to move like a tiny piezo speaker. I wanted to make the clock as noiseless as possible. It took me a while to find the source of the noise because I expected the coils in the switching power supply to be the problem source. If you choose to use an LCD, this power switch could be used to control the backlight, either as a simple on-off switch or by reprogramming the PIC pin to be a pulse-width-modulated output.

The OLED routines write to the display exclusively with bit-blit (BITBLT:BITwise block transfer) routines, copying font elements or stored images to the display as needed. (Refer to the oled.c file on the Circuit Cellar FTP site.) Because the display uses 1 byte for every two pixels,all images are an even number of pixels wide. To save space in the EEPROM,all images are compressed, with one of three run-length compression algorithms. The "main font" used for the primary time display is stored as a 2-bit- per-pixel image, with pixel values representing background, foreground, and shadows. They are dynamically replaced with pixel values based on the photocell. Thus, the main display‘s brightness depends on the room brightness.

The other two formats are a 4-bitper- pixel image and a 1-bit-per-pixel image. The format used depends on the image. The internal functions allow any format for any image.

For debugging, there‘s also a console emulator. It uses the smallest font to provide an 8 × 21 character screen and a printf-like function.

MP3
The MP3 chip is an STA013 MP3 decoder, which is actually a custom DSP chip. It talks over both an I2C bus and a SPI bus. The I2C bus is used to configure the DSP and control it, such as changing the volume.

The SPI bus provides only MP3 data. Because it is smart enough to skip over non-music data, the PIC24FJ64 does not need to interpret the MP3 stream-it just feeds it to the decoder, so you can use unmodified MP3 files. There are two such files stored in the EEPROM. One is a moment of silence to help reset the DSP's sequencer. The other is the default"beep" sound the alarm uses if it can‘t contact a music server. The MP3 decoder has the third crystal oscillator in the project: a 14.318-MHz clock circuit.

The output of the MP3 decoder is a serial digital audio stream, which is fed into a serial DAC chip. The chip's two outputs are level-adjusted and fed into a pair of differential-drive amplifiers,which can provide 5 W into an 8-Ω speaker and will run off up to 18 V,so no regulator is required. The amplifiers have a separate volume control pin, so a single voltage reference can control both channels.

The voltage reference is created by the volume control potentiometer R307; it is offset to a range of 0.4 to 1.0 V by R306 and R308. This matches the useful range of the amplifier‘s control pin. The voltage at this point is fed into one of the ADC inputs of the PIC24FJ64, so it can monitor the volume setting (see Figure 3)。 In addition,the PIC24FJ64 can turn that pin into an output, set it low, and force the volume control low enough that the amplifier goes into a low-power standby mode. This gets rid of the tiny residual noise that the amplifier produces when it's active. The resulting voltage is buffered by U304, so the load from the amplifiers doesn‘t distort it.


The audio module also uses the greatest range of power sources. The STA013 runs off 3.3 V, but it needs an isolated supply for its PLL, which is provided by two 4.7-Ω resistors R303 and R304 and bypass capacitor C306. These form a high-current low-pass filter. The DAC chip runs off 5 V so it can produce an output of sufficient amplitude. The amplifiers run off the raw power from the wall wart, which ranges from 16 V at idle to 12 V under full load.

ADC
Three ADC inputs are used to monitor the ambient light, volume setting,and push buttons. The photocell is used with R110 to produce a light-sensitive voltage divider. More light increases the reference voltage, which is read as a higher value by the ADC. Each ADC input includes a small capacitor to keep the ADC's sample and hold circuitry from distorting the input signal.

In addition to the photocell and volume control, the ADC is also used to monitor the seven push buttons. To save on pins, each switch connects a different valued resistor into a resistor divider. The resistor values were carefully selected so the ADC values produced are evenly spaced and halfway between multiples of 64. Thus, I can simply use the high 8 bits as the "switch number." For debouncing,there are two mechanisms. First, capacitor C101 acts as a low-pass filter. Its value is small enough that the signal can pass through each switch‘s "zone" within one cycle of the ADC. Second, the software requires the same switch reading multiple times in a row. Only a stable value is used to trigger a button event. The mounting of the switches was somewhat of a challenge. I use tactile switches, which have a small range of motion but a good "feel." To adjust their spacing relative to the wooden buttons activating them, I mounted them on a circuit board, and held that board with two nuts on a screw (see Photo 3)。 The screw head is epoxied to the case. The nuts can be adjusted to control the spacing between the board and the case accurately.


MEMORY
The alarm clock has five different types of memory. In addition to the 64 KB of flash memory and 8 KB of RAM in the PIC24FJ64, there is a small buffer in the MP3 decoder (it holds only one MP3 frame at a time) and 8 KB of RAM in the Ethernet chip. However, I needed somewhere to store the alarm settings, fonts, images, and other data. I chose a 24LC512 EEPROM, which holds 64 KB of data. The design allows for two EEPROMs, in case I need more room for MP3s, but so far I've needed only one. These EEPROMs live on the I2C bus.

There‘s a table of contents at the beginning of the memory, which holds the size and location of each block of data in the chip. There's a block for each font, a block for alarm settings, a block for each music source, a block for URLs, and more.

Because the EEPROM is 64 KB,addresses are 2 bytes, which is convenient. In addition to providing data to the various routines in the clock,the EEPROM module listens on a TCP port for remote management. The protocol is simple. The remote program can simply read or write blocks of data to the EEPROM. This allows an arbitrary range of remote management software, from downloading fonts to alarm settings (see Table 1)。


POWER
Most people plug in a wall wart and forget about power. However, this project requires a range of power sources, each with varying requirements for efficiency and quality.

There are three separate regulators. The input is an unregulated 12 V DC from a wall wart. What most people don‘t realize is that "unregulated" means"could be anything." In reality, the voltage ranges from 17 V at no load to 12 V at its rated current. Mine can provide up to 1 A, so it is normally providing about 15 V when the clock is running. A Schottky diode prevents damage from incorrect wiring, and a 220-μF capacitor guards against problems due to contact glitches in the power jack. This raw voltage is used for the amplifiers and feeding the other regulators.

The main power bus is the 3.3 V. Because this is a large voltage drop and it is heavily used, a high-efficiency switching regulator is used to produce it. L400/C402 and L402/C405 form lowpass filters that help keep the high-frequency switching noise away from
the other circuits, and D401 guards against switching transients leaking to the other regulators. D401 probably isn't needed,but inductors can generate wild spikes in unusual circumstances, so I kept it to satisfy my paranoia.

The 5-V supply for the DACs must be as ripple-free as possible, so it is produced using a standard linear regulator with a large output filter capacitor. The OLED needs a 12- to 15-V supply, so there‘s an optional 12-V low-dropout regulator for when the input voltage exceeds 15 V. It can be bypassed if the input voltage is regulated to 12 V regardless of load.

Because the unregulated input can drop below 12 V when the amplifiers are running, the carefully selected 12-V regulator has a low drop-out voltage. In addition, it acts like a shunt if the input voltage drops below 12 V. As a result, the display continues to operate,although dimmer, rather than blinking off when the music is loud.

SOFTWARE
The PIC24FJ64 handles many tasks,and it uses a main polling loop to manage them. Each task has a poll function,which gets called repeatedly from main()。 The main loop also calls the GUI each time a button is pressed.

A modified Microchip TCP/IP stack checks for incoming packets and timeouts, looking for requests to connect to the remote management ports and manage the MP3 streams. The real-time clock module manages the NTP requests and updates the time display and snooze and sleep timers.

The ADC is configured to run in Auto-Poll mode. This means all three channels are continuously sampled and one of two buffers is filled with the results. The ADC task checks to see if a new buffer is ready. If so, it reads the data and converts it into useful ranges, including debouncing the button channel and smoothing the photocell channel.

The MP3 task is a bit complicated,because it needs to keep track not only of what it‘s doing, but also of what it's supposed to be doing. First and foremost,if data can be moved from the PIC24FJ64‘s RAM to the MP3 chip's buffer, it is. The task also checks for new incoming connections on the MP3 port,processes incoming data for currently open ports (which is stored in the PIC24FJ64‘s RAM buffer), and checks for time outs. If MP3 data stops showing up but the alarm is supposed to be on, the internal "beep" sound is used instead.

The EEPROM task manages the remote EEPROM socket. When a remote computer connects to the clock to update its settings, the EEPROM task checks for data on that socket and acts on it, reading and writing the EEPROM and sending the results back.

The alarm task is responsible for setting up connections to the remote web servers to obtain MP3 data. This includes looking up IP addresses and handling the HTTP protocol. The triggering of alarms happens as part of the RTC task. At the start of each minute, the alarm module is called to check for new alarms and update the snooze timer. If a new alarm is triggered,the alarm task starts setting up the TCP connection for it.

The volume task watches for significant changes in the volume control setting (from the ADC task)。 If it changes, the main display is changed to show a bar graph of the volume setting. If it stops changing, the main display reverts. Because the muting can be controlled via the GUI, this enables you to set the volume without needing to have music playing.

As you can see, it's not about doing one complex task, but many simple ones.

One of the unique features of the PIC24FJ64 is its ability to map most of the pins to many of the internal peripherals. However, this also means that you have to configure all of those mappings,as well as all of the peripherals you‘re using. This is done in config.c. To keep things straight, I configured the pins in numerical order. The first time a peripheral was connected to a pin, I configured it as well. This file also has the global configuration bits and sets the internal clock. While there are three crystals in this project, none of them run the PIC24FJ64 itself-it runs off its internal RC oscillator and has a 32-kHz crystal for keeping track of the time of day.

To help keep track of the pin mappings,the pins.h file has macros for each function that map to the pins it's assigned to. When I built the prototype,I assigned pins as I needed them. Later, when I laid out the circuit board, I remapped all of the pins to keep the layout clean. I just had to update config.c and pins.h.

Once the PIC24FJ64 is configured,the next step is to reset and power up the remainder of the board. The GPIO assigned to reset is pulsed. After a delay, the OLED‘s power is enabled. Next, each module is initialized: the OLED, timer, TCP/IP stack, Ethernet chip, MP3 decoder, and real-time clock.

TIME
Of course, the most important feature of an alarm clock is the clock. I use the built-in real-time clock to keep the 32.768-kHz oscillator)。 One of the configuration bytes in the EEPROM is the calibration setting for the RTC, so you can adjust the "speed" of the clock, if needed.

Rather than expect the user to set the clock each time power is applied(or reapplied after a blackout), the clock uses SNTP to get the current time. SNTP enables you to request the time with a single UDP packet sent to your network‘s broadcast address. A single reply packet gives you the time without having to configure an NTP client or keep track of the state of the protocol. The clock checks the time at 30 s past each minute, keeping it within 1 s of the correct time.

The clock does not know about time zones. Another configuration byte keeps track of the offset from SNTP's UTC zone, but you could have your SNTP server update that byte as needed, without any user interaction. Based on the SNTP time and time zone, the RTC module is updated.

The RTC module interrupts the PIC24FJ64 once per second, sets a flag,and decrements the sleep timer. The next time the RTC‘s task runs, it checks the flag to see if the time needs updating. The SNTP socket is always checked. The sleep timer and its display are updated every second. If the minute also changes, the main display is updated and the alarm module is called. In addition, if the photocell value has changed, that forces a main display update. This way, the clock can respond to ambient light changes quickly,without wasting time to redraw the display when it's not needed. Even though the PIC24FJ64 always runs at full speed, it‘s important to leave as much processing power available as possible for streaming the MP3 data.

ALARMS
Once a minute, the list of alarms is scanned to see if any of them match the current time. Each alarm setting uses 7 bytes of the EEPROM, for a maximum of about 7,000 alarms with my current EEPROM load. The bytes are: hour (0-23, BCD encoded),minute, a weekday mask, month(1-12), day (1-31), and the address of a web site descriptor. The weekday mask has 1 bit set for each day of the week for which the alarm is enabled. One extra bit as a global "enable" bit,so you can disable the alarm without erasing it. If the month byte is zero,the day-of-week mask is used to enable the alarm; otherwise, the month and day are used and the weekday mask is ignored. This way,you can have an alarm that goes off only on weekdays, plus alarms that go off on specific days.

Each alarm indexes into a table of web sites, or "destinations." Each entry includes a pointer into a string table for the MP3 stream's URL, and a second pointer for a descriptive string. The GUI lets you choose from the list of destinations for each alarm, but to change the list of URLs itself, you need to use the remote management protocol.

GUI
The clock uses a simple GUI to manage the clock locally. This includes setting the alarms (and silencing them!),using the snooze and sleep features,and listening to music. Each time the ADC module determines that a button has been pressed, the GUI is called to handle that button.

The GUI uses a simple state machine to keep track of where it is,without having to stop the main loop. I use a feature of GCC where you can assign the address of a local label to a variable. There‘s a GOTO(x) macro that stores the address of the given label into a static variable and then returns. The next time the GUI is called, it jumps to the given label to perform the next step. You can also use a standard goto if you need to jump to a common setup routine for a screen, which would use GOTO(x) to set up the next state.

As each screen is set up, icons are drawn next to each button so you know what they're used for. Some buttons have common meanings, such as the upper-right button is always"off" or "cancel." Others, such as the lower buttons, have different meanings for each screen, so the icons are needed. Depending on the screen, the GUI can tell the RTC module how (or if) the time (wall time or sleep time) is to be displayed on the screen. This way, the GUI can decide where to put it but let the RTC module maintain it.

When the ADC determines that no button has been pressed in a while, it pretends you pressed "timeout." This gives the GUI an opportunity to time out and reset back to the main display.

REMOTE PROTOCOLS
The alarm clock includes useful remote management features. There are two TCP sockets that the clock listens on. The first is an MP3 socket. A remote computer can connect to this socket and send MP3 data that the clock will play. This lets you have"alarms," which are determined by the remote computer, rather than triggered by the clock itself. The remote stream can be terminated by the same button that ends a local alarm.

The second socket allows for EEPROM access by the remote machine(see Table 1)。 This lets you do everything from remote reprogramming to checking the time zone and setting alarms. The protocol is a simple read/write protocol. To read a range of EEPROM addresses, send an "R" character followed by 2 bytes of address(LSB first) and a 1-byte count (0 255)。

The clock responds by sending bytes back:
R addrL addrH count
....
To write to the EEPROM, send a W followed by the address and count,followed by bytes. The clock sends back a NUL byte when it‘s done:
W addrL addrH count
....
NUL

As long as the remote program knows the format of the EEPROM, this lets it read or modify pretty much anything in the EEPROM.

CONSTRUCTION & PACKAGING
The schematics for this project were created using the gschem program from the gEDA suite (S. Brorson, "Optical Proximity Sensor for Robots Part 1: Simple PCB Design with the gEDA Suite," Circuit Cellar 188, 2006)。 The board was designed using the pcb program(S. Brorson, "Optical Proximity Sensor for Robots Part 2: Open-Source PCB Layout Editor," Circuit Cellar 189, 2006)。


While the board is a four-layer board,there are a number of PCB fabrication companies that offer affordable four-layer boards, such as PCB-Pool, Advanced Circuits,and Sierra Proto Express, some of which advertise in Circuit Cellar.

I chose to use a four-layer board for this project because I wanted solid ground and power planes for reliability and simplicity. With prototype fab prices dropping regularly, there‘s little excuse for avoiding four-layer boards when the project calls for them. Having a solid ground plane under the majority of the signals helps reduce crosstalk and provide cleaner power to the chips. However, there are some exceptions to this. There is no ground plane under the switching power supply because you don't want the ground plane to pick up the spikes from it. The three crystal circuits have no ground plane either, both to avoid stray capacitance and to keep noise on the ground plane from getting into the clock circuits.

The power plane is divided into the 3.3-V region and the raw "15-V"region. The raw power region passes under each of the regulators to provide full power to those, as well as to each amplifier. The 3.3-V region passes under everything else, except of course the crystals and switcher.

The traces used for the switcher are large and close together. This reduces their inductance and the "loop area."The circuitry forms a crude antenna,so reducing its area reduces the amount of noise it transmits.

To prepare for debugging and potentially modifying the circuit, I made sure that all of the vias were untented. This means that they‘re not covered with solder resist, so they can be soldered to later, and the hole size is just right for wire wrap wire. I also laid out a number of bare grids on the back where SOIC and 0603-sized components can be soldered in case more parts needed to be added later.

Contrary to popular belief, soldering SMT parts is not hard. Once you get used to it, it's easier than through-hole because you don‘t have to keep flipping the board over. My technique is to use a stencil to apply solder paste to the right parts of the circuit board,manually place all of the SMT parts,and use an electric hotplate to reflow the solder. I got this idea off of the Internet, but it's proven to be easy and reliable. If there are any solder bridges,it‘s easy to use copper desoldering braid to remove them. After all of the SMT parts on the top are soldered this way,the SMT parts on the bottom can be added using solder paste as before, but using your iron to reflow the paste. To do this, apply the iron to the board and/or part and let the heat melt the paste under the part. Lastly, the through-hole parts are added.

SMART COMBINATIONS
Complexity is what you get out of a project, not what you put into it. Each hardware module connects to some other module via one of the busses,and each software module performs its task. It's when you put all of these together to perform coordinated tasks that it appears to be doing something complex. This project is an example of this. The MP3 decoder module is fairly simple, but when you coordinate it with the TCP module, alarm module,and GUI, you get an MP3 alarm clock. Each peripheral in the PIC24FJ64 is simple by itself, but by combining them you get a complex set of functionality in a simple package.

Having the ability to choose PIC24FJ64 peripherals and the pins they‘re assigned to-combined with a new era in EDA tools and services and software development tools-will enable you to create interesting projects with little investment other than your own time. I Editor's note: Additional schemtics,diagrams, and photos for this project are available at www.circuitcellar.com/ microchip2007/winners/second.html.


DJ Delorie (dj@delorie.com) holds an E.C.E. degree from Clarkson University. He has experience designing PC motherboards and network management software. DJ now writes embedded development tools for Red Hat. He is also the creator of DJGPP and a contributor to the gEDA project. Visit his blog at www.delorie.com/electronics/ alarmclock.

PROJECT FILES
To download code and additional files,go to ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2008/216.

REFERENCE
[1] D. Mills, "RFC2030: Simple NetworkTime Protocol (SNTP) Version ,"ww.rfc.net/rfc2030.html.

RESOURCES
S. Brorson, "Optical Proximity Sensor for Robots Part 1: Simple PCB Design with the gEDA Suite," Circuit Cellar 188, 2006.
---, "Optical Proximity Sensor for Robots Part 2: Open-Source PCB Layout Editor," Circuit Cellar 189, 2006. gEDA Project, www.geda.seul.org.

Microchip Technology, Inc., "ENC28J60 Data Sheet: Stand-Alone Ethernet Controller
with SPI Interface," DS39662C,2008.
---, "MCP6001/1R/1U/2/4: 1 MHz,Low-Power Op Amp," DS21733G,2007.
---, "PIC24FJ64GA004 Family Data Sheet: 28/44-Pin General Purpose,16-Bit Flash Microcontrollers,"DS39881C, 2008.
---, "24AA512/24LC512/24FC512:512K I2C CMOS Serial EEPROM,"
DS21754H, 2007.PJRC, "How To Use The STA013 MP3 Decoder Chip," www.pjrc.com/mp3/sta013.html.

SOURCES
ENC28J60 Ethernet chip,PIC24FJ64GA002 microcontroller, and 24LC512 EEPROMMicrochip Technology, Inc.
www.microchip.com
STA013 MP3 Decoder STMicroelectronics
www.st.com

类别:网络与连通 |
上一篇:信息采集 (Message Acquisition) | 下一篇:嵌入式Linux开发-I (Embedded Linux Development-I)
以下网友评论只代表其个人观点,不代表本网站的观点或立场