以下的僅是D12相關時序的操作:
時序圖如下:

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