DSP SPI口和串行EEPROM在變頻器中的應(yīng)用
以下是讀狀態(tài)寄存器子程序:
unsigned int RSDR_X5168(void)
{ unsigned int readspibuftrue;
?。?a class="contentlabel" href="http://www.ljygm.com/news/listbylabel/label/SPI">SPIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
*SPIDAT=RDSR; /*發(fā)送x5168的讀狀態(tài)寄存器命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuftrue=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。猄PIDAT=0; /*發(fā)送偽數(shù)據(jù)*/
while((*SPISTS0x40)!=0x40){} /*等待SPI讀/寫(xiě)結(jié)束*/
readspibuftrue=*SPIBUF; /*讀SPIBUF寄存器,讀取狀態(tài)寄存器*/
return readspibuftrue;
?。?P> 二、寫(xiě)操作
a).在試圖向器件寫(xiě)入數(shù)據(jù)前必須首先通過(guò)發(fā)送WREN指令來(lái)設(shè)置寫(xiě)使能鎖存WEL(見(jiàn)圖4)。/CS 先被拉低,接著向器件輸入WREN指令(00000110B)。在指令的所有的8位傳送完后,/CS 必須被拉高。如果用戶(hù)在發(fā)送完WREN指令后,沒(méi)有將/CS 拉高而繼續(xù)寫(xiě)操作則該寫(xiě)操作將被忽略。
圖4 寫(xiě)使能時(shí)序圖
void WREN_X5168(void) /*寫(xiě)使能*/
?。?*SPIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
*SPIDAT=WREN; /*發(fā)送X5168的寫(xiě)使能命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
*SPIPC1|=0x40; /*置高SPISTE引腳,從而禁止X5168*/
?。?P> b).為了向EEPROM存儲(chǔ)器陣列寫(xiě)入數(shù)據(jù)用戶(hù)接著發(fā)送寫(xiě)WRITE 指令(00000010B),跟著是16位地址和被寫(xiě)入的數(shù)據(jù)。任何不用的地址位都被指令為“0”,寫(xiě)操作最少要用32個(gè)時(shí)鐘,/CS 必須為低并在該操作期間一直保持為低。如果地址計(jì)數(shù)器達(dá)到一頁(yè)的末端而時(shí)鐘還在繼續(xù),時(shí)計(jì)數(shù)器將返回至該頁(yè)的首地址,并覆蓋任何之前已寫(xiě)入的數(shù)據(jù)。對(duì)于將完成的頁(yè)面寫(xiě)操作(字節(jié)或頁(yè)面寫(xiě))而言,在寫(xiě)入的最后一個(gè)數(shù)據(jù)的位0被同時(shí)輸入后,/CS只能被拉高。如果它在其它任何時(shí)候被拉高則不能完成寫(xiě)操作(見(jiàn)圖5)。
圖5 寫(xiě)EEPROM陣列時(shí)序圖
以下是寫(xiě)EEPROM陣列子程序,RA_ADDR為存儲(chǔ)要寫(xiě)數(shù)據(jù)數(shù)組的首地址,EEP_ADDR為要寫(xiě)入的EEPROM首地址,N要存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)。
void WRITE_X5168(unsigned int * RA_ADDR, unsigned int EEP_ADDR, unsigned int N)
?。?unsigned int I;
WREN_X5168(); /*寫(xiě)使能*/
*SPIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
*SPIDAT=WRITE; /*發(fā)送x5168的寫(xiě)狀態(tài)寄存器命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
*SPIDAT=EEP_ADDR>>8; /*先發(fā)送高位地址在發(fā)送低位地址*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
*SPIDAT=EEP_ADDR; /*先發(fā)送高位地址在發(fā)送低位地址*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
for (I=0;I
{ *SPIDAT =*(RA_ADDR+I)>>8 ; /*發(fā)送數(shù)據(jù)用數(shù)組傳送,傳送數(shù)據(jù)高八位*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。猄PIDAT =*(RA_ADDR+I) ; /*發(fā)送數(shù)據(jù)用數(shù)組傳送,傳送數(shù)據(jù)第八位*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。?P> *SPIPC1|=0x40; /*置高SPISTE引腳,從而禁止X5168*/
}
c).為向狀態(tài)寄存器寫(xiě)數(shù)據(jù),在WRSR指令(00000001B)之后應(yīng)跟隨被寫(xiě)入的數(shù)據(jù)(見(jiàn)圖6),數(shù)據(jù)位0和位1必須為“0”。
圖6 寫(xiě)狀態(tài)寄存器時(shí)序圖
以下是寫(xiě)狀態(tài)寄存器子程序:
void WRSR_X5168(unsigned int COM) /*寫(xiě)狀態(tài)*/
?。?WREN_X5168(); /*寫(xiě)使能*/
*SPIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
?。猄PIDAT=WRSR; /*發(fā)送X5168的寫(xiě)狀態(tài)寄存器命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。猄PIDAT=COM; /*STATUS_REG發(fā)送狀態(tài)字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫(xiě)結(jié)束*/
readspibuf=*SPIBUF; /*讀SPISTS寄存器,清除SPI INT FLAG 位*/
?。猄PIPC1|=0x40; /*置高SPISTE引腳,從而禁止X5168*/
TIMEDEL(5); /*延時(shí)1us*/
?。?P> 以上子程序?qū)崿F(xiàn)了DSP對(duì)X5168的讀寫(xiě)功能,在主程序中調(diào)用這些子程序就可實(shí)現(xiàn)對(duì)X5168的操作。
5 結(jié)束語(yǔ)
由于篇幅的原因,本文沒(méi)有過(guò)多的講述DSP的串行外設(shè)接口和X5168的各項(xiàng)特性,這些說(shuō)明書(shū)上都有敘述且很具體。而是把重點(diǎn)放在了講述DSP擴(kuò)展EEPROM應(yīng)用的軟硬件設(shè)計(jì),該設(shè)計(jì)已成功應(yīng)用在筆者開(kāi)發(fā)的變頻器中,經(jīng)過(guò)反復(fù)測(cè)試,運(yùn)行可靠。
評(píng)論