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指令都有傳回值,以檢驗通訊正確性,詳見“開發手冊”。