ISD1700系列的SPI串行接口操作遵循一下协议:
1、一个SPI处理开始于/SS管脚的下降沿;
2、在一个完整的SPI指令传输周期,/SS管脚必须保持低电平;
3、数据在SCLK的上升沿所存在芯片的MOSI管脚,在SCLK的下降沿从MISO管脚输出,低位先出;
4、SPI指令操作码包括命令字节、数据字节和地址字节,这取决于1700的命令类型;
5、当命令字及地址数据输入到MOSI管脚时,同时“状态寄存器”和当前地址信息从MISO管脚输出;
6、一个SPI处理在/SS变高后启动;
7、在完成一个SPI命令的操作后,会启动一个中断信息,且持续为低,直到芯片收到CLR_INT指令或复位。
空闲状态下:
/SS=HIGH;SCLK=HIGH;MOSI=LOW
MEGA16L相关SPI寄存器及设置:
SPCR,SPI控制寄存器:初始化为SPCR=0X78;意思是SPI中断不使能,SPI使能,低位先发,主机模式,SCK空闲高电平,起始沿 (下降沿)采样。
SPSR,SPI状态寄存器:仅0位可读写,SPI2X=0,配合SPCR的0、1位为0,设置SCLK频率为4分频(晶振)。
程序化描述:
1、MCU拉低/SS管脚:/SS=0;
2、SET_PLAY命令移入SPDR寄存器:SPDR=CDATA;//CDATA IS COMMAND DATA
WHILE(!(SPSR&(1<<SPIF))); // WAITE UNTIL SEND OVER
3、接收字节返回值: WHILE(!(SPSR&(1<<SPIF))); // WAITE UNTIL RECEIVE OVER
RETURN SPDR;
4、重复以上过程6次,直到SET_PLAY命令和地址发送完成,接收完成;
***注意 若返回的第一个字节的0位为1,表示以上命令发送失败,重新发送***
***注意接收时序,在每发送一个字节以后,接收一个字节。
过程描述为:SPDR=DATA; //发送数据 DATA
WHILE(!(SPSR&(1<<SPIF)));
RETURN SPDR;//返回接收数据 或写成 “D_BUF=SPDR;”将数据存储起来。
5、拉高/SS:/SS=1;
6、等待RDY/INT管脚变低:WHILE(RDY);//WAITE UNTIL RDY=0
7、发送CLR_INT命令。(具体过程类似2、3步,仅内容和长度差异)
××××××思考:SPIF位在何时清零,以上程序没有特别关注其清零,故有可能在发送完成,转入接收的过程中转入死循环或者接收失败,有待检验。
void spi_init()
{
uchar temp;
temp = SPSR;
temp = SPDR;
}
以上子函数可以清零SPIF位。
整个播放流程描述为:
VOI_PU(); // ISD1760上电命令,发送PU指令,函数包括一个Tpu延时时间为(400/Fclk),Fclk为SPI总线频率,时间单位为秒,频率单位为赫兹。 SPI Clock Rate: 2764.800 kHz,为例,延时为145微秒(取整)。
VOI_CLR(); //发送INT_CLR指令,清RDY/INT 位为1
while(!RDY);//等待,直到确实为1,
VOI_PLAY(); // 发送SET—PLAY指令,地址等,内容见上。
vOI_CLR(); //清RDY/INT 位为1
vOI_PD(); //发送INT_CLR指令, ISD1760掉电命令
***注意,INT_CLR指令、PU指令和SET_PLAY指令都有返回值,以检验通讯正确性,详见“开发手册”。