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

📄 spi.c

📁 AT91SAM7X256的SPI初始化及读写函数。
💻 C
字号:

#include "Board.h"
#include "spi.h"
#include "project.h"
AT91PS_PDC pPDC=AT91C_BASE_PDC_SPI0;
int LoopTime=0;
//SetUp Register Value,480Sps,page30
const char SetUpValue[16]={0x35,0xc0,0x35,0xc0,0x75,0xc1,0x75,0xc1,
0xB5,0xc2,0xB5,0xc2,0xF5,0xc3,0xF5,0xc3};

//转换命令数组,依次为通道1、2、3、4

const char ConvertCmd[4]={0x80,0x90,0xA0,0xB0};    //用于单步转换的命令
//const char ContinuousConvCmd[4]={0x0c,0xd0,0xe0,0xf0};//用于连续转换的命令

void SPI_init_Pio()
{
        AT91F_PIOA_CfgPMC ();
	AT91C_BASE_PIOA->PIO_PER = (MOSI0|SPCK0|MISO0|SPI0NPCS1|MOSI1|MISO1|SPCK1|SPI0NPCS2);
	AT91C_BASE_PIOA->PIO_OER  = MOSI0|MOSI1|SPCK0|SPCK1|SPI0NPCS1|SPI0NPCS2;
	
        AT91C_BASE_PIOA->PIO_ODR  = MISO0;
        AT91C_BASE_PIOA->PIO_ODR  = MISO1;
        AT91C_BASE_PIOA->PIO_IFER  =MISO0|MISO1;
         //Configure PIO controllers to periph mode
	        AT91F_PIO_CfgPeriph(
		AT91C_BASE_PIOA, 
		MOSI0|SPCK0|MISO0|SPI0NPCS1, MOSI1|MISO1|SPCK1|SPI0NPCS2);

}
                   
//--SPI初始化----------------------------------------------------------------------------------------------------------
void  SPI1_init__hardware(void)
{
	
        AT91F_SPI1_CfgPMC ();
        AT91F_SPI_Enable(AT91C_BASE_SPI1);
        AT91F_SPI_Reset(AT91C_BASE_SPI1);	
	
	AT91F_SPI_CfgMode(AT91C_BASE_SPI1,AT91C_SPI_MSTR|AT91C_SPI_FDIV|CS1<<16|AT91C_SPI_MODFDIS);
	
	AT91F_SPI_CfgCs(AT91C_BASE_SPI1,0, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));
        AT91F_SPI_CfgCs(AT91C_BASE_SPI1,1, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));
        AT91F_SPI_CfgCs(AT91C_BASE_SPI1,2, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));
        AT91F_SPI_CfgCs(AT91C_BASE_SPI1,3, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));

	AT91F_SPI_DisableIt(AT91C_BASE_SPI1,0x3f);					// Disable SPI 
	//AT91F_PDC_Open(AT91C_BASE_PDC_SPI1);
        AT91F_SPI_Enable(AT91C_BASE_SPI1);    
}

void  SPI0_init__hardware(void)
{
	
        AT91F_SPI0_CfgPMC ();
        AT91F_SPI_Enable(AT91C_BASE_SPI0);
        AT91F_SPI_Reset(AT91C_BASE_SPI0);	
	
	//--------------------------------------------------
	AT91F_SPI_CfgMode(AT91C_BASE_SPI0,AT91C_SPI_MSTR|AT91C_SPI_FDIV|CS1<<16|AT91C_SPI_MODFDIS);
	
	
	AT91F_SPI_CfgCs(AT91C_BASE_SPI0,1, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));
        AT91F_SPI_CfgCs(AT91C_BASE_SPI0,2, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|((MCK/(CS5534_CLK)) << 8));
  
	AT91F_SPI_DisableIt(AT91C_BASE_SPI0,0x3f);					// Disable SPI
	//AT91F_PDC_Open(AT91C_BASE_PDC_SPI0);
        AT91F_SPI_Enable(AT91C_BASE_SPI0);    
}


 void AT91F_SpiWrite (AT91PS_SPI pSPI,unsigned int data ,int cs)
{ 	
   
  unsigned int state;
  
   while( 0 == ((state=pSPI->SPI_SR) & AT91C_SPI_TDRE) );  
   // until TDRE == 1.
    state = (~(1 << cs)) & 0xF;  
    pSPI->SPI_TDR = (data & 0xFFFF) | (state << 16);
   while( 0 == ((state=pSPI->SPI_SR) & AT91C_SPI_TXEMPTY)); 
   //untill transfer finish.   
   while( 0 == ((state=pSPI->SPI_SR) & AT91C_SPI_RDRF));   
   state = pSPI->SPI_RDR; 
     
}

unsigned int AT91F_SpiRead (AT91PS_SPI pSPI)
{ 	
       unsigned int state;
       
       while(((state=pSPI-> SPI_SR)&AT91C_SPI_TDRE)==0);
       pSPI->SPI_TDR=0x0;
       while((pSPI->SPI_SR&AT91C_SPI_TXEMPTY)==0);
       while( 0 == ((state=pSPI->SPI_SR) & AT91C_SPI_RDRF));
       state = pSPI->SPI_RDR;
       
       return (state&0xFFFF);
}


void SPI_init(void)
{
	SPI_init_Pio();
	SPI1_init__hardware();
        SPI0_init__hardware();
        CS5534_Init();
        AT91F_SpiWrite(AT91C_BASE_SPI0 ,ConvertCmd[0],0);
        
}

void CS5534_Init(void){
int i;
AT91PS_SPI pSPI;
pSPI= AT91C_BASE_SPI0;

//cs5534初始化
for(i=0;i<20;i++)
AT91F_SpiWrite(pSPI ,0xFF,0);
AT91F_SpiWrite(pSPI ,0xFE,0);

//写cs5534的配制寄存器,VRS=1,RS=1
AT91F_SpiWrite(pSPI ,CONFIGREG_WRITE,0);
AT91F_SpiWrite(pSPI ,0x22,0);
AT91F_SpiWrite(pSPI ,0x00,0);
AT91F_SpiWrite(pSPI ,0x00,0);
AT91F_SpiWrite(pSPI ,0x00,0);

//写cs5534的8个setup寄存器,这里以矩阵形式依次写入数据,
//在此把相邻寄存器,如setup1、setup2的数据写为相同,所以一片5534
//的四个通道分别用setup1、3、5、7来指明转换的物理通道
AT91F_SpiWrite(pSPI ,SETUPREG_WRITE_AS_ARRAY,0);
for(i=0;i<16;i++)
AT91F_SpiWrite(pSPI ,SetUpValue[i],0);

pSPI= AT91C_BASE_SPI1;
for(i=0;i<20;i++)
AT91F_SpiWrite(pSPI ,0xFF,0);
AT91F_SpiWrite(pSPI ,0xFE,0);

//VRS=1,RS=1
AT91F_SpiWrite(pSPI ,CONFIGREG_WRITE,0);
AT91F_SpiWrite(pSPI ,0x22,0);
AT91F_SpiWrite(pSPI ,0x00,0);
AT91F_SpiWrite(pSPI ,0x00,0);
AT91F_SpiWrite(pSPI ,0x00,0);

AT91F_SpiWrite(pSPI ,SETUPREG_WRITE_AS_ARRAY,0);
for(i=0;i<16;i++)
AT91F_SpiWrite(pSPI ,SetUpValue[i],0);

}
//在channel(通道号)上进行一次转换,共8个秤,编号为0-7
//其中0-3为SPI1控制,4-7由SPI0控制
int PerformConversion(int channel){
  //OS_ENTER_CRITICAL();
  int i;
  int index;
  int ConvertValue;
  char Result[4];
  AT91PS_SPI pSPI;
  //根据通道来选择spi的基地址和cs5534的SDO引脚(用来判断转换是否完成)
  pSPI=(channel>3)?AT91C_BASE_SPI0:AT91C_BASE_SPI1;
  index=(channel>3)?16:24;
  
    if(channel<4)
    AT91F_SpiWrite(pSPI ,ConvertCmd[channel],0);
    else
    AT91F_SpiWrite(pSPI ,ConvertCmd[channel-4],0);
    //等待转换完成
    
    while((AT91C_BASE_PIOA->PIO_PDSR)&(1<<index))
    {
      LoopTime++;
      if(LoopTime>WAITTICKS){
      LoopTime=0;
      break;
      }
      else continue;
    
    }
    LoopTime=0; 
    AT91F_SpiWrite(pSPI ,0x00,0);
    
    for(i=0;i<4;i++)
    Result[i]=AT91F_SpiRead(pSPI);
   
    ConvertValue=SpiData2Result(Result);
    //OS_EXIT_CRITICAL();
    return ConvertValue;
   
}




⌨️ 快捷键说明

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