VS10XX.c
130 lines
| 3.4 KiB
| text/x-c
|
CLexer
r71 | /*------------------------------------------------------------------------------ | |||
#-- This file is a part of the libuc, microcontroler library | ||||
#-- Copyright (C) 2011, Alexis Jeandet | ||||
#-- | ||||
#-- 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 3 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 | ||||
#------------------------------------------------------------------------------- | ||||
#-- Author : Alexis Jeandet | ||||
#-- Mail : alexis.jeandet@member.fsf.org | ||||
#-------------------------------------------------------------------------------*/ | ||||
#include <VS10XX.h> | ||||
#include <core.h> | ||||
#include <stdio.h> | ||||
void vs10XXopen(vs10XXDev *codec, spi_t dev, void (*setxCS)(char), void (*setxRST)(char), void (*setxDCS)(char), int (*getDREQ)()) | ||||
{ | ||||
codec->SPIdev = dev; | ||||
codec->setxCS = setxCS; | ||||
codec->setxDCS = setxDCS; | ||||
codec->setxRST = setxRST; | ||||
codec->getDREQ = getDREQ; | ||||
codec->setxDCS(1); | ||||
codec->setxCS(1); | ||||
codec->setxRST(0); | ||||
delay_100us(2); | ||||
codec->setxRST(1); | ||||
int status; | ||||
do{ | ||||
status= vs10XXcmdread(codec,VSSTATUS); | ||||
}while (status==0xc); | ||||
printf("Status=0x%x\n",status); | ||||
status = (status>>4) & 0xF; | ||||
switch (status) { | ||||
case 0: | ||||
codec->VERSION = VS1001; | ||||
break; | ||||
case 1: | ||||
codec->VERSION = VS1011; | ||||
break; | ||||
case 2: | ||||
codec->VERSION = VS1002; | ||||
break; | ||||
case 3: | ||||
codec->VERSION = VS1003; | ||||
break; | ||||
case 4: | ||||
codec->VERSION = VS1053; | ||||
break; | ||||
case 5: | ||||
codec->VERSION = VS1033; | ||||
break; | ||||
case 7: | ||||
codec->VERSION = VS1103; | ||||
break; | ||||
default: | ||||
codec->VERSION = UNKNOWN; | ||||
break; | ||||
} | ||||
} | ||||
void vs10XXsoftreset(vs10XXDev* dev) | ||||
{ | ||||
vs10XXcmdwrite(dev,VSMODE,(1<<2)); | ||||
} | ||||
void vs10XXsetCansel(vs10XXDev* dev) | ||||
{ | ||||
int mode=vs10XXcmdread(dev,VSMODE); | ||||
vs10XXcmdwrite(dev,VSMODE,mode|8); | ||||
} | ||||
void vs10XXsoftReset(vs10XXDev* dev) | ||||
{ | ||||
int mode=vs10XXcmdread(dev,VSMODE); | ||||
vs10XXcmdwrite(dev,VSMODE,mode|4); | ||||
} | ||||
int vs10XXcanselAccepted(vs10XXDev* dev) | ||||
{ | ||||
int mode=vs10XXcmdread(dev,VSMODE); | ||||
return ((mode & 8)!=8); | ||||
} | ||||
int vs10XXcmdread(vs10XXDev* dev,char address) | ||||
{ | ||||
int result; | ||||
while(!dev->getDREQ()); | ||||
dev->setxCS(0); | ||||
spiputw(dev->SPIdev,3); | ||||
spiputw(dev->SPIdev,address); | ||||
result = (0xFF00 & (spigetw(dev->SPIdev)<<8)) + (0xFF & spigetw(dev->SPIdev)); | ||||
dev->setxCS(1); | ||||
return result; | ||||
} | ||||
void vs10XXcmdwrite(vs10XXDev* dev,char address,int value) | ||||
{ | ||||
while(!dev->getDREQ()); | ||||
dev->setxCS(0); | ||||
spiputw(dev->SPIdev,2<<8); | ||||
spiputw(dev->SPIdev,address); | ||||
spiputw(dev->SPIdev,value>>8); | ||||
spiputw(dev->SPIdev,value); | ||||
dev->setxCS(1); | ||||
} | ||||
void vs10XXstream32bytes(vs10XXDev* dev,char* buffer) | ||||
{ | ||||
while(!dev->getDREQ()); | ||||
dev->setxCS(1); | ||||
dev->setxDCS(0); | ||||
spiputnc(dev->SPIdev,buffer,32); | ||||
dev->setxDCS(1); | ||||
} | ||||