我现在有一个片子连到STC的单片机,需要通过并口对片子进行寄存器的读写,并口采用地址数据复用,接单片机的P0口。下面分别是读写时序:
时序中的时间要求都在20ns左右(最小),所以对采用12时钟的单片机来说完全足够了,我用的11.0592的晶体,基本上一个机器周期在1us左右了。
下面是我写的程序,麻烦大家帮我看看到底哪里有问题,时序一直不满足:
void Write(uchar reg_add,uchar reg_data)
{
DS_RD=1;
DS_WR=1;
//tog RD,WR to high
DS_ALE=1;
//set ALE
P0=reg_add;
//Reg‘s address
DS_ALE=0;
//tog ALE to low,address is latched
DS_WR=0;
//enable WR,prepare for data transmit
P0=reg_data;
//data to be tansmitted
DS_WR=1;
}
uchar Read(uchar reg_add)
{
uchar get_data;
DS_WR=1;
DS_RD=1;
DS_ALE=1;
P0=reg_add;
//above,the same action with Write() function
DS_ALE=0;
//address is transmitted
DS_RD=0;
//enable RD,to get data from extenal regs
P0=0xff;
DS_RD=1;
get_data=P0;
return get_data;//return the data which were read
}
以上就是我写的读写程序,我后面对片子做了一个验证,片子有一个测试寄存器,如果对该寄存器写入特定数值
那么可以将所有的输出口置高电平,然后我进行了写入,证明我的写函数是不正确的。另外时钟方面也是满足片子
要求的,管脚和硬件暂时也没发现有什么问题。
昨天写了一天也没整出来,网上也找不到具体的东西,所以来向各位前辈求救了 |