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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? spi_drv.c

?? 51的SPI程序源代碼
?? C
字號(hào):
/*C**************************************************************************
* NAME:         spi_drv.c
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      cc03-demo-spi-0_0_1      
* REVISION:     1.1.1.1     
*----------------------------------------------------------------------------
* PURPOSE: 
* spi library low level functions (init, receive and send functions)                                               
* and global variables declarations to use with user software application
*****************************************************************************/



/*_____ I N C L U D E S ____________________________________________________*/
#include "config.h"
#include "spi_drv.h"

/*_____ M A C R O S ________________________________________________________*/

/*_____ D E F I N I T I O N ________________________________________________*/

/*_____ D E C L A R A T I O N ______________________________________________*/

// Here are some global flags to use with spi library
// These global flags arec used to communicate with higher level functions ( user application )
volatile bit b_spi_error;				// General pupose error flag
volatile bit b_spi_transmit_completed;	// for interrupt transmition use ( set when completed )
volatile bit b_spi_busy;				// set when spi interface is in use

// Here the globals variables to communicate with spi interrupt routine
volatile unsigned char *spi_string_ptr;	// pointer to data buffer
volatile unsigned char spi_nb_data;		// number of data



/*F**************************************************************************
* NAME: spi_master_init 
*----------------------------------------------------------------------------
* PARAMS:
* cpol: bit CPOL value
* cpha: bit CPHA value
* ssdis: bit SSDIS value
* speed: Uchar spi speed ratio transmission Vs Fper 
* return:   none
*----------------------------------------------------------------------------
* PURPOSE: 
* Initialize the spi module in master mode
*----------------------------------------------------------------------------
* EXAMPLE:
* spi_master_init(0,1,1,4); // init spi in mater mode with CPOL=0, CPHA=1, 
*                           // SSDIS=1 and bitrate=Fper/4 
*----------------------------------------------------------------------------
* NOTE:
*****************************************************************************/
void spi_master_init(bit cpol, bit cpha, bit ssdis,Uchar speed)
{
	b_spi_busy=0;
	b_spi_error=0;
	b_spi_transmit_completed=0;
	SPCON = 0;
	SPCON |= MSK_SPCON_MSTR;
	spi_set_speed(speed);
	if (cpol) SPCON |= MSK_SPCON_CPOL;
	if (cpha) SPCON |= MSK_SPCON_CPHA;
	if (ssdis) 	SPCON |= MSK_SPCON_SSDIS;
	SPCON |= MSK_SPCON_SPEN;
}

/*F**************************************************************************
* NAME: spi_slave_init 
*----------------------------------------------------------------------------
* PARAMS:
* cpol: bit CPOL value
* cpha: bit CPHA value
* ssdis: bit SSDIS value
* return:   none
*----------------------------------------------------------------------------
* PURPOSE: 
* Initialize the spi module in slave mode
*----------------------------------------------------------------------------
* EXAMPLE:
* spi_master_init(0,1,1); // init spi in mater mode with CPOL=0, CPHA=1, SSDIS=1
*----------------------------------------------------------------------------
* NOTE:
*****************************************************************************/
void spi_slave_init(bit cpol, bit cpha, bit ssdis)
{
	b_spi_busy=0;
	b_spi_error=0;
	b_spi_transmit_completed=0;
	SPCON = 0;
	if (cpol) SPCON |= MSK_SPCON_CPOL;
	if (cpha) SPCON |= MSK_SPCON_CPHA;
	if (ssdis) 	SPCON |= MSK_SPCON_SSDIS;
	SPCON |= MSK_SPCON_SPEN;
}

/*F**************************************************************************
* NAME: spi_transmit_byte
*----------------------------------------------------------------------------
* PARAMS:  tx_data: byte to send
* return:  byte received 
*----------------------------------------------------------------------------
* PURPOSE: 
* Send and receive a byte with spi interface 
*----------------------------------------------------------------------------
* NOTE: 
* If a current spi transfert is on going, the function performs an active wait polling on spi event.
* This function can be used both in slave and master mode
*****************************************************************************/
unsigned char spi_transmit_byte(unsigned char tx_data)
{
	unsigned char rx_data;

	if ( b_spi_busy )				// If current transfert is on going
	{
		while(!Spif_set()); 	//Wait end of current transfert
		rx_data=SPDAT;
	}
	SPDAT=tx_data;
	b_spi_busy=1;
	return	rx_data;
}


/*F**************************************************************************
* NAME: spi_get_data
*----------------------------------------------------------------------------
* PARAMS: none
* return: byte received 
*----------------------------------------------------------------------------
* PURPOSE: 
* Return the content of the spi data register 
*----------------------------------------------------------------------------
* NOTE: 
* This function performs an active wait polling
*****************************************************************************/
unsigned char spi_get_data()
{
	unsigned char to_return;
	while(!Spif_set()); //Wait end of current transfert
	to_return=SPDAT;		
	b_spi_busy=0;						// Release spi ressouce 
	return to_return;

}



/*F**************************************************************************
* NAME: spi_put_data
*----------------------------------------------------------------------------
* PARAMS: to_transmit: data to send
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
* Send a data byte to the spi interface
*----------------------------------------------------------------------------
* NOTE: 
* This function should be use in spi slave mode to load spi data register
* with the next data to be transmited in slave mode
*****************************************************************************/
void spi_put_data( unsigned char to_transmit)
{
	SPDAT=to_transmit;

}



/*F**************************************************************************
* NAME: spi_transmit_burst_polling
*----------------------------------------------------------------------------
* PARAMS: *ptr_buf: data to send
* nb_data: number of data to send
* return: none 
*----------------------------------------------------------------------------
* PURPOSE:
* Transmit a data string throught the spi interface in polling mode 
*----------------------------------------------------------------------------
* NOTE: 
* This function performs an active wait polling
*****************************************************************************/
void spi_transmit_burst_polling( unsigned char  *ptr_buf, unsigned char nb_data)
{
unsigned char received;
  while (nb_data != 0)
  {

		while(Spte_set())     // Wait for transmit buffer free
		{
	   	SPDAT = *ptr_buf;	
 	   	received = SPDAT;
    	*ptr_buf = received;
    	ptr_buf++;
    	nb_data--;
		}
  }
}


/*F**************************************************************************
* NAME: spi_set_speed
*----------------------------------------------------------------------------
* PARAMS: ratio: spi clock ratio/XTAL  
* return: bit: status  
*----------------------------------------------------------------------------
* PURPOSE: 
* Configure the baud rate of the spi, set CR2, CR1, CR0
*----------------------------------------------------------------------------
* NOTE: 
* This function is use only in spi master mode
*****************************************************************************/
bit spi_set_speed (unsigned char ratio)
{
switch ( ratio )
	{
	case 2:
		SPCON |= SPI_RATIO_2;
		return	TRUE;
	break;

	case 4:
		SPCON |= SPI_RATIO_4;
		return	TRUE;
	break;

	case 8:
		SPCON |= SPI_RATIO_8;
		return	TRUE;
	break;

	case 16:
		SPCON |= SPI_RATIO_16;
		return	TRUE;
	break;

	case 32:
		SPCON |= SPI_RATIO_32;
		return	TRUE;
	break;

	case 64:
		SPCON |= SPI_RATIO_64;
		return	TRUE;
	break;

	case 128:
		SPCON |= SPI_RATIO_128;
		return	TRUE;
	break;

	default :
		return	FALSE;
	break;
	}
}

/*F**************************************************************************
* NAME: spi_transmit_burst_it
*----------------------------------------------------------------------------
* PARAMS:  
* *string_ptr: the string which must be send
* data_nb: number of data to send
* return: bit
*----------------------------------------------------------------------------
* PURPOSE: 
* Initialize an spi tranfert in interrupt mode
* Works in interrupt mode
* If a current transfert is on going, the function returns '0'
*----------------------------------------------------------------------------
* NOTE: 
* This function can be used in slave or master mode
*****************************************************************************/
bit spi_transmit_burst_it (Uchar *string_ptr, Uchar data_nb)
{
	if ( ~b_spi_busy )
	{
		b_spi_busy=1;
		b_spi_transmit_completed=0;
		b_spi_error=0;
		spi_string_ptr = string_ptr;
	  spi_nb_data = data_nb;
		SPDAT=*spi_string_ptr;
		return 1;
	}
	else	//current transfert on going
	{
		return 0;
	}
}


/*F**************************************************************************
* NAME: spi_interrupt
*----------------------------------------------------------------------------
* PARAMS:  
* *spi_string_ptr: the string which must be send
* spi_nb_data: number of data to send
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
* spi - interruption program for serial transmission ( Master and Slave mode )
*----------------------------------------------------------------------------
* NOTE:
*****************************************************************************/
void spi_interrupt(void) interrupt IRQ_SPI
{
	if(Spif_set())
	{
		*spi_string_ptr=SPDAT;
		spi_nb_data--;
		if (spi_nb_data!=0)
		{
			spi_string_ptr++;
			SPDAT=*spi_string_ptr;
		}
		else
		{
			b_spi_busy=0;
			b_spi_transmit_completed=1;
		}
	}

}

  

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一个色在线综合| 99久久er热在这里只有精品66| 成人av片在线观看| 国产人妖乱国产精品人妖| a级高清视频欧美日韩| 亚洲乱码一区二区三区在线观看| 不卡电影免费在线播放一区| 秋霞电影一区二区| 日本一区二区三区久久久久久久久不 | 在线成人免费观看| 麻豆精品视频在线观看视频| 99精品偷自拍| 日韩欧美高清dvd碟片| 成人黄色大片在线观看| 国产精品看片你懂得 | 性久久久久久久| 亚洲精品一区二区三区在线观看| 欧美视频中文字幕| 免费在线看一区| 国产欧美日韩一区二区三区在线观看 | 综合电影一区二区三区 | 日韩亚洲欧美一区二区三区| 国产**成人网毛片九色| 一区二区三区国产精品| 久久综合给合久久狠狠狠97色69| 成人不卡免费av| 国精产品一区一区三区mba桃花 | 久久精品这里都是精品| 97se亚洲国产综合自在线| 偷拍亚洲欧洲综合| 国产精品美女久久久久久久久久久| 91色视频在线| 国产一区二区三区黄视频| 亚洲电影视频在线| 欧美国产精品一区二区| 日韩欧美激情四射| 色婷婷综合久久久中文一区二区| 精品一区二区三区的国产在线播放| 自拍偷自拍亚洲精品播放| 精品国精品国产尤物美女| 777色狠狠一区二区三区| 欧美理论片在线| 在线播放中文一区| 国产校园另类小说区| 欧美乱妇23p| 欧美疯狂做受xxxx富婆| 日韩亚洲电影在线| 欧美精品一区男女天堂| 日韩精品最新网址| 日韩欧美精品在线| 国产夜色精品一区二区av| 久久精品视频在线免费观看| 国产亚洲综合在线| 国产精品久久久久久一区二区三区| 久久精品水蜜桃av综合天堂| 国产亚洲污的网站| 1000部国产精品成人观看| 一区二区三区在线视频播放 | 在线不卡中文字幕播放| 日韩免费高清av| 国产精品久久久久aaaa| 亚洲精品成人a在线观看| 五月天中文字幕一区二区| 日韩av一区二区在线影视| 国内成人免费视频| 欧美麻豆精品久久久久久| 欧美哺乳videos| 亚洲精品日产精品乱码不卡| 欧美aaa在线| 色88888久久久久久影院按摩| 91香蕉视频在线| 日韩一区二区三区在线观看| 精品99999| 亚洲二区在线视频| 大尺度一区二区| 日韩午夜三级在线| 亚洲一卡二卡三卡四卡五卡| 国产精品123区| 欧美大度的电影原声| 亚洲午夜国产一区99re久久| 成人一区二区在线观看| 欧美成人乱码一区二区三区| 亚洲视频你懂的| 高清久久久久久| 国产蜜臀97一区二区三区| 麻豆国产精品官网| 欧美群妇大交群中文字幕| 亚洲日本一区二区三区| 国产白丝精品91爽爽久久| 欧美一区二区三区四区在线观看| 亚洲制服欧美中文字幕中文字幕| 色诱视频网站一区| 亚洲欧美日韩精品久久久久| 国产成人一区二区精品非洲| 久久精品夜色噜噜亚洲aⅴ| 激情欧美一区二区| 精品国产自在久精品国产| 奇米影视一区二区三区小说| 欧美一区二区精品在线| 日韩精品91亚洲二区在线观看| 欧美日韩中文国产| 亚洲国产日韩一级| 欧美精品在线观看一区二区| 日韩专区一卡二卡| 日韩欧美综合一区| 懂色av一区二区三区蜜臀| 国产精品乱码一区二三区小蝌蚪| 成人小视频在线| 一区二区三区在线观看国产| 欧美日本一区二区在线观看| 精品综合久久久久久8888| 日本一区二区三区四区在线视频| 欧美欧美欧美欧美首页| 亚洲一区二区欧美| 欧美v日韩v国产v| 日韩一区二区三区免费看| 国产在线播放一区三区四| 国产精品情趣视频| 777欧美精品| 91网上在线视频| 日本sm残虐另类| 亚洲免费在线视频一区 二区| 9191精品国产综合久久久久久| 国产精品一区二区久久不卡| 亚洲免费高清视频在线| 精品国产人成亚洲区| 日本韩国欧美一区| 国产成人h网站| 91国偷自产一区二区使用方法| 久久国产三级精品| 亚洲午夜私人影院| 久久久综合九色合综国产精品| 欧美肥妇毛茸茸| 欧美偷拍一区二区| 6080yy午夜一二三区久久| jvid福利写真一区二区三区| 激情欧美日韩一区二区| 五月天国产精品| 亚洲二区在线观看| 天堂成人国产精品一区| 午夜精品久久久久久久99樱桃| 日韩理论在线观看| 亚洲男帅同性gay1069| 亚洲欧美色图小说| 亚洲男人的天堂av| 亚洲综合一二三区| 亚洲国产乱码最新视频| 亚洲成人av电影| 人人爽香蕉精品| 精品无人区卡一卡二卡三乱码免费卡| 午夜激情综合网| 麻豆免费精品视频| 国产九色精品成人porny | 成人av电影在线播放| 欧美午夜影院一区| 日本韩国欧美在线| 欧美高清hd18日本| 久久精品视频免费观看| 国产精品久久久久久久久免费丝袜 | 欧洲色大大久久| 制服丝袜中文字幕亚洲| 精品99一区二区| 一区二区三区欧美日韩| 久久狠狠亚洲综合| gogo大胆日本视频一区| 欧美电影影音先锋| 亚洲国产成人午夜在线一区| 亚洲在线成人精品| 国产精品一二二区| 欧美色图片你懂的| 久久精品一区二区三区四区| 国产一区二区三区精品视频| 国产成人免费av在线| 7777精品久久久大香线蕉| 中文字幕第一区第二区| 美国十次了思思久久精品导航| 91美女蜜桃在线| 国产三级欧美三级日产三级99| 午夜免费欧美电影| 99re在线精品| 国产欧美日韩一区二区三区在线观看 | 日韩三级高清在线| 亚洲一区在线视频| 99久久精品费精品国产一区二区| 久久久久国色av免费看影院| 性欧美疯狂xxxxbbbb| 在线看国产一区二区| 亚洲天堂a在线| 日本韩国精品在线| 樱花草国产18久久久久| 一本色道久久综合亚洲aⅴ蜜桃| 久久精品一二三| 成人在线视频首页| 亚洲日本在线天堂| 欧美性淫爽ww久久久久无| 亚洲一二三区不卡| 欧美福利视频一区| 狠狠色狠狠色综合系列| 国产情人综合久久777777| 国产91丝袜在线播放0|