ISD1700系列的SPI操作,及其与MEGA16的简单应用

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指令都有返回值,以检验通讯正确性,详见“开发手册”。

你可能感兴趣的:(command,存储,通讯)