亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spi.c

?? AVR控制SD卡或MMC卡的程序 調試通過
?? C
字號:
/*********************************************************************************************************
**				          			       SPI 驅動程序
**                                  (c) Copyright 2006-2008, limaokui
**                                           All Rights Reserved
**
**                                             V1.0.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名:SPI.c
**創   建   人: 李茂奎
**最后修改日期:  2006年9月2日
**描        述:  SPI驅動程序
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 李茂奎
** 版  本: V1.00
** 日 期: 2006年9月2日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 李茂奎
** 版  本:
** 日 期:
** 描 述: 
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人:    李茂奎																					  
** 日 期:	 2006年9月2日
** 描 述:   
**
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
/*
ATmega128的SPI采用硬件方式實現面向字節的全雙工3線同步通信,
支持主機、從機和2種不同極性的SPI時序,通信速率有7種選擇,
主機方式的最高速率為1/2系統時鐘,從機方式最高速率為1/4系統時鐘。

AVR的SPI由一個16位的循環移位寄存器構成,當數據從主機方移出時,從機的數據同時也被移入,
因此SPI的發送和接收在一個中斷服務中完成。
在SPI中斷服務程序中,先從SPDR中讀一個接收的字節存入接收數據緩沖器中,再從發送數據緩沖
器取出一個字節寫入SPDR中,由SPI發送到從機。
數據一旦寫入SPDR,ISP硬件開始發送數據。
下一次ISP中斷時,表示發送完成,并同時收到一個數據。
SPI為硬件接口和傳輸完成中斷申請,所以使用SPI傳輸數據的有效方法是采用中斷方式+數據緩存器的設計方法。

在對SPI初始化時,應注意以下幾點: 
.正確選擇和設置主機或從機,以及工作模式(極性),數據傳輸率; 
.注意傳送字節的順序,是低位優先(LSB First)還是高位優先(MSB Frist); 
.正確設置MOSI和MISO接口的輸入輸出方向,輸入引腳使用上拉電阻,可以節省總線上的吊高電阻。 


*/
#include "config.h"

static uint8 Spi_Receive_Data[SPI_RECEIVE_DATA_BUFFER_SIZE];
static uint8 Spi_Send_Data[SPI_SEND_DATA_BUFFER_SIZE];
CirQueue Spi_Receive_Buffer={0,0,0,Spi_Receive_Data,SPI_RECEIVE_DATA_BUFFER_SIZE,0,0,0};
CirQueue Spi_Send_Buffer={0,0,0,Spi_Send_Data,SPI_SEND_DATA_BUFFER_SIZE,0,0,0};

#pragma interrupt_handler spi_stc_isr:iv_SPI_STC 
void spi_stc_isr(void) 
{ 
   if(Spi_Receive_Buffer.status==SPI_DATA_RECEIVE)
       EnQueue(&Spi_Receive_Buffer,SPDR); //從SPI口讀出收到的字節 
   if (Spi_Send_Buffer.status==SPI_DATA_SEND) 
    { 
      if(!EmptyQueue(&Spi_Send_Buffer))//如果發送緩沖區中有待發的數據 
	      {
		  SPDR = DeQueue(&Spi_Send_Buffer); //發送一個字節數據,并調整指針
		  }
	  else 
	      {
		  Spi_Send_Buffer.status=SPI_DATA_FREE;
		  }
    } 
} 



uint8 Spi_Get_Char(void) 
{ 
  uint8 data;
  while (EmptyQueue(&Spi_Receive_Buffer)); //無接收數據,等待 
  data = DeQueue(&Spi_Receive_Buffer); //從接收緩沖區取出一個SPI收到的數據 
  return data; 
} 

void Spi_Put_Char(uint8 c) 
{ 
  while (FullQueue(&Spi_Send_Buffer));//發送緩沖區滿,等待 
  if (Spi_Send_Buffer.count)//發送緩沖區已中有待發數據 
    { //或SPI正在發送數據時 
	  EnQueue(&Spi_Send_Buffer,c);//將數據放入發送緩沖區排隊 
    } 
  else 
    SPDR = c; //發送緩沖區中空且SPI口空閑,直接放入SPDR由SIP口發送 
} 


uint8 Spi_Receive(uint8 *buffer,uint16 length)
{
uint16 i;
Spi_Receive_Buffer.status=SPI_DATA_RECEIVE;
for(i=0;i<length;i++)
 {
 *buffer++=Spi_Get_Char();
 }
Spi_Receive_Buffer.status=SPI_DATA_FREE;
return i;
}

uint8 Spi_Send(uint8 *buffer,uint16 length)
{
uint16 i;
Spi_Send_Buffer.status=SPI_DATA_SEND;
for(i=0;i<length;i++)
 {
 Spi_Put_Char(*buffer++); 
 }
Spi_Send_Buffer.status=SPI_DATA_FREE;
return i;
}

uint8 Spi_SendReceive(uint8 *buffer,uint16 sendlength,uint16 receivelength)
{
uint16 i;
uint8 *ptr;
ptr=buffer;
if (receivelength!=0)
    {
	Spi_Receive_Buffer.status=SPI_DATA_RECEIVE;
	}
Spi_Send_Buffer.status=SPI_DATA_SEND;
for(i=0;i<sendlength;i++)
 {
 Spi_Put_Char(*ptr++); 
 }
ptr=buffer;
for(i=0;(i<receivelength)&&(i<sendlength);i++)
 {
 *ptr++=Spi_Get_Char();
 }
Spi_Send_Buffer.status=SPI_DATA_FREE;
Spi_Receive_Buffer.status=SPI_DATA_FREE;
return i;
}


void Spi_Init(void) 
{ 
  uint8 temp;

#if (CPU_TYPE == M32)|| (CPU_TYPE == M16)      //   MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4 
  #define DDR_SPI  DDRB
  #define PORT_SPI PORTB
  #define DD_MOSI  5
  #define DD_MISO  6
  #define DD_SCK   7
  #define DD_SS    4
#endif
#if CPU_TYPE == M8       //   MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4 
  #define DDR_SPI  DDRB
  #define PORT_SPI PORTB
  #define DD_MOSI  3
  #define DD_MISO  4
  #define DD_SCK   5
  #define DD_SS    2
#endif
#if (CPU_TYPE == M128)||(CPU_TYPE == M64 )      //   MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4 
  #define DDR_SPI  DDRB
  #define PORT_SPI PORTB
  #define DD_MOSI  2
  #define DD_MISO  3
  #define DD_SCK   1
  #define DD_SS    0
#endif
  DDR_SPI = DDR_SPI|(1<<DD_SS)|(1<<DD_MOSI)|(1<<DD_SCK); //MISO=input and MOSI,SCK,SS = output
  PORTB |=(1<<DD_MISO)|(1<<DD_SS); //MISO上拉電阻有效 
  SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR);  //SPI允許,4X 主機模式,MSB先發,SPI模式0 (CPOL CPHA 00(0) 01(1) 10(2) 11(3)) 
//  SPSR = 0; 
  SPSR = (1<<SPI2X); //enable spi2x
  temp = SPSR; 
  temp = SPDR; //清空SPI,和中斷標志,使SPI空閑 
} 

/*
void main(void) 
{ 
  uint8 I; 
  CLI(); //關中斷 
  spi_init(); //初始化SPI接口 
  SEI(); //開中斷 
  while() 
    { 
      putSPIchat(i); //發送一個字節 
      i++; 
      Spi_Get_Char(); //接收一個字節(第一個字節為空字節) 
    } 
} 
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩激情一区二区| 不卡的av中国片| 一区二区三区精品视频| 国产精品国产三级国产有无不卡 | 一本色道久久综合精品竹菊| 国产美女视频一区| 国产精品白丝jk黑袜喷水| 精品亚洲aⅴ乱码一区二区三区| 久久福利资源站| 国产麻豆成人传媒免费观看| 国产成人免费在线视频| 成人av集中营| 欧美在线高清视频| 欧美猛男男办公室激情| 在线成人小视频| 欧美精品一区二区在线播放| 久久综合久色欧美综合狠狠| 亚洲国产精品高清| 一区二区三区在线免费视频 | 午夜一区二区三区在线观看| 亚洲成av人片一区二区三区| 奇米综合一区二区三区精品视频| 亚洲v日本v欧美v久久精品| 秋霞午夜av一区二区三区| 国产激情一区二区三区四区 | 国产精品免费免费| 一区二区欧美国产| 久久精品国产精品青草| 国产成人亚洲综合色影视| 色综合久久久久久久| 正在播放一区二区| 国产欧美一区二区三区在线看蜜臀 | 亚洲欧美另类小说| 日韩精品乱码免费| 不卡的av在线| 6080午夜不卡| 中文字幕在线一区| 五月婷婷综合网| 不卡电影免费在线播放一区| 精品视频在线免费观看| 国产视频一区在线播放| 亚洲小少妇裸体bbw| 蜜臀av一区二区| 色婷婷久久久久swag精品 | 韩国av一区二区三区四区| 91伊人久久大香线蕉| 欧美成人福利视频| 亚洲午夜久久久| av电影在线观看一区| 欧美xxxxxxxx| 五月天激情小说综合| 99久久精品99国产精品| 国产日韩欧美综合在线| 麻豆成人免费电影| 欧美精选午夜久久久乱码6080| 国产精品福利在线播放| 蜜臀精品一区二区三区在线观看| 色老汉av一区二区三区| 中文字幕第一区第二区| 久久99日本精品| 3d动漫精品啪啪一区二区竹菊| 夜夜精品视频一区二区| av不卡免费在线观看| 国产精品美女久久久久av爽李琼| 狠狠久久亚洲欧美| 日韩写真欧美这视频| 青青国产91久久久久久| 777午夜精品免费视频| 亚洲电影一区二区| 欧美亚洲一区三区| 一区二区三区欧美在线观看| 91麻豆文化传媒在线观看| 中文字幕亚洲视频| 成人高清视频在线观看| 成人免费一区二区三区视频| 99久久久精品免费观看国产蜜| 亚洲国产精品激情在线观看| 成人伦理片在线| 综合在线观看色| 91亚洲国产成人精品一区二三| 亚洲人成网站色在线观看| 97成人超碰视| 亚洲一区二区偷拍精品| 欧美日韩mp4| 久久国产乱子精品免费女| 欧美成人aa大片| 国产aⅴ综合色| 成人欧美一区二区三区黑人麻豆 | 国模套图日韩精品一区二区| 久久综合99re88久久爱| 国产成人免费网站| 亚洲欧洲制服丝袜| 欧美疯狂性受xxxxx喷水图片| 另类小说色综合网站| 国产欧美精品一区二区三区四区| eeuss鲁片一区二区三区在线观看| 亚洲人123区| 91精品国产高清一区二区三区蜜臀| 久久精品二区亚洲w码| 欧美国产日韩一二三区| 色嗨嗨av一区二区三区| 日韩av电影天堂| 国产精品系列在线| 欧美久久免费观看| 国产黄色精品视频| 一区二区三区国产| 精品对白一区国产伦| 成人99免费视频| 免费在线欧美视频| 亚洲欧洲av在线| 精品三级在线看| 色综合久久久久综合体桃花网| 美腿丝袜亚洲一区| 国产精品国产精品国产专区不片| 欧美日韩成人在线| 成人福利视频在线| 美女网站一区二区| 一区二区三区四区高清精品免费观看| 69堂国产成人免费视频| 91在线精品一区二区| 麻豆精品在线看| 一区二区三区精品视频在线| 久久久亚洲欧洲日产国码αv| 在线观看日韩电影| 成年人国产精品| 国产乱码精品一区二区三区忘忧草 | 97国产精品videossex| 激情深爱一区二区| 视频一区视频二区中文| 国产精品麻豆欧美日韩ww| 欧美一个色资源| 欧美视频一区二区三区在线观看 | 亚洲福利视频三区| 亚洲人成网站色在线观看 | 成人精品一区二区三区四区| 婷婷一区二区三区| 一区二区三区四区高清精品免费观看 | 99久久国产综合精品麻豆 | 中文字幕国产一区| 26uuuu精品一区二区| 91精品国产综合久久香蕉的特点| 99国内精品久久| eeuss鲁一区二区三区| 成人av中文字幕| 丁香婷婷综合网| 成人黄色777网| 国产91综合网| 国产福利一区二区三区视频| 久久99精品久久久| 人人超碰91尤物精品国产| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品久久7777| 亚洲在线免费播放| 亚洲一区二区三区精品在线| 一区二区免费在线| 午夜精品视频一区| 日本欧美一区二区| 久久99久久99| 国产精品一区一区| 成人国产精品免费观看动漫| 99麻豆久久久国产精品免费优播| a美女胸又www黄视频久久| 99re8在线精品视频免费播放| 91网上在线视频| 7777精品伊人久久久大香线蕉经典版下载 | 国产盗摄女厕一区二区三区| 国产电影一区在线| 99精品一区二区| 欧美亚洲动漫制服丝袜| 91精品啪在线观看国产60岁| 精品国产一二三区| 国产精品麻豆一区二区| 一区二区激情视频| 久久超碰97人人做人人爱| 国产成人综合亚洲网站| 一本大道久久a久久综合| 欧美日韩一二三| 久久色在线视频| 一区二区三区在线观看动漫| 蜜臀av性久久久久蜜臀av麻豆| 国产剧情一区二区三区| 成人一区二区视频| 欧美日韩卡一卡二| www国产亚洲精品久久麻豆| 亚洲天堂成人网| 美女视频黄免费的久久 | 美女视频一区二区三区| 成人国产亚洲欧美成人综合网| 欧美色图在线观看| 久久精品欧美日韩精品| 亚洲小少妇裸体bbw| 国产麻豆精品视频| 欧美色图免费看| 久久婷婷久久一区二区三区| 亚洲午夜久久久久久久久电影院| 国产在线视频一区二区三区| 99riav久久精品riav| 欧美成人福利视频| 亚洲成a人v欧美综合天堂下载 | 亚洲国产人成综合网站|