blob: 724377d95ec8354c925e90c2d0d7b72a610d57ad [file] [log] [blame]
/*
** $Id: spi.c 109 2008-10-22 19:45:09Z lajordan@SILABS.COM $
**
** spi.h
** SPI driver implementation file
**
** Author(s):
** laj
**
** Distributed by:
** Silicon Laboratories, Inc
**
** File Description:
** This is the implementation file for the SPI driver used
** in the ProSLIC demonstration code.
**
** Dependancies:
**
**
*/
#include "spi.h"
#include "voiceband/mvSysTdmSpi.h"
#include "spi/mvSpi.h"
#include "timer.h"
/*
** Function: SPI_Init
**
** Description:
** Initializes the SPI interface
**
** Input Parameters:
** none
**
** Return:
** none
*/
int SPI_Init (ctrl_S * hSpiGci)
{
uInt8 portId = hSpiGci->portID;
MV_SPI_IF_PARAMS ifParams;
MV_SPI_TIMING_PARAMS tmngParams;
ifParams.clockPolLow = TRUE;
ifParams.clockPhase = SPI_CLK_BEGIN_CYC;
ifParams.txMsbFirst = FALSE;
ifParams.rxMsbFirst = FALSE;
tmngParams.tcsh = 0x3F;
tmngParams.tmisoSample = 0;
tmngParams.tcsSetup = 0x4;
tmngParams.tcsHold = 0x4;
mvSpiIfConfigSet(portId, &ifParams);
mvSpiTimingParamsSet(portId, &tmngParams);
return 0;
}
#define CNUM_TO_CID_QUAD(channelNumber) (((channelNumber<<4)&0x10)|((channelNumber<<2)&0x8)|((channelNumber>>2)&0x2)|((channelNumber>>4)&0x1)|(channelNumber&0x4))
static uInt8 ReadRegister (ctrl_S * hSpiGci, uInt8 channel, uInt8 regAddr)
{
uInt8 cmdBuff[2];
uInt8 dataBuff[5];
uInt8 portId = hSpiGci->portID;
#ifdef PROFILE
profile.regAccess++;
#endif
if (channel == 0xFF)
cmdBuff[0] = 0x80 | 0x60;
else
cmdBuff[0] = CNUM_TO_CID_QUAD(channel) | 0x60;
cmdBuff[1] = regAddr;
mvSysTdmSpiRead(portId, cmdBuff, 2, dataBuff, 1);
return dataBuff[0];
}
static void WriteRegister (ctrl_S * hSpiGci, uInt8 channel, uInt8 regAddr, uInt8 data)
{
uInt8 cmdBuff[2];
uInt8 portId = hSpiGci->portID;
#ifdef PROFILE
profile.regAccess++;
#endif
if (channel == 0xFF)
cmdBuff[0] = 0x80 | 0x20;
else
cmdBuff[0] = CNUM_TO_CID_QUAD(channel) | 0x20;
cmdBuff[0] &= 0xBF;
cmdBuff[1] = regAddr;
mvSysTdmSpiWrite(portId, cmdBuff,2 , &data, 1);
return;
}
#define DELAY_TEST 0
/*
** ReadRAM()
**
** Read from ProSLIC RAM space
**
*/
static uInt32 ReadRAM(ctrl_S * hSpiGci, uInt8 channel, uInt16 address)
{
uInt8 dataByte;
uInt8 addrByte;
uInt32 dataWord = 0L;
uInt32 userTimeout = 100000; //USER_TIMEOUT_VAL; /* user defined timeout counter */
/* Wait for RAM to finish */
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01) && (userTimeout > 0)) {
userTimeout--;
}
/*
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01)) {
userTimeout--;
}*/
/* RAM_ADR_HI[7:5] = ramAddr[10:8] */
addrByte = (uInt8)((address >> 3) & 0x00E0);
WriteRegister(hSpiGci, channel, RAM_ADDR_HI, addrByte);
time_DelayWrapper (NULL, DELAY_TEST);
/* RAM_ADR_LO[7:0] = ramAddr[7:0] */
addrByte = (uInt8)((address & 0x00FF));
WriteRegister(hSpiGci, channel, RAM_ADDR_LO, addrByte);
time_DelayWrapper (NULL, DELAY_TEST);
/* Wait for RAM to finish */
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01) && (userTimeout > 0)) {
userTimeout--;
}
/*
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01)) {
userTimeout--;
}*/
time_DelayWrapper (NULL, DELAY_TEST);
/* ramData[4:0] = RAM_DATA_B0[7:3] */
dataByte = ReadRegister(hSpiGci, channel, RAM_DATA_B0);
dataWord |= ((dataByte >> 3) & 0x0000001FL);
/* ramData[12:5] = RAM_DATA_B1[7:0] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = ReadRegister(hSpiGci, channel, RAM_DATA_B1);
dataWord |= ((dataByte << 5) & 0x000001FE0L);
/* ramData[20:13] = RAM_DATA_B2[7:0] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = ReadRegister(hSpiGci, channel, RAM_DATA_B2);
dataWord |= ((dataByte << 13) & 0x0001FE000L);
/* ramData[28:21] = RAM_DATA_B3[7:0] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = ReadRegister(hSpiGci, channel, RAM_DATA_B3);
dataWord |= ((dataByte << 21) & 0x1FE00000L);
return dataWord;
}
/*
** WriteRAM()
**
** Write to ProSLIC RAM space
**
*/
void WriteRAM(ctrl_S * hSpiGci, uInt8 channel, uInt16 address, uInt32 data)
{
uInt8 dataByte;
uInt8 addrByte;
uInt32 userTimeout = 100000; //USER_TIMEOUT_VAL;
/* User defined timeout counter */
/* Wait for RAM to finish */
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01) && (userTimeout > 0)) {
userTimeout--;
}
/*
while ((ReadRegister(hSpiGci, channel, RAMSTAT) & 0x01)) {
userTimeout--;
}*/
time_DelayWrapper (NULL, DELAY_TEST);
/* RAM_ADR_HI[7:5] = ramAddr[10:8] */
addrByte = (uInt8)((address >> 3) & 0x00E0);
WriteRegister(hSpiGci, channel, RAM_ADDR_HI, addrByte);
/* RAM_DATA_B0[7:3] = ramData[4:0] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = (uInt8)((data << 3) & 0x000000F1L);
WriteRegister(hSpiGci, channel, RAM_DATA_B0, dataByte);
/* RAM_DATA_B1[7:0] = ramData[12:5] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = (uInt8)((data >> 5) & 0x000000FFL);
WriteRegister(hSpiGci, channel, RAM_DATA_B1, dataByte);
/* RAM_DATA_B2[7:0] = ramData[20:13] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = (uInt8)((data >> 13) & 0x000000FFL);
WriteRegister(hSpiGci, channel, RAM_DATA_B2, dataByte);
/* RAM_DATA_B3[7:0] = ramData[28:21] */
time_DelayWrapper (NULL, DELAY_TEST);
dataByte = (uInt8)((data >> 21) & 0x000000FFL);
WriteRegister(hSpiGci, channel, RAM_DATA_B3, dataByte);
/* RAM_ADR_LO[7:0] = ramAddr[7:0] */
time_DelayWrapper (NULL, DELAY_TEST);
addrByte = (uInt8)((address & 0x00FF));
WriteRegister(hSpiGci, channel, RAM_ADDR_LO, addrByte);
}
/*
** Function: spiGci_ResetWrapper
**
** Description:
** Sets the reset pin of the ProSLIC
*/
int ctrl_ResetWrapper (void * hSpiGci, int status)
{
/*if (status)
RSTNLow();
else
RSTNHigh();*/
return 0;
}
/*
** SPI/GCI register read
**
** Description:
** Reads a single ProSLIC register
**
** Input Parameters:
** channel: ProSLIC channel to read from
** num: number of reads to perform
** regAddr: Address of register to read
** addr_inc: whether to increment address after each read
** data: data to read from register
**
** Return:
** none
*/
uInt8 ctrl_ReadRegisterWrapper (void * hSpiGci, uInt8 channel,uInt8 regAddr)
{
return ReadRegister(hSpiGci, channel, regAddr);
}
/*
** Function: spiGci_WriteRegisterWrapper
**
** Description:
** Writes a single ProSLIC register
**
** Input Parameters:
** channel: ProSLIC channel to write to
** address: Address of register to write
** data: data to write to register
**
** Return:
** none
*/
int ctrl_WriteRegisterWrapper (void * hSpiGci, uInt8 channel, uInt8 regAddr, uInt8 data)
{
WriteRegister(hSpiGci, channel, regAddr, data);
return 0;
}
/*
** Function: SPI_ReadRAMWrapper
**
** Description:
** Reads a single ProSLIC RAM location
**
** Input Parameters:
** channel: ProSLIC channel to read from
** address: Address of RAM location to read
** pData: data to read from RAM location
**
** Return:
** none
*/
ramData ctrl_ReadRAMWrapper (void * hSpiGci, uInt8 channel, uInt16 ramAddr)
{
return ReadRAM(hSpiGci, channel, ramAddr);;
}
/*
** Function: SPI_WriteRAMWrapper
**
** Description:
** Writes a single ProSLIC RAM location
**
** Input Parameters:
** channel: ProSLIC channel to write to
** address: Address of RAM location to write
** data: data to write to RAM location
**
** Return:
** none
*/
int ctrl_WriteRAMWrapper (void * hSpiGci, uInt8 channel, uInt16 ramAddr, ramData data)
{
WriteRAM(hSpiGci, channel, ramAddr, data);
return 0;
}
/*
** $Log: dummy_spi.c,v $
** Revision 1.3 2008/07/24 21:06:16 lajordan
** no message
**
** Revision 1.2 2007/10/22 21:38:10 lajordan
** fixed some warnings
**
** Revision 1.1 2007/10/22 20:52:08 lajordan
** no message
**
*/