DSP的SPI口和串行EEPROM在變頻器中的應用
以下是寫EEPROM陣列子程序,RA_ADDR為存儲要寫數據數組的首地址,EEP_ADDR為要寫入的EEPROM首地址,N要存儲數據的個數。
void WRITE_X5168(unsigned int * RA_ADDR, unsigned int EEP_ADDR, unsigned int N)
?。?unsigned int I;
WREN_X5168(); /*寫使能*/
?。?a class="contentlabel" href="http://www.104case.com/news/listbylabel/label/SPI">SPIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
*SPIDAT=WRITE; /*發送x5168的寫狀態寄存器命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。猄PIDAT=EEP_ADDR>>8; /*先發送高位地址在發送低位地址*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。猄PIDAT=EEP_ADDR; /*先發送高位地址在發送低位地址*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
for (I=0;I
?。?*SPIDAT =*(RA_ADDR+I)>>8 ; /*發送數據用數組傳送,傳送數據高八位*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
*SPIDAT =*(RA_ADDR+I) ; /*發送數據用數組傳送,傳送數據第八位*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
?。?p> ?。猄PIPC1|=0x40; /*置高SPISTE引腳,從而禁止X5168*/
?。?p> c).為向狀態寄存器寫數據,在WRSR指令(00000001B)之后應跟隨被寫入的數據(見圖6),數據位0和位1必須為“0”。
圖6 寫狀態寄存器時序圖
以下是寫狀態寄存器子程序:
void WRSR_X5168(unsigned int COM) /*寫狀態*/
?。?WREN_X5168(); /*寫使能*/
?。猄PIPC1=0xBF; /*置低SPISTE引腳,從而選通X5168*/
?。猄PIDAT=WRSR; /*發送X5168的寫狀態寄存器命令字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPIBUF寄存器,清除SPI INT FLAG 位*/
*SPIDAT=COM; /*STATUS_REG發送狀態字*/
while((*SPISTS0x40)!=0x40){} /*等待SPI寫結束*/
readspibuf=*SPIBUF; /*讀SPISTS寄存器,清除SPI INT FLAG 位*/
*SPIPC1|=0x40; /*置高SPISTE引腳,從而禁止X5168*/
TIMEDEL(5); /*延時1us*/
?。?p> 以上子程序實現了DSP對X5168的讀寫功能,在主程序中調用這些子程序就可實現對X5168的操作。
5 結束語
由于篇幅的原因,本文沒有過多的講述DSP的串行外設接口和X5168的各項特性,這些說明書上都有敘述且很具體。而是把重點放在了講述DSP擴展EEPROM應用的軟硬件設計,該設計已成功應用在筆者開發的變頻器中,經過反復測試,運行可靠。
評論