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

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

?? spi_drv.c

?? c51單片機的spi通訊例程序,很好的資料
?? C
字號:
/*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;
		}
	}

}

  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图.com| 国产精品网站在线播放| 亚洲一区二区欧美日韩| 欧美在线制服丝袜| 日韩av一区二区在线影视| 日韩一区二区在线看| 国产麻豆视频一区| 国产精品福利av| 色综合天天综合网天天狠天天| 亚洲精品免费在线| 欧美日韩免费电影| 久久成人羞羞网站| 国产精品久久三| 欧美午夜一区二区三区| 免费在线成人网| 日本一区二区免费在线观看视频 | 91.com在线观看| 老司机午夜精品| 国产精品乱人伦| 在线看日本不卡| 国内精品自线一区二区三区视频| 中文字幕一区二区三区在线不卡 | 欧美美女直播网站| 久久99久久99精品免视看婷婷| 中文幕一区二区三区久久蜜桃| 欧美体内she精高潮| 久久99精品网久久| 亚洲精品成人精品456| 欧美r级在线观看| 一本色道久久综合亚洲91| 日本视频一区二区| 亚洲欧洲色图综合| 91精品久久久久久久99蜜桃| 国产福利一区二区三区视频在线| 一卡二卡欧美日韩| 国产香蕉久久精品综合网| 在线观看日韩毛片| 国产69精品久久久久毛片| 污片在线观看一区二区| 国产精品久久国产精麻豆99网站| 777色狠狠一区二区三区| 国产福利电影一区二区三区| 五月开心婷婷久久| 亚洲蜜臀av乱码久久精品蜜桃| 日韩欧美亚洲国产另类| 91免费在线看| 成人精品一区二区三区中文字幕| 日本强好片久久久久久aaa| 亚洲激情综合网| 久久精品一级爱片| 日韩视频免费直播| 欧美日韩国产bt| 一本到一区二区三区| 豆国产96在线|亚洲| 久久激五月天综合精品| 午夜久久福利影院| 亚洲精品va在线观看| 中文字幕一区在线| 久久久久久亚洲综合影院红桃| 91精品国产欧美一区二区成人| 91麻豆文化传媒在线观看| 成人免费看片app下载| 国产在线精品一区二区| 毛片一区二区三区| 日本不卡视频一二三区| 香蕉成人伊视频在线观看| 亚洲综合免费观看高清在线观看| 国产精品视频九色porn| 欧美激情一区二区三区全黄| 亚洲精品在线观| 精品国产91亚洲一区二区三区婷婷| 欧美日韩国产一区二区三区地区| 日本久久一区二区| 色综合天天狠狠| 91麻豆精品视频| 色综合久久综合网欧美综合网| 91在线观看免费视频| 99国内精品久久| 91网上在线视频| 欧洲国内综合视频| 欧美日本国产视频| 91精品国产一区二区三区| 欧美丰满美乳xxx高潮www| 欧美裸体一区二区三区| 欧美精品 国产精品| 4438x成人网最大色成网站| 91精品综合久久久久久| 精品理论电影在线观看| 久久亚洲一级片| 国产日韩在线不卡| 亚洲免费av在线| 午夜精品福利在线| 麻豆精品在线播放| 国产suv精品一区二区883| www.日韩精品| 欧美无乱码久久久免费午夜一区| 欧美麻豆精品久久久久久| 日韩欧美第一区| 中文在线免费一区三区高中清不卡| 国产精品二区一区二区aⅴ污介绍| 亚洲激情图片一区| 日本不卡一区二区| 国产一区亚洲一区| 91亚洲精华国产精华精华液| 在线免费不卡视频| 欧美精品一区二区不卡| 国产精品网曝门| 亚洲一二三四在线观看| 久久99国产精品久久99果冻传媒| 福利91精品一区二区三区| 在线观看欧美日本| 精品盗摄一区二区三区| 国产精品灌醉下药二区| 婷婷综合另类小说色区| 国产精品系列在线播放| 欧美中文字幕一二三区视频| 日韩精品中文字幕一区二区三区| 国产精品网曝门| 日韩国产精品久久久久久亚洲| 国产福利精品导航| 在线成人高清不卡| 国产精品人成在线观看免费| 亚洲第一激情av| 国产激情视频一区二区三区欧美 | 国产日产欧美精品一区二区三区| 亚洲欧美激情小说另类| 久久精品理论片| 91福利国产成人精品照片| 久久综合五月天婷婷伊人| 亚洲国产日产av| 不卡的av中国片| 2023国产精品自拍| 午夜精品一区二区三区免费视频| 岛国精品一区二区| 欧美电视剧免费全集观看| 亚洲国产精品自拍| av电影天堂一区二区在线观看| 精品国产制服丝袜高跟| 亚洲成人精品一区二区| 色999日韩国产欧美一区二区| 久久精品水蜜桃av综合天堂| 男人的j进女人的j一区| 日本精品一级二级| 国产精品毛片高清在线完整版| 国产一区亚洲一区| 精品国产乱码久久久久久牛牛 | 精久久久久久久久久久| 欧美美女黄视频| 亚洲午夜私人影院| 日本久久电影网| 中文字幕日本不卡| 成人精品免费网站| 久久亚区不卡日本| 久久国产福利国产秒拍| 91精品国产综合久久婷婷香蕉| 亚洲最大色网站| 在线观看免费一区| 亚洲一二三区不卡| 91国偷自产一区二区使用方法| 国产精品理论片在线观看| 粗大黑人巨茎大战欧美成人| 国产亚洲午夜高清国产拍精品 | 精品乱码亚洲一区二区不卡| 日韩成人av影视| 91麻豆精品国产综合久久久久久 | 奇米精品一区二区三区四区| 精品视频免费看| 视频一区二区三区在线| 欧美日韩久久一区二区| 日韩成人一区二区三区在线观看| 欧美日韩精品一区二区三区| 亚洲国产综合人成综合网站| 欧美乱妇23p| 久草中文综合在线| 欧美精品一区二区三区在线| 精品一区二区三区在线播放视频 | 亚洲欧美在线aaa| av一二三不卡影片| 亚洲精品中文字幕在线观看| 一本色道久久综合狠狠躁的推荐| 亚洲色欲色欲www| 91精品1区2区| 美女精品自拍一二三四| 国产三级精品三级| 在线精品视频小说1| 日本亚洲三级在线| 久久精品人人做人人综合| 成人国产精品免费观看| 一区二区三区在线看| 欧美精品在线视频| 精品无人区卡一卡二卡三乱码免费卡| 久久蜜臀中文字幕| 91在线无精精品入口| 天天影视涩香欲综合网| 精品国产乱码久久久久久蜜臀| 99久久综合色| 日本欧美久久久久免费播放网| 国产亚洲福利社区一区| 在线中文字幕一区二区| 久久99国产精品免费网站|