##// END OF EJS Templates
Some more doc.
Some more doc.

File last commit:

r71:608b7f0e27c2 dev_alexis
r73:5e865c663d35 dev_alexis
Show More
VS10XX.c
132 lines | 3.5 KiB | text/x-c | CLexer
/*------------------------------------------------------------------------------
#-- 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 <spi.h>
#include <VS10XX.h>
#include <core.h>
#include <stdio.h>
//#include <bsp.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);
}