📄 spi.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 + -