打印

大虾看看@_@!!

[复制链接]
2175|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发霉的味道|  楼主 | 2007-6-16 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.h"

sbit  SPICS = P1^0 ;

sbit  SPISK = P1^1 ;

sbit  SPIDI = P1^2 ;

sbit  SPIDO = P1^3 ;

void delay ( unsigned int timeM )

{  unsigned  int  count;

         TH0  = 0x06 ;

         TL0  = 0x06 ;

         TMOD = 0x02 ;

            TF0  = 0 ;

            TR0  = 1 ;

   for ( ; timeM > 0 ; timeM-- )

       { for ( count=4 ; count>0 ; )

              if ( TF0 ) {   count-- ;

                            TF0 = 0; 

                          }

        }

}

void SPIstart ( void )

{     SPICS = 0  ;
      
      SPISK = 0     ;

      SPIDI = 1     ;

      SPIDO = 1  ;

      delay ( 10 ) ;

      return ;               

 }

 

 void SPIewen ( void )

 {   unsigned char command , count; 
 
      SPIstart () ;

      SPICS = 1 ;

      SPISK = 1 ;

      someNOP() ;

      SPISK = 0 ;

      SPIDI = 0 ;

      SPISK = 1 ;

      someNOP() ;

      SPISK = 0 ;

      SPISK = 1 ;

      someNOP() ;

      SPISK = 0 ;

      command = 0xC0 ;

      for ( count = 0 ; count < 7 ; count ++ )

          {  if ( command & 0x80 ) SPIDI = 1  ;

             else  SPIDI = 0  ;

             command <<= 1   ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

           }

       SPICS = 0 ;

       delay ( 10 ) ;

       return  ;

  }


 

 void SPIwrite ( unsigned char address , unsigned int wdata )

 {    unsigned char count , waddress ; 
 
      unsigned int databuf ;

      waddress = address , databuf = wdata ;

      SPIewen ()  ;

      SPIstart () ;

      SPICS = 1   ;

      SPISK = 1   ;

      someNOP()   ;

      SPISK = 0   ;

      SPIDI = 0   ;

      SPISK = 1   ;

      someNOP()   ;

      SPISK = 0   ;

      SPIDI = 1   ;

      SPISK = 1   ;

      someNOP()   ;

      SPISK = 0   ;

      for ( count = 0 ; count < 7 ; count ++ )    /*  send the address  */

          {  if ( waddress & 0x80 )     SPIDI = 1  ;

             else  SPIDI = 0   ;

             waddress <<= 1  ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

           }

              
       for ( count = 0 ; count < 8 ; count ++ )

           {  if ( databuf & 0x80 ) SPIDI = 1  ;

              else  SPIDI = 0  ;

              databuf <<= 1  ;

              SPISK = 1 ;

              someNOP() ;

              SPISK = 0 ;

            }

      SPICS = 0 ;

      delay ( 10 ) ;

      return ;

 }



unsigned char SPIread ( unsigned char address )    

 {    unsigned char count , waddress ;
 
      unsigned int wdata ;

      waddress = address ;

      SPIstart () ;

      SPICS = 1 ;

      SPISK = 1 ;

      someNOP() ;

      SPISK = 0 ;

      SPISK = 1   ;

      someNOP() ;

      SPISK = 0   ;

      SPIDI = 0   ;
      
      SPISK = 1   ;

      someNOP() ;

      SPISK = 0   ; 

      for ( count = 0 ; count < 7 ; count ++ )    

          {  if ( waddress & 0x80 )    SPIDI = 1  ;

             else  SPIDI = 0  ;

             waddress <<= 1  ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

          }

            
        SPIDO = 1  ;

        someNOP ()   ;

        for ( count = 0 ; count < 8 ; count ++ )

            {  SPISK = 1 ;

               someNOP() ;

               SPISK = 0 ;

               wdata <<= 1 ;

               if ( SPIDO == 1 ) wdata = wdata + 1 ;

             }

         SPICS = 0 ;

         return ( wdata );

 }
void main()

{  unsigned char buf [ 8 ] ;

    SPIwrite ( 0x00 , 0x00 ) ;

    buf [ 0 ] = SPIread ( 0x00 ) ;

}                            
我的51程序,读写93C46的,一直不成功,不知道是什么原因.请大虾指点,不胜感激!!!

相关帖子

沙发
ayb_ice| | 2007-6-17 07:55 | 只看该作者

仔细看DATASHEET

使用特权

评论回复
板凳
dreambird| | 2007-6-17 12:36 | 只看该作者

就这一堆程序贴出来,好歹给个注释啊

毕竟看你的思路比看你的程序容易

使用特权

评论回复
地板
平常人| | 2007-6-17 13:00 | 只看该作者

嘿嘿,是有一点发霉的味道,真不好意思

使用特权

评论回复
5
zhaoyu2005| | 2007-6-17 13:31 | 只看该作者

好像刚开始编程的大多数不爱加注释

为什么呢?在为怎么写语句发愁,忘了

使用特权

评论回复
6
发霉的味道|  楼主 | 2007-6-17 15:09 | 只看该作者

呜呜....

#include "reg51.h"

sbit  SPICS = P1^0 ;

sbit  SPISK = P1^1 ;

sbit  SPIDI = P1^2 ;

sbit  SPIDO = P1^3 ;   //定义IO

void delay ( unsigned int timeM )    //延时子程序(ms)

{  unsigned  int  count;

         TH0  = 0x06 ;

         TL0  = 0x06 ;

         TMOD = 0x02 ;

            TF0  = 0 ;

            TR0  = 1 ;

   for ( ; timeM > 0 ; timeM-- )

       { for ( count=4 ; count>0 ; )

              if ( TF0 ) {   count-- ;

                            TF0 = 0; 

                          }

        }

}

void SPIstart ( void )     //初始化SPI总线

{     SPICS = 0  ;
      
      SPISK = 0     ;

      SPIDI = 1     ;

      SPIDO = 1  ;

      delay ( 10 ) ;   //延时10MS

      return ;               

}



void SPIewen ( void )   //写允许

{   unsigned char command , count; 

      SPIstart () ;     //初始化SPI总线

      SPICS = 1 ;      //片选

      SPISK = 1 ;      //  DI=1 ,SK= 1 ,总线开始位为高电平

      someNOP() ;      //等待稳定

      SPISK = 0 ;      

      SPIDI = 0 ;     

      SPISK = 1 ;      //   输入数据0   

      someNOP() ;

      SPISK = 0 ;

      SPISK = 1 ;     //输入数据0 

      someNOP() ;

      SPISK = 0 ;     // 写允许命令高三位输入完毕,100

      command = 0xC0 ;  // 低七位 11***** 

      for ( count = 0 ; count < 7 ; count ++ )  //输入低7位

          {  if ( command & 0x80 ) SPIDI = 1  ;

             else  SPIDI = 0  ;

             command <<= 1   ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

           }

       SPICS = 0 ;    //   片选下拉

       delay ( 10 ) ;   //延时10MS

       return  ;

  }




void SPIwrite ( unsigned char address , unsigned int wdata )//写SPI总线

{    unsigned char count , waddress ; 

      unsigned int databuf ;

      waddress = address , databuf = wdata ;

      SPIewen ()  ;   //写允许

      SPIstart () ;   //重新初始化SPI总线

      SPICS = 1   ;   //片选

      SPISK = 1   ;   //开始位1 ,DI= 1 

      someNOP()   ;

      SPISK = 0   ;   

      SPIDI = 0   ;   

      SPISK = 1   ;   //输入数据0 

      someNOP()   ;

      SPISK = 0   ;  

      SPIDI = 1   ;  

      SPISK = 1   ;   //输入数据1

      someNOP()   ;

      SPISK = 0   ;   //命令高三位101输入完毕

      for ( count = 0 ; count < 7 ; count ++ )   //输入低7位地址

          {  if ( waddress & 0x80 )     SPIDI = 1  ;

             else  SPIDI = 0   ;

             waddress <<= 1  ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

           }

              
       for ( count = 0 ; count < 8 ; count ++ )  //输入8位数据

           {  if ( databuf & 0x80 ) SPIDI = 1  ;

              else  SPIDI = 0  ;

              databuf <<= 1  ;

              SPISK = 1 ;

              someNOP() ;

              SPISK = 0 ;

            }

      SPICS = 0 ;    //片选下拉

      delay ( 10 ) ;   //延时10MS

      return ;

}



unsigned char SPIread ( unsigned char address )    //读SPI总线

{    unsigned char count , waddress ;  

      unsigned int wdata ;

      waddress = address ;

      SPIstart () ;  //初始化SPI总线

      SPICS = 1 ;    //片选

      SPISK = 1 ;   //输入开始位1

      someNOP() ;

      SPISK = 0 ;

      SPISK = 1   ;  //输入1

      someNOP() ;

      SPISK = 0   ;

      SPIDI = 0   ;
      
      SPISK = 1   ;  //输入0

      someNOP() ;

      SPISK = 0   ;   //读命令高三位110输入完毕

      for ( count = 0 ; count < 7 ; count ++ )    //输入低7位地址

          {  if ( waddress & 0x80 )    SPIDI = 1  ;

             else  SPIDI = 0  ;

             waddress <<= 1  ;

             SPISK = 1 ;

             someNOP() ;

             SPISK = 0 ;

          }

            
        SPIDO = 1  ;  //  地址输入完毕,准备接收数据

        someNOP ()   ;

        for ( count = 0 ; count < 8 ; count ++ )  //开始接收数据

            {  SPISK = 1 ;

               someNOP() ;

               SPISK = 0 ;

               wdata <<= 1 ;

               if ( SPIDO == 1 ) wdata = wdata + 1 ;

             }

         SPICS = 0 ;

         return ( wdata );

}
void main()

{  unsigned char buf [ 8 ] ;

    SPIwrite ( 0x00 , 0x00 ) ;  //写地址0X00,数据为0X00

    buf [ 0 ] = SPIread ( 0x00 ) ;  // 读地址0X00,结果读出的数据却不是0X00,却是0XFF???????why??why??why??why??why??why??

}

读了N多次DATASHEET 没有发现我哪有做错啊?只得前来请大虾指点!!!                            

使用特权

评论回复
7
mcuatmel| | 2007-6-17 15:39 | 只看该作者

楼主,先从网上找个现成的,多的是。

试成了之后再改成你的思路的程序不就行了。

使用特权

评论回复
8
发霉的味道|  楼主 | 2007-6-17 18:59 | 只看该作者

!!

我就是想自己试试看看!!实在不行再找吧!

使用特权

评论回复
9
dreambird| | 2007-6-17 23:35 | 只看该作者

DI的建立时间要求是多长?

使用特权

评论回复
10
发霉的味道|  楼主 | 2007-6-18 16:33 | 只看该作者

顶起来!

沉下去了,我顶起来!

使用特权

评论回复
11
dreambird| | 2007-6-18 20:31 | 只看该作者

顶什么,怎么不回答?

      SPISK = 0   ;

      SPIDI = 0   ;
      
      SPISK = 1   ;  //输入0
上升沿触发?没有建立时间的要求吗?

使用特权

评论回复
12
发霉的味道|  楼主 | 2007-6-18 23:11 | 只看该作者

我看过了啊!

DI建立时间是50ns啊,我这个不是足够了吗?

使用特权

评论回复
13
古道热肠| | 2007-6-19 11:09 | 只看该作者

用别人的程序试硬件,用自已的程序做优化

   找1个可信的程序测试一下硬件也不错,如果硬件没打通,软件再好使,也不知错在哪儿。
  如果别的程序都成正常,就你这程序有问题,对比着看,找到问题后记到本子上,下次别犯同1个错误了。

使用特权

评论回复
14
发霉的味道|  楼主 | 2007-6-19 21:40 | 只看该作者

呜.............

......................................一定得这样吗?

使用特权

评论回复
15
发霉的味道|  楼主 | 2007-6-20 13:28 | 只看该作者

找到原因了!!

谢谢各侠大虾!我找到原因了!!!原来在写之后有一个状态校验片选时间,偶给忽略了......真是不好意思!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

58

帖子

0

粉丝