/*************************************************************************** * Copyright (C) 2008, Crawlerz * * * * Description: * * Low-level Software SPI Master (SPIM) "C" code snippets for: * * - Unigen's Juno M & Juno W RF Modules * * - Cypress CYWM6934 & CYWM6935 RF Modules * * - Cypress CYWUSB6932, CYWUSB6934, and CYWUSB6935 * * Version: * * 2008.35.2 * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ // physical interface #define SCK PB0 #define SCK_LO SCK = 0 #define SCK_HI SCK = 1 #define MISO PB1 #define MOSI PB2 #define MOSI_LO MOSI = 0 #define MOSI_HI MOSI = 1 #define nSS PB3 #define nSS_LO nSS = 0 #define nSS_HI nSS = 1 #define IRQ PB6 #define nPD PB7 #define nPD_LO nPD = 0 #define nPD_HI nPD = 1 #define nRST PB4 #define nRST_LO nRST = 0 #define nRST_HI nRST = 1 #define X13OUT PB5 #define SPI_WR 0x80 #define SPI_RD 0x00 #define SPI_INC 0x40 #define SPI_FRZ 0x00 // prototypes for spi routines BYTE SpiRead(BYTE addr); void SpiWrite(BYTE addr, BYTE dat); void SpiFileRead(BYTE addr, BYTE len, BYTE *dest); void SpiFileWrite(BYTE addr, BYTE len, BYTE *src); BYTE SpiRead(BYTE addr) { B = addr; nSS_LO; // write cmd bits + addr MOSI_LO; SCK_HI; SCK_LO; MOSI_LO; SCK_HI; SCK_LO; MOSI = B5; SCK_HI; SCK_LO; MOSI = B4; SCK_HI; SCK_LO; MOSI = B3; SCK_HI; SCK_LO; MOSI = B2; SCK_HI; SCK_LO; MOSI = B1; SCK_HI; SCK_LO; MOSI = B0; SCK_HI; SCK_LO; //read data SCK_HI; B7 = MISO; SCK_LO; SCK_HI; B6 = MISO; SCK_LO; SCK_HI; B5 = MISO; SCK_LO; SCK_HI; B4 = MISO; SCK_LO; SCK_HI; B3 = MISO; SCK_LO; SCK_HI; B2 = MISO; SCK_LO; SCK_HI; B1 = MISO; SCK_LO; SCK_HI; B0 = MISO; SCK_LO; nSS_HI; return(B); } void SpiWrite(BYTE addr, BYTE dat) { B = addr; nSS_LO; // write cmd bits + addr MOSI_HI; SCK_HI; SCK_LO; MOSI_LO; SCK_HI; SCK_LO; MOSI = B5; SCK_HI; SCK_LO; MOSI = B4; SCK_HI; SCK_LO; MOSI = B3; SCK_HI; SCK_LO; MOSI = B2; SCK_HI; SCK_LO; MOSI = B1; SCK_HI; SCK_LO; MOSI = B0; SCK_HI; SCK_LO; // data phase B = dat; MOSI = B7; SCK_HI; SCK_LO; MOSI = B6; SCK_HI; SCK_LO; MOSI = B5; SCK_HI; SCK_LO; MOSI = B4; SCK_HI; SCK_LO; MOSI = B3; SCK_HI; SCK_LO; MOSI = B2; SCK_HI; SCK_LO; MOSI = B1; SCK_HI; SCK_LO; MOSI = B0; SCK_HI; SCK_LO; nSS_HI; } // NOTE // The code generated for a generic pointer executes more slowly than the // equivalent code generated for a memory-specific pointer because the memory // area is not known until run-time. The compiler cannot optimize memory // accesses and must generate generic code that can access any memory area. If // execution speed is a priority, you should use memory-specific pointers instead of // generic pointers wherever possible. void SpiFileRead(BYTE addr, BYTE len, BYTE *dest) { BYTE i; B = addr; nSS_LO; // write cmd bits + addr MOSI_LO; SCK_HI; SCK_LO; // dir=0 (bus read operation) MOSI = B6; SCK_HI; SCK_LO; // 1=inc or 0=frz MOSI = B5; SCK_HI; SCK_LO; MOSI = B4; SCK_HI; SCK_LO; MOSI = B3; SCK_HI; SCK_LO; MOSI = B2; SCK_HI; SCK_LO; MOSI = B1; SCK_HI; SCK_LO; MOSI = B0; SCK_HI; SCK_LO; // data phase for(i=0;i