For a work-related project, I needed to use the Cypress CYRF6936 2.4 GHz Transceiver IC. This IC is branded as a “Wireless USB” device, and is supposed to be used in low-power devices such as mice or keyboards (although my projects have much more interesting applications). It uses Direct-Sequence Spread Spectrum modulation, which is pretty interesting and is used by a few other wireless standards (most notably, ZigBee and early WiFi). Unlike other common modulation schemes (FSK, ASK), you can't receive or demodulate the signal without knowing the proper pseudo-random number (PN) code. In fact, without the PN code, you would hardly be able to tell that a signal was present at all!
Hunting down compatible modules proved to be difficult and expensive, so I decided to make a quick, cheap board produced in China so that I could easily use the CYRF6936 with an Arduino Uno.
I designed the board in Eagle using a standard Arduino shield template. For the CYRF6936 and related RF circuitry, I followed the Cypress application notes and basically implemented their reference design. They use a balun and pi matching network to produce a 50-ohm output, which is usually connected to a PCB trace antenna. My application required a little more power (the IC will output up to +4dBm), so I stuck an SMA connector on the output instead so that I could add an RF amplifer and a better antenna. Other then that, the IC only requires a few decoupling caps and a 12 MHz crystal.
The CYRF6936 only operates up to 3.6V, but fortunately the Arduino Uno has a 3.3V regulator. However, all of the Arduino's I/O pins use 5V. So I added a TXB0106 bi-directional level shifter. This is a very simple IC that translates the 3.3V signals from the Cypress chip to 5V for the Arduino, and vice-versa. I added headers for the I/O signals so that it was easy to connect my logic analyzer. Finally, I placed some buttons and LED's just for some more user interactivity.
I can't go into details about my work project, but I did end up writing some sample Arduino code. This code allows two Arduinos with the CYRF6936 shield to pass a “token” back and forth to each other. The TX and RX lights should blink back and forth. I made this to test basic functionality of the CRYF6936, get a better understanding of the registers, and see what kind of range the devices had. This was basically early research for my mesh network sensors.
This firmware is not the best. I was pretty discouraged with Cypress's lack of documentation. They have basic register descriptions and some example firmware, but it's written in assembly and isn't very detailed about why it does certain things. My mesh network sensors have much better firmware, so you should really look at that as a better example design.