以下的僅是D12相關(guān)時序的操作:
時序圖如下:

說明:
圖中,CS_N為片選信號,此處的意思為當屁安訊信號為低時,下面的操作才有意義。由于板子上直接將CS_N固定接地,所以其一直保持為低電平,因此程序不用管CS_N。
A0為地址線,用于選擇是出傳輸?shù)刂愤是傳輸數(shù)據(jù),
A0為1時,表示操作的是命令
A0為0時,表示操作的是數(shù)據(jù)
WR_N是寫信號,,表示W(wǎng)R_N的上升沿將數(shù)據(jù)寫入到芯片中。數(shù)據(jù)必須在上升沿前后穩(wěn)定的保持一段時間才能可靠的寫入。
我們模擬出來的時序必須要滿足這些條件才能正確的操作硬件
RD_N是讀選通信號,在讀數(shù)據(jù)時,需要先將RD_N置低,等待一段時間后,數(shù)據(jù)將出現(xiàn)自數(shù)據(jù)總線DATA【7..0】上,這是可以讀取數(shù)據(jù),讀取完畢后,將RD_N置高,數(shù)據(jù)總線上的數(shù)據(jù)將在一定時間后消失。
有以上分析得出
寫命令的操作為:
現(xiàn)將A0置高(即設(shè)置為命令狀態(tài)),再將WR_N置低,把需要發(fā)動送的命令放在數(shù)據(jù)總線上,再講WR_N置高,這樣,場上一個上升沿,從而把數(shù)據(jù)寫入到D12中。寫完命令后,需將總線設(shè)置為輸入狀態(tài)避免沖突!
寫數(shù)據(jù)的操作位:
現(xiàn)將A0置低(即設(shè)置為數(shù)據(jù)狀態(tài)),再將WR_N置低,把需要發(fā)動送的命令放在數(shù)據(jù)總線上,再講WR_N置高,這樣,場上一個上升沿,從而把數(shù)據(jù)寫入到D12中。寫完命令后,需將總線設(shè)置為輸入狀態(tài)避免沖突!
最終的寫命令函數(shù)代碼如下:
void D12WriteCommand(uint8 command)
{
D12SetCommandAddr(); //設(shè)置為命令地址
D12ClrWr(); //WR置低
D12SetPortOut(); //將數(shù)據(jù)口設(shè)置為輸出狀態(tài)
D12SetData(command); //輸出命令到數(shù)據(jù)口上
D12SetWr(); //WR置高
D12SetPortIn(); //將數(shù)據(jù)口設(shè)置為輸入狀態(tài), 以備以后使用
}
讀數(shù)據(jù)函數(shù)代碼如下:
uint8 D12ReadByte(void)
{
uint8temp;
D12SerDataAddr(); //設(shè)置為數(shù)據(jù)地址
D12ClrRD(); //RD置低
trmp=D12GetData(); //讀回數(shù)據(jù)
D12SetRD(); //RD置高
returntemp; //返回讀到的數(shù)據(jù)
}
通過上面可知,已經(jīng)有讀和寫的代碼。,這樣就可以讀取D12的ID號了
D12的ID號的讀取命令為0XFD,可定義宏:#define Read_ID 0XFD,在程序中直接食用即可
程序代碼如下:
uin16 D12ReadID(void)
{
uint16id;
D12WriteCommand(Read_ID); //寫ID命令
id=D12ReadByte(); //讀回ID號低字節(jié)
id|=((uint16)D12ReadByte())<<8; //讀回ID號高字節(jié)
returnid;
}
最后,需要驗證一下ID號是否正確,讀取并顯示代碼如下:
id=D12ReadID();
printf("you D12 Chip's ID is: ");
if(id==0X1012)
{
printf("IDis correct! Congratulations!");
}
else
{
printf("IDis incorrect! What apity!!");
}
到此為止,本文主要是想說一下D12的時序問題,后面的相關(guān)知識在驗證前面時序是否正確!!其中相關(guān)圖片截于圈圈
|