⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

📁 用at91sam7s64+ucos写的mp3播放程序
💻 C
字号:
#include "AT91SAM7S64.h"
#include "Board.h"
#include "global.h"
#include "hard.h"
#include "type.h"
#include "spi.h"
#include "port.h"
#include "dbgu.h"
#include "sd.h"





/*
//------------------------------------------------------------------------
void vSpiInit(void)
{
    *AT91C_PMC_PCER   |= SPI_CLK_MASK;  //SPI_CLK enable
    *AT91C_PIOA_PDR   |= SPIMASK;       //PIO Disable
    *AT91C_PIOA_ASR   |= SPIMASK;       //A,B Peripheral,select A
    *AT91C_PIOA_PPUER |= SPIPULLUP;     //Pull-up enable   
    *AT91C_SPI_MR     = 0x0600001b;     //0x06   delay time
                                        //0x00   pcs NPCS
                                        //0x00   reserved
                                        //0x1b   00011011 ;LLB=0,MODFDIS=1,FDIV=1,PCSDEC=0,PS=1,MSTR=1
                                        
    *AT91C_SPI_CSR0   = 0x0a0a0208;     //DLYBCT=10,DLYBS=10,SCBR=2,BITS=0000,CSAAT=1,NCPHA=0,CPOL=0(used for vs1003b)
    *AT91C_SPI_CSR1   = 0x0a0a0208;     //DLYBCT=10,DLYBS=10,SCBR=2,BITS=0000,CSAAT=1,NCPHA=0,CPOL=0(used for mmc sd card)
   
    *AT91C_SPI_CSR3   = 0x0a0a0208;     //usd for SPCK out
    
    *AT91C_SPI_CR     = 0x00000001;     //SPI enable
} 



//-------------------------------------------------------------------------
void vSPCK_Out(void)
{
   while( !(*AT91C_SPI_SR & 0x000002FF) );
   *AT91C_SPI_TDR = 0x00070000 | 0xff;    //LASTXFER=0,PCS=0111 
}


//-------------------------------------------------------------------------
void vSentMMC(INT8U data)
{
    while( !(*AT91C_SPI_SR & 0x00000200) );
    *AT91C_SPI_TDR = 0x000d0000 | data;    //LASTXFER=0,PCS=1101
}                               


//-------------------------------------------------------------------------
void vSentVs1003(INT8U data)
{
    while( !(*AT91C_SPI_SR & 0x00000200) );
    *AT91C_SPI_TDR = 0x000e0000 | data;    //LASTXFER=0,PCS=1110   
}


//-------------------------------------------------------------------------
INT16U vReadMMC()
{
   INT16U temp;
   
   *AT91C_SPI_TDR = 0x000d0000 | 0x00;    //LASTXFER=0,PCS=1101 
   while( !(*AT91C_SPI_SR & 0x00000001) );
   temp = *AT91C_SPI_RDR;
   return temp;
}
*/



/*
//------------------------------------------------------------------------
void  PIO_Init(void) 
{
   *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;                             //使能系统时钟寄存器的处理器时钟           
   *AT91C_PMC_PCER = 1 << AT91C_ID_PIOA;                            //使能PIOA外围时钟
   
  
 //  *AT91C_AIC_IDCR = (1 << AT91C_ID_PIOA);                          //禁止PIOA外围中断功能
   
  // AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = (AT91C_AIC_PRIOR_HIGHEST | AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED);
                                                                      //中断模式(中断级别和触发模式)
  // AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned long)KEY_ISR;
   
  // *AT91C_AIC_ICCR = (1<<AT91C_ID_PIOA);                            //中断清除
  // *AT91C_PIOA_IDR = 0xffffffff;                                    //禁止所有PIOA中断
 //  *AT91C_PIOA_IER = (SW3_MASK | SW4_MASK);                         //允许SW3,4中断
 //  *AT91C_AIC_IECR = (1<<AT91C_ID_PIOA);                            //使能PIOA外围中断
 //  *AT91C_AIC_FFDR = 0xffffffff;                                    //禁止FIQ
   
 //  *AT91C_PIOA_PPUER |= SPIPULLUP;     //Pull-up enable
} 
*/



//------------------------------------------------------------------------
INT8U vGet_MISO(void)
{
   if(*AT91C_PIOA_PDSR & MMC_MISO)
      return 1;
   else
      return 0;
}      

//------------------------------------------------------------------------
INT8U vGet_DREQ(void)
{
   if(*AT91C_PIOA_PDSR & VS1003_DREQ)
      return 1;
   else
      return 0;
}


//-------------------------------------------------------------------------
void spi_vSendByte(INT8U u8Data)
{
   INT8U i;
   
   for(i=0; i<8; i++)
   {
      MMC_CLK_LOW();
     
      if( ((u8Data<<i) & 0x80) == 0x80 )
        MMC_MOSI_HIGH();
      else
        MMC_MOSI_LOW();
        
        port_Delay(1);
        
      MMC_CLK_HIGH(); 
   } 
   MMC_MOSI_HIGH();
}


//-------------------------------------------------------------------------
INT8U spi_vReadByte(void)
{
   INT8U i;
   INT8U u8Data = 1;
   
   for(i=0; i<8; i++)
   {
      MMC_CLK_LOW();
      
              port_Delay(1);
              
      u8Data = (u8Data << 1) + vGet_MISO();
      
      MMC_CLK_HIGH();
      
   }
   return(u8Data);
}



//-------------------------------------------------------------------------
void VS1003_SCI_Write(INT8U u8RegNumber, INT16U u16Data)
{
    VS1003_DS_HIGH();
    VS1003_CS_LOW();
    
    spi_vSendByte(0x02);                     //write opcode
    spi_vSendByte(u8RegNumber);              //reg id
    spi_vSendByte((u16Data & 0xff00) >> 8);  //high byte
    spi_vSendByte(u16Data & 0x00ff);         //low  byte
    
    VS1003_CS_HIGH();
}

//-------------------------------------------------------------------------
INT16U VS1003_SCI_Read(INT8U u8RegNumber)
{
    INT16U temp;
    
    VS1003_DS_HIGH();
    VS1003_CS_LOW();
    
    spi_vSendByte(0x03);                     //write opcode
    spi_vSendByte(u8RegNumber);              //reg id
    
    temp = spi_vReadByte();                   //high byte
    temp = (temp << 8) + spi_vReadByte();     //low  byte
    
    VS1003_CS_HIGH();
    
    return (temp);
}


//-------------------------------------------------------------------------
INT16U VS1003_SDI_Write(INT8U* pData, INT16U u16DataNumber)
{
    INT16U i;
    
    VS1003_DS_LOW();
    
    for(i=0; i<u16DataNumber; i++)
    {
       spi_vSendByte(*pData ++);
    }  
    
    VS1003_DS_HIGH();
    
    return 1;
}


////////////////////////////////////////////////////////////////////////////
void vs1003_Init(void)
{
    VS1003_CS_HIGH();
    
    VS1003_RST_LOW();
    delay(0xffff);
    VS1003_RST_HIGH();
    delay(0xffff);
     
    while(!vGet_DREQ());
    VS1003_SCI_Write(0x03,0x9000);
    while(!vGet_DREQ());
    VS1003_SCI_Write(0x02,0x1fff);
    while(!vGet_DREQ());
    VS1003_SCI_Write(0x0b,0x2020);
}










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -