c
过程是这样:我通过电话发送号码,芯片解码号码并当数据准备好被读时,把INT0拉低,
引发一个中断,通知读取数据。我现在碰到的问题是:中断能正确触发,也即中断触发的
次数和我读出到的数据个数一致。但是我收到的数据大部分情况是会随机错一两个字节。
但也有全对的情况。我被这个问题困扰一周多了!老板催的急!数据收发端口时序如下:
MPI口,即DCLK、DIO、CS的时序关系及关于MPI的操作是:
1、 CPU向LE78D11写命令/数据
A)、片选拉低(CS)
B)、时钟拉低(DCLK)
C)、CPU送数据到DIO,高位在前(D7----D0)
D)、时钟拉高(DCLK)
E)、转到B),写下一位直到8位写完。
F)、时钟拉高、片选拉高。
2、CPU从LE78D11读数据
A)、片选拉低(CS)
B)、时钟拉低(DCLK)
C)、CPU读DIO上的数据,高位在前(D7----D0)
D)、时钟拉高(DCLK)
E)、转到B),读下一位直到8位读完。
F)、时钟拉高、片选拉高。
注:从时钟拉低到CPU读DIO上的数据的最短时间为50NS
我的收发数据程序如下:
void SendOneByte(uchar Number)
{
register uchar i;
register uchar NumPlace; //用NumPlace来依次判断数据的每一位值;
NumPlace=Number;
CS=LOW; //时钟管脚为低
Delay(2); //延时5us
for( i=0; i <8; i++ )
{
DCLK=LOW; //时钟管脚为高
Delay(2); //延时5us
if(0x80&NumPlace)
{
DIN=HIGH; //在时钟为高时改变数据
}
else
{
DIN=LOW; //在时钟为高时改变数据
}
Delay(2); //延时5us
NumPlace < <=1; //NumPlace左移一位,保证把数据按位从D7位依次发送
DCLK=HIGH; //置DCLK为高
Delay(2); //延时5us
}
CS=HIGH; //置CS为高
Delay(30); //延时50us
}
uchar GetOneByte( )
{
register uchar i;
uchar Number=0x00; //用于存储所读取的一个字节数据
CS=LOW;
Delay(2);
DCLK=LOW;
Delay(2);
for(i=0; i <8; i++ )
{
DCLK=LOW;
Delay(2);
Number < <=1;
if( DOUT) //DOUT是7811芯片的MPI部分的数据输出脚
{
if(DOUT)
{
Number+=1;
}
}
DCLK=HIGH;
Delay(2);
//Sample右移一位,指示数据的低一位值
}
CS=HIGH;
Delay(30);
return(Number);
}
发表时间:2004年11月29日18:14:49