导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→c[sean_lwx]

 *第27952篇: c

  
楼 主:sean_lwx 2004年11月29日18:14
 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);
}


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:高人帮忙啊,44b0的灯点不亮

[下一篇主题]:help