void ISD_Ready(void) // 在SPI命令输入到1760前 应保持的状态
{
SS=1;
SCLK=1;
MOSI=0;
}
void ISD_UP(void) //上电
{
SS=0; //为低是选中芯片并开启SPI接口
ISD_senDdat(0x01);
ISD_senDdat(0x00);
SS=1;
delay(50); //空闲时拉高
}
void ISD_RESET(void) //芯片复位
{
SS=0;
ISD_senDdat(0x03);
ISD_senDdat(0x00);
SS=1;
delay(50);
}
void ISD_RD_STATUS(void) //返回状态寄存器的内容
{
SS=0;
ISD_senDdat(0x05);
ISD_senDdat(0x00);
ISD_senDdat(0x00);
delay(10);
SR0_L=ISD_senDdat(0x05);
SR0_H=ISD_senDdat(0x00);
SR1=ISD_senDdat(0x00);
SS=1;
delay(50);
}
uchar ISD_senDdat(uchar dat)
{
uint i;
uchar ISD_BUF;
ISD_Ready();
ISD_BUF=dat; //需要发送给ISD1760的数据
SS=0;
for(i=0;i<8;i++)
{
SCLK=0;
if((ISD_BUF&0x01)==1)
{
MOSI=1; //逐位发送,低位先发送
}
else
{
MOSI=0;
}
ISD_BUF=ISD_BUF>>1; //发送好一位之后右移一位
if(MISO) //同时接受返回的数据,返回数据高位先移出
{
ISD_BUF=ISD_BUF|0x80;
}
SCLK=1;
delay(6);
}
MOSI=0;
return(ISD_BUF); //返回给MCU
}
void ISD_Init(void)
{
uchar SBUF;
ISD_Ready();
SR0_L=0;
SR0_H=0;
SR1=0;
PLAYADD_L=0; //初始化寄存器的值
PLAYADD_H=0;
ERCADD_L=0;
ERCADD_H=0;
APC_L=0;
APC_H=0;
ISD_RESET(); //复位
delay(50);
while((SR0_L&0x01)||(!(SR1&0x01))) //上电 芯片成功上电后PU和RDY置1
{
ISD_UP();
delay(500);
ISD_RD_STATUS();
}
while(ISD_Free()); //检测忙
SBUF=ISD_REVID(); //读取芯片
delay(10);
delay(10);
while(ISD_Free()); //检测忙
ISD_CLR_INT(); //清除中断
delay(10);
while(ISD_Free()); //检测忙
ISD_WR_APC2(0x40,0x0c); //设置APC寄存器的值 初始化音量取中间音量
delay(10);
while(ISD_Free()); //检测忙
ISD_RD_APC(); //读取APC寄存器的数据
delay(10);
}
我只放上了需要用来初始化的主要程序,在芯片运行的时候会在
while((SR0_L&0x01)||(!(SR1&0x01))) //上电 芯片成功上电后PU和RDY置1
{
ISD_UP();
delay(500);
ISD_RD_STATUS();
}
这个循环之内出不来 我也试过另外的判条件while((!(SR1&0x01))||(!(SR0_L&0x04)))即上电成功之后RDY和PU置1 可是不管哪种方法都不行,网纱那个的资料也查了很多了 也弄不明白 求做过语音芯片的大神指点一下!谢谢啦!