模拟SPI接口程序

  1. //功能      : 由AVR作为主机,向FPGA发送数据,采用模拟SPI接口来实现
  2. //            互相通信  
  3. //作者      : 小白龙
  4. //创建日期  : 2007.8.1  
  5. //版本      :  V1.1
  6. //修改日期  :2007.8.12
  7. //************************************************************
  8. #define clk_r       PORTD.0  //所有IO口初始时设为输出口
  9. #define data_r      PORTD.1
  10. #define ss_r        PORTD.2
  11. #define clk_s       PORTD.3
  12. #define ss_s        PORTD.4
  13. #define data_s      PORTD.5
  14. #define data_sPIN   PIND.5
  15. #define data_sDDR   DDRD.5 
  16. #define IO_PIN      PIND
  17. #define IO_DDR      DDRD.1  //数据读入口 
  18.  uchar spiread(void); 
  19. void spisend(uchar data);
  20. /**********************************************************
  21. *
  22. *功能:模拟SPI接口程序,低位先发送,最后发送高位,
  23.       FPGA接收数据往左移动,即先接收高位 ,二者顺序发送和接收数据相反
  24. *说明:在CLK的上升沿开始写入数据,开始时SS位片选信号,
  25.       当SS由高变低时,产生时钟信号,开始传送
  26. *********************************************************/
  27. void spisend(uchar data)//写入
  28. {   
  29.     uchar i; 
  30.     data_sDDR=1;
  31.     clk_s=0;
  32.     for(i=8;i>0;i--)
  33.  {
  34.   if ((data&0x01)==1)
  35.    { 
  36.    data_s=1;
  37.    }
  38.   else 
  39.    data_s=0;
  40.    delay_1us();
  41.   clk_s=1;
  42.  // delay_1us(); 
  43.   clk_s=0;   
  44.   data>>=1;//右移一位
  45.  } 
  46. /**********************************************************
  47. *
  48. *名称:spiread()
  49. *功能:AVR作为主机,由AVR提供时仲,从FPGA取数据
  50. *说明:在CLK的下降沿开始读数据,FPGA的数据从高位开始发送,
  51.       AVR中接收的数据先送到低位中
  52. *********************************************************/
  53. uchar spiread(void
  54. {
  55.  uchar i;
  56.  uchar data="0x00"
  57.  uchar temp;  
  58.  IO_DDR=0;  //IO口作为输入,DDR要写0  
  59.  ss_r=0;
  60.  clk_r=0;   
  61.  for(i=0;i<8;i++)
  62.  {   
  63.   clk_r=1; 
  64.   clk_r=0;      
  65.   temp="IO"_PIN; 
  66.         if (temp&0x02)       //下降沿采集数据,调换则会出错 
  67.  data|=(0x01<<i);
  68.  } 
  69.  IO_DDR=1;
  70.  ss_r=1;  //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
  71.  clk_r=1;
  72. return(data);
  73. }
  74. //  
  75. // 
  76. // PORTA="0x00";   //灯指示
  77. // DDRA="0XFF";
  78. // 
  79. // PORTB="0x00";//0101 0000
  80. // DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
  81. // 
  82. // PORTC="0x00";
  83. // DDRC="0x80";
  84. // 
  85. // DDRD="0xff";//0000 0001 
  86. // PORTD="0x00";//0100 1000 
  87. //         // SPUL="1",CL=1;
  88. // 
  89. // // Timer/Counter 0 initialization
  90. // TCCR0=0x0b;//采用比较模式,256分频   8M/256=31.25K
  91. // TCNT0=0x00;
  92. // OCR0=0x3D;// (61+1)/31.25   =2ms
  93. // 
  94. // // Timer/Counter 1 initialization
  95. // TCCR1A=0x00;
  96. // TCCR1B=0x00;
  97. // TCNT1H=0x00;
  98. // TCNT1L=0x00;
  99. // ICR1H=0x00;
  100. // ICR1L=0x00;
  101. // OCR1AH=0x00;
  102. // OCR1AL=0x00;
  103. // OCR1BH=0x00;
  104. // OCR1BL=0x00;
  105. // 
  106. // // Timer/Counter 2 initialization
  107. // ASSR="0x00";
  108. // TCCR2=0x00;
  109. // TCNT2=0x00;
  110. // OCR2=0x00;
  111. // 
  112. // // External Interrupt(s) initialization
  113. // GICR|=0x40;
  114. // MCUCR="0x03";
  115. // MCUCSR="0x00";
  116. // GIFR="0x40";     //通过写1来清0
  117. // // Timer(s)/Counter(s) Interrupt(s) initialization
  118. // TIMSK="0x02";
  119. // 
  120. // // Analog Comparator initialization
  121. // ACSR="0x80";
  122. // SFIOR="0x00";
  123. // ss_r=1; 
  124. // //PORTB.1=1;
  125. // key_init(); //键盘初始化
  126. // #asm("sei")   // 开放全局中断
  127. //  
  128. // while (1)
  129. //       {
  130.       // Place your code here 
  131. //***********************键盘处理*******************************//
  132. //        
  133. // if (key_stime_ok)    10ms到,键处理
  134. //           {
  135. //      key_stime_ok = 0;
  136. //               switch (read_key())  调用按键接口程序   
  137. //        { 
  138. //        case 1:
  139. //    { 
  140. //     ss_r=0;  在接收数据时要先拉低
  141. //     PORTA="spiread"();
  142. //     ss_r=1;
  143. //    clk_r=1; 
  144. //            }  break;  
  145. //         case 2: 
  146. //            { 
  147. //            ss_s=0;
  148. //     spisend(0x80);
  149. //     ss_s=1;
  150. //            }break;
  151. //         case 3:
  152. //         { 
  153. //           ss_s=0;
  154. //     spisend(0x00);
  155. //     ss_s=1;
  156. //            }
  157. //            break;
  158. //        case 4: 
  159. //        {  
  160. //          }
  161. //          break;
  162. //          }
  163. // }end keyproc 
  164. //  
  165. // }end while
  166. // }
posted @ 2013-03-17 17:10  天涯海角路  阅读(608)  评论(0)    收藏  举报