Slave SelectMap 模式下提供時鐘的是外部器件,本方案中的時鐘信號是CCLK 使用 ARM 芯片的通用IO 進(jìn)行模擬。同時,該模式下數(shù)據(jù)管腳有8 個,因此在每個CCLK 的上 升沿,F(xiàn)PGA 可以讀入1 個字節(jié)的數(shù)據(jù)。需要注意的是這1 字節(jié)的最高位是D0,而不是一 般微處理器默認(rèn)的D7,在電路板布線和編寫配置程序時應(yīng)給予相應(yīng)改變。
配置過程的具體流程如圖2 所示。

?
接收完配置數(shù)據(jù)后,DONE 管腳會被拉高。但這并不是表示配置過程已經(jīng)結(jié)束,系統(tǒng)仍 需要時鐘來進(jìn)行后續(xù)的上電啟動工作。為保證上電配置過程的正確進(jìn)行,最好的辦法是將配 置文件中的所有數(shù)據(jù)寫入FPGA 中之后,然后繼續(xù)輸出CCLK 信號,直到DONE 管腳被拉 高。之后,再輸出8 個周期的CCLK,保證配置能正常完成。
根據(jù)上述流程,配置程序的主要函數(shù)的偽碼如下。
1.初始化函數(shù)SelectMAP_Init,在其它函數(shù)之前運(yùn)行。
SelectMAP_Init(){
將ARM 通用IO 設(shè)置為對應(yīng)的SelectMap 管腳信號;
設(shè)置 PROGRAM#,CS#和WRITE#管腳為低電平;
延時至少300ns;
設(shè)置 PROGRAM#為高電平;
循環(huán)檢查INIT#是否變?yōu)楦唠娖?
}
2.發(fā)送數(shù)據(jù)的函數(shù)SendData_Byte,發(fā)送1 字節(jié)的數(shù)據(jù)。
SendData(uint8 data){
拉低CCLK;
將 D0~D7 電平設(shè)置為與data 對應(yīng)的狀態(tài);
拉高 CCLK;
}
3.發(fā)送數(shù)據(jù)的函數(shù)SendData_Sector,發(fā)送SD 卡中1 個扇區(qū)的數(shù)據(jù)。
void SendData_Sector(uint8 * data){
聲明計數(shù)器,并將初始值設(shè)為0;
調(diào)用 SendData_Byte 發(fā)送1 個字節(jié)的數(shù)據(jù),計數(shù)器加1;
檢查 BUSY 管腳的狀態(tài),等待其變?yōu)榈碗娖?
檢查計數(shù)器是否到達(dá)規(guī)定的數(shù)據(jù)塊大小,達(dá)到時函數(shù)返回,未到達(dá)時繼續(xù)發(fā)送數(shù)據(jù);
}
2.3.3 配置文件的格式
FPGA 支持將配置文件生成為幾種不同的格式,但在本方案中不是所有格式都可以使用 的。一般最常用的格式是.BIN 和.BIT 格式。由于.BIT 格式包含頭部開銷,會增加額外的處 理過程,因此本方案沒有支持.BIT 格式的數(shù)據(jù),僅推薦使用.BIN 格式。
評論