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