repo2/firmware_legacy/sd_direct/spi.c @ 1476
46 | markw | /*! \file spi.c \brief SPI interface driver. */
|
|
//*****************************************************************************
|
|||
//
|
|||
// File Name : 'spi.c'
|
|||
// Title : SPI interface driver
|
|||
// Author : Pascal Stang - Copyright (C) 2000-2002
|
|||
// Created : 11/22/2000
|
|||
// Revised : 06/06/2002
|
|||
// Version : 0.6
|
|||
// Target MCU : Atmel AVR series
|
|||
// Editor Tabs : 4
|
|||
//
|
|||
// NOTE: This code is currently below version 1.0, and therefore is considered
|
|||
// to be lacking in some functionality or documentation, or may not be fully
|
|||
// tested. Nonetheless, you can expect most functions to work.
|
|||
//
|
|||
// ----------------------------------------------------------------------------
|
|||
// 17.8.2008
|
|||
// Bob!k & Raster, C.P.U.
|
|||
// Original code was modified especially for the SDrive device.
|
|||
// Some parts of code have been added, removed, rewrited or optimized due to
|
|||
// lack of MCU AVR Atmega8 memory.
|
|||
// ----------------------------------------------------------------------------
|
|||
//
|
|||
// This code is distributed under the GNU Public License
|
|||
// which can be found at http://www.gnu.org/licenses/gpl.txt
|
|||
//
|
|||
//*****************************************************************************
|
|||
#include "spi.h"
|
|||
#include "regs.h"
|
|||
#include "spi.h"
|
|||
#include "printf.h"
|
|||
int spi_slow; // 1 is slow
|
|||
864 | markw | enum {spi_slave_sd = 0, spi_slave_flash = 1};
|
|
enum {spi_select_none = 6, spi_select_sd = 4, spi_select_flash = 2};
|
|||
int spi_select;
|
|||
46 | markw | int display;
|
|
void updateSpiState()
|
|||
{
|
|||
864 | markw | *zpu_spi_state = (spi_slow<<3)|(spi_select);
|
|
46 | markw | }
|
|
// access routines
|
|||
void setSpiFast()
|
|||
{
|
|||
spi_slow = 0;
|
|||
updateSpiState();
|
|||
}
|
|||
void setSpiSlow()
|
|||
{
|
|||
spi_slow = 1;
|
|||
updateSpiState();
|
|||
}
|
|||
void set_spi_clock_freq() // avr handles spi clock?
|
|||
{
|
|||
setSpiFast();
|
|||
}
|
|||
void spiInit()
|
|||
{
|
|||
spiDisplay(0);
|
|||
spi_slow = 1;
|
|||
864 | markw | spi_select = spi_select_none|spi_slave_sd;
|
|
46 | markw | updateSpiState();
|
|
}
|
|||
864 | markw | void mmcChipSelect()
|
|
46 | markw | {
|
|
864 | markw | spi_select = spi_select_sd|spi_slave_sd;
|
|
46 | markw | updateSpiState();
|
|
}
|
|||
864 | markw | void mmcChipDeselect()
|
|
{
|
|||
spi_select = spi_select_none|spi_slave_sd;
|
|||
updateSpiState();
|
|||
}
|
|||
void flashChipSelect()
|
|||
{
|
|||
spi_select = spi_select_flash|spi_slave_flash;
|
|||
updateSpiState();
|
|||
}
|
|||
void flashChipDeselect()
|
|||
{
|
|||
spi_select = spi_select_none|spi_slave_flash;
|
|||
updateSpiState();
|
|||
}
|
|||
46 | markw | u08 spiTransferByte(u08 data)
|
|
{
|
|||
u08 res = 0;
|
|||
//debug("spiTransferByte");
|
|||
/*if (display!=0)
|
|||
{
|
|||
plotnext(hextoatarichar((data&0xf0) >> 4));
|
|||
plotnext(hextoatarichar((data&0xf)));
|
|||
}*/
|
|||
// send the given data
|
|||
*zpu_spi_data = data;
|
|||
// wait for transfer to complete
|
|||
while ((1&*zpu_spi_state) == 1);
|
|||
// return the received data
|
|||
res = *zpu_spi_data;
|
|||
if (display!=0)
|
|||
{
|
|||
//XXX plotnext(hextoatarichar((res&0xf0) >> 4));
|
|||
//XXX plotnext(hextoatarichar((res&0xf)));
|
|||
//plotnext(toatarichar(' '));
|
|||
}
|
|||
return res;
|
|||
}
|
|||
u08 spiTransferFF()
|
|||
{
|
|||
return spiTransferByte(0xFF);
|
|||
}
|
|||
void spiDisplay(int i)
|
|||
{
|
|||
display = i;
|
|||
}
|
|||
63 | markw | void spiReceiveData(u08 * from, u08 * to)
|
|
{
|
|||
u32 from32 = (u32)from;
|
|||
u32 to32 = (u32)to;
|
|||
u32 val = to32<<16 | from32;
|
|||
*zpu_spi_dma = val;
|
|||
}
|