#include "cpu_reg.h"
#include "McBsp.h"
unsigned int LSB=0,MSB=0;
/********************************************************/
unsigned int read_subreg0(unsigned int addr)
{
*(SPSA0)=addr;
return(*SPSD0);
}
/////////////////////////////////////////////////////////
void write_subreg0(unsigned int addr,unsigned int val)
{
*(SPSA0)=addr;
*(SPSD0)=val;
}
/*******************************************************/
unsigned int read_subreg1(unsigned int addr)
{
*(SPSA1)=addr;
return(*SPSD1);
}
/////////////////////////////////////////////////////////
void write_subreg1(unsigned int addr,unsigned int val)
{
*(SPSA1)=addr;
*(SPSD1)=val;
}
/*******************************************************/
void McBsp0_init(int ps)
{
if(ps)
{
write_subreg1(SPCR1,0);
write_subreg1(SPCR2,0);
delay(10);
write_subreg1(SPCR1,0x1800); //CLKSTP=11b
write_subreg1(PCR,0x0A08); //CLKXP=0 CLKXM=1 FSXM=1 FSXP=1
write_subreg1(RCR1,0x0080); //RWDLEN1=100(每个字24位) RFRLEN1=0(每帧1个字)
write_subreg1(XCR1,0x0080); //XWDLEN1=100(每个字24位) XFRLEN1=0(每帧1个字)
write_subreg1(SRGR2,0x2000); //CLKSM=1 FSGM=0
write_subreg1(SRGR1,0x0040); //CLKGDV=255
write_subreg1(XCR2,0x0001); //XDATDLY=01b
write_subreg1(RCR2,0x0001); //RDATDLY=01b
write_subreg1(SPCR2,0x0040); //GRST=1
delay(10);
*(DXR11)=0;
write_subreg1(SPCR1,0x1800|1);
write_subreg1(SPCR2,0x0040|1);
delay(10);
}
else
{
write_subreg0(SPCR1,0);
write_subreg0(SPCR2,0);
delay(10);
write_subreg0(SPCR1,0x1800); //CLKSTP=11b bit12-11 有延迟
//CLKSTP=10b bit12-11 无延迟
//CLKSTP=11b bit12-11 有延迟
// write_subreg0(SPCR1,0x1000);//无延迟
write_subreg0(PCR,0x0A08); //CLKXP=0 CLKXM=1 FSXM=1 FSXP=1
//CLKXP=0 bit1 接收数据在上升沿采样
//CLKXP=1 bit1 接收数据在下降沿采样
// write_subreg0(PCR,0x0A0A); //CLKXP=1 CLKXM=1 FSXM=1 FSXP=1
write_subreg0(RCR1,0x0080); //接收 RWDLEN1=100(每个字24位) RFRLEN1=0(每帧1个字)
write_subreg0(XCR1,0x0080); //发送 XWDLEN1=100(每个字24位) XFRLEN1=0(每帧1个字)
// write_subreg0(RCR1,0x0000); //接收 RWDLEN1=000(每个字8位) RFRLEN1=0(每帧1个字)
// write_subreg0(XCR1,0x0000); //发送 XWDLEN1=000(每个字8位) XFRLEN1=0(每帧1个字)
write_subreg0(SRGR2,0x2000); //CLKSM=1 FSGM=0
write_subreg0(SRGR1,0x00FF); //CLKGDV=255
write_subreg0(XCR2,0x0001); //XDATDLY=01b 1位
// write_subreg0(XCR2,0x0002); //XDATDLY=10b 2位
// write_subreg0(XCR2,0x0000); //XDATDLY=00b 0位数据延迟
write_subreg0(RCR2,0x0001); //RDATDLY=01b
write_subreg0(SPCR2,0x0040); //GRST=1
delay(10);
*(DXR10)=0;
*(DXR20)=0;
write_subreg0(SPCR1,0x1800|1);
write_subreg0(SPCR2,0x0040|1);
delay(10);
}
}
/**********************************************/
void Send_Byte(unsigned int DataL,unsigned int DataH,int ps)
{
unsigned int temp;
if(!ps)
{
do{
temp=read_subreg0(SPCR2);
}while((temp &0x0002)!=0x0002);
*DXR10=DataL;
*DXR20=DataH;
}
else
{
do{
temp=read_subreg1(SPCR2);
}while((temp &0x0002)!=0x0002);
*DXR11=DataL;
*DXR21=DataH;
}
}
void Read_Byte(void)
{
unsigned int temp;
write_subreg0(RCR1,0x0060); //RWDLEN1=010(每个字20位) RFRLEN1=0(每帧1个字)
write_subreg0(XCR1,0x0060); //XWDLEN1=010(每个字20位) XFRLEN1=0(每帧1个字)
//write_subreg0(PCR,0x0A0A); //CLKXP=1 数据在时钟下降沿发送
delay(10);
// Send_Byte(0x0000,0);
//Send_Byte(0x00);
while(1) {
temp=read_subreg0(SPCR1);
if(temp &0x0002) break;
}
MSB= *DRR20;
LSB= *DRR10;
delay(10);
// write_subreg0(PCR,0x0A08); //CLKXP=0 恢复:数据在时钟下降沿发送
write_subreg0(RCR1,0x0000); //RWDLEN1=000(每个字8位) RFRLEN1=0(每帧1个字)
write_subreg0(XCR1,0x0000); //XWDLEN1=000(每个字8位) XFRLEN1=0(每帧1个字)
//return(*DRR10);
}
//////////////////////////////////////////////////////////
void delay(unsigned int k)
{
while(k--);
}