以下的仅是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的时序问题,后面的相关知识在验证前面时序是否正确!!其中相关图片截于圈圈
|