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

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

?? spid.c

?? at91sam9260-ek library file
?? C
字號(hào):
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "spid.h"
#include <board.h>

//------------------------------------------------------------------------------
//         Macros
//------------------------------------------------------------------------------

/// Write PMC register
#define WRITE_PMC(pPmc, regName, value) pPmc->regName = (value)

/// Write SPI register
#define WRITE_SPI(pSpi, regName, value) pSpi->regName = (value)

/// Read SPI registers
#define READ_SPI(pSpi, regName) (pSpi->regName)

//------------------------------------------------------------------------------
//         Exported functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initializes the Spid structure and the corresponding SPI hardware.
/// Always returns 0.
/// \param pSpid  Pointer to a Spid instance.
/// \param pSpiHw  Associated SPI peripheral.
/// \param spiId  SPI peripheral identifier.
//------------------------------------------------------------------------------
unsigned char SPID_Configure(Spid *pSpid, AT91S_SPI *pSpiHw, unsigned char spiId)
{
	// Initialize the SPI structure
	pSpid->pSpiHw = pSpiHw;
	pSpid->spiId  = spiId;
	pSpid->semaphore = 1;
	pSpid->pCurrentCommand = 0;

	// Enable the SPI clock
	WRITE_PMC(AT91C_BASE_PMC, PMC_PCER, (1 << pSpid->spiId));
	
	// Execute a software reset of the SPI
	WRITE_SPI(pSpiHw, SPI_CR, AT91C_SPI_SWRST);

	// Configure SPI in Master Mode with No CS selected !!!
	WRITE_SPI(pSpiHw, SPI_MR, AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS);
	 
	// Disable the PDC transfer	
	WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

	// Enable the SPI
	WRITE_SPI(pSpiHw, SPI_CR, AT91C_SPI_SPIEN);

	// Enable the SPI clock
	WRITE_PMC(AT91C_BASE_PMC, PMC_PCDR, (1 << pSpid->spiId));
	
	return 0;
}

//------------------------------------------------------------------------------
/// Configures the parameters for the device corresponding to the cs.
/// \param pSpid  Pointer to a Spid instance.
/// \param cs  number corresponding to the SPI chip select.
/// \param csr  SPI_CSR value to setup.
//------------------------------------------------------------------------------
void SPID_ConfigureCS(Spid *pSpid, unsigned char cs, unsigned int csr)
{
	AT91S_SPI *pSpiHw = pSpid->pSpiHw;
	WRITE_SPI(pSpiHw, SPI_CSR[cs], csr);
}
	
//------------------------------------------------------------------------------
/// Starts a SPI master transfer. This is a non blocking function. It will
/// return as soon as the transfer is started.
/// Returns 0 if the transfer has been started successfully; otherwise returns
/// SPID_ERROR_LOCK is the driver is in use, or SPID_ERROR if the command is not
/// valid.
/// \param pSpid  Pointer to a Spid instance.
/// \param pCommand Pointer to the SPI command to execute.
//------------------------------------------------------------------------------
unsigned char SPID_SendCommand(Spid *pSpid, SpidCmd *pCommand)
{
	AT91S_SPI *pSpiHw = pSpid->pSpiHw;
 	unsigned int spiMr;
 		
 	// Try to get the dataflash semaphore
 	if (pSpid->semaphore == 0) {
    
 		return SPID_ERROR_LOCK;
    }
 	pSpid->semaphore--;

	// Enable the SPI clock
	WRITE_PMC(AT91C_BASE_PMC, PMC_PCER, (1 << pSpid->spiId));
	
	// Enable transmitter and receiver
	WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

 	// Write to the MR register
 	spiMr = READ_SPI(pSpiHw, SPI_MR);
 	spiMr |= AT91C_SPI_PCS;
 	spiMr &= ~((1 << pCommand->spiCs) << 16);
	WRITE_SPI(pSpiHw, SPI_MR, spiMr);
    	
	// Initialize the two SPI PDC buffer
	WRITE_SPI(pSpiHw, SPI_RPR, (int) pCommand->pCmd);
	WRITE_SPI(pSpiHw, SPI_RCR, pCommand->cmdSize);
	WRITE_SPI(pSpiHw, SPI_TPR, (int) pCommand->pCmd);
	WRITE_SPI(pSpiHw, SPI_TCR, pCommand->cmdSize);
	
	WRITE_SPI(pSpiHw, SPI_RNPR, (int) pCommand->pData);
	WRITE_SPI(pSpiHw, SPI_RNCR, pCommand->dataSize);
	WRITE_SPI(pSpiHw, SPI_TNPR, (int) pCommand->pData);
	WRITE_SPI(pSpiHw, SPI_TNCR, pCommand->dataSize);

	// Initialize the callback
	pSpid->pCurrentCommand = pCommand;
	
	// Enable transmitter and receiver
	WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTEN | AT91C_PDC_TXTEN);

	// Enable buffer complete interrupt
	WRITE_SPI(pSpiHw, SPI_IER, AT91C_SPI_RXBUFF);
	
	return 0;	
}

//------------------------------------------------------------------------------
/// The SPI_Handler must be called by the SPI Interrupt Service Routine with the
/// corresponding Spi instance.
/// The SPI_Handler will unlock the Spi semaphore and invoke the upper application 
/// callback.
/// \param pSpid  Pointer to a Spid instance.
//------------------------------------------------------------------------------
void SPID_Handler(Spid *pSpid)
{
	SpidCmd *pSpidCmd = pSpid->pCurrentCommand;
	AT91S_SPI *pSpiHw = pSpid->pSpiHw;
	volatile unsigned int spiSr;
	
	// Read the status register
	spiSr = READ_SPI(pSpiHw, SPI_SR);	
	if (spiSr & AT91C_SPI_RXBUFF) {

		// Disable transmitter and receiver
		WRITE_SPI(pSpiHw, SPI_PTCR, AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS);

		// Disable the SPI clock
		WRITE_PMC(AT91C_BASE_PMC, PMC_PCDR, (1 << pSpid->spiId));

		// Disable buffer complete interrupt
		WRITE_SPI(pSpiHw, SPI_IDR, AT91C_SPI_RXBUFF);

		// Release the dataflash semaphore
		pSpid->semaphore++;
			
		// Invoke the callback associated with the current command
		if (pSpidCmd && pSpidCmd->callback) {
        
			pSpidCmd->callback(0, pSpidCmd->pArgument);
        }
			
		// Nothing must be done after. A new DF operation may have been started
		// in the callback function.
	}
}

//------------------------------------------------------------------------------
/// Returns 1 if the SPI driver is currently busy executing a command; otherwise
/// returns 0.
/// \param pSpid  Pointer to a SPI driver instance.
//------------------------------------------------------------------------------
unsigned char SPID_IsBusy(const Spid *pSpid)
{
    if (pSpid->semaphore == 0) {

        return 1;
    }
    else {

        return 0;
    }
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色倩网站大全免费| 国产精品蜜臀av| 91女神在线视频| 色就色 综合激情| 欧美区视频在线观看| 日韩欧美久久一区| 日韩情涩欧美日韩视频| 国精产品一区一区三区mba视频 | 久久99精品视频| 奇米四色…亚洲| bt7086福利一区国产| 91免费在线视频观看| 欧美成人精品3d动漫h| 中文字幕在线不卡一区| 日本亚洲天堂网| 2024国产精品| 久久精品国产99国产精品| 91农村精品一区二区在线| 精品少妇一区二区| 香蕉久久一区二区不卡无毒影院 | 国产精品欧美极品| 激情综合五月天| 精品视频123区在线观看| 综合欧美亚洲日本| 国产成a人无v码亚洲福利| 日韩三级视频中文字幕| 婷婷开心激情综合| 欧美日韩日日摸| 五月激情综合网| 91精品国产免费| 日韩av中文字幕一区二区三区| 欧美日韩你懂得| 蜜臀av在线播放一区二区三区| 国产丝袜欧美中文另类| 风间由美一区二区三区在线观看| 久久久综合视频| 经典一区二区三区| 中文字幕 久热精品 视频在线 | 日韩一卡二卡三卡国产欧美| 喷水一区二区三区| 精品日韩在线一区| 国产黑丝在线一区二区三区| 国产精品久久久久天堂| 欧美系列一区二区| 精品在线免费观看| 亚洲欧美日韩国产手机在线| 欧美性生活大片视频| 久久99精品久久久久久国产越南| 国产欧美日韩三区| 欧美色爱综合网| 国产一区欧美一区| 亚洲欧美综合网| 欧美一区二区三区视频在线观看| 国产福利电影一区二区三区| 亚洲一卡二卡三卡四卡五卡| 国产免费久久精品| 日韩欧美一卡二卡| 色综合激情五月| 成人精品鲁一区一区二区| 亚洲午夜久久久久久久久久久| 国产成人自拍网| 亚洲国产岛国毛片在线| 5月丁香婷婷综合| 91亚洲精品久久久蜜桃网站 | 欧美精品vⅰdeose4hd| 国产福利电影一区二区三区| 男男gaygay亚洲| 一区二区在线免费| 亚洲欧美激情插| 亚洲同性gay激情无套| 久久精品视频在线免费观看 | 久久99精品国产91久久来源| 肉色丝袜一区二区| 人禽交欧美网站| 蜜臀av一区二区在线观看| 国产成a人无v码亚洲福利| 日韩不卡免费视频| 日韩1区2区3区| 免费观看在线色综合| 午夜免费久久看| av在线不卡电影| 6080国产精品一区二区| 97精品国产露脸对白| 国产亚洲一本大道中文在线| 一区二区三区不卡在线观看| 国产aⅴ综合色| 26uuu国产日韩综合| 久久精品国产**网站演员| 欧美亚洲动漫另类| 亚洲免费观看高清完整版在线观看熊 | 亚洲图片欧美色图| 在线精品视频一区二区| 亚洲欧美aⅴ...| 色综合 综合色| 亚洲高清免费视频| 欧美午夜精品一区二区三区| 一区二区激情小说| 欧美视频一区二区三区| 午夜国产不卡在线观看视频| 欧美日韩成人综合天天影院| 视频一区欧美精品| 久久影音资源网| 成人激情开心网| 亚洲欧美区自拍先锋| 在线看不卡av| 久久99精品国产麻豆婷婷洗澡| 久久夜色精品国产噜噜av| 国产a精品视频| 一区二区久久久| 久久综合九色欧美综合狠狠 | 韩国精品免费视频| 国产精品久久久久一区二区三区 | 久久亚洲精品小早川怜子| 国产成人综合亚洲91猫咪| 一区二区三区精密机械公司| 欧美色图一区二区三区| 国模冰冰炮一区二区| 一区二区三区四区精品在线视频 | 一本到高清视频免费精品| 蜜桃久久久久久久| 自拍偷拍国产亚洲| 日韩欧美高清一区| 欧美日韩国产系列| 色婷婷亚洲综合| 国产成a人亚洲精品| 美女脱光内衣内裤视频久久影院| 国产精品二三区| 久久夜色精品国产欧美乱极品| 欧美羞羞免费网站| 色av成人天堂桃色av| 成人综合日日夜夜| 狠狠v欧美v日韩v亚洲ⅴ| 天天综合天天做天天综合| 亚洲男人天堂av| 亚洲欧洲av一区二区三区久久| 久久嫩草精品久久久精品一| 日韩女优视频免费观看| 777xxx欧美| 日韩一级免费一区| 欧美精品在欧美一区二区少妇| 色狠狠av一区二区三区| 91片黄在线观看| 欧美亚日韩国产aⅴ精品中极品| 色哟哟欧美精品| 欧美在线观看视频一区二区| 欧美探花视频资源| 欧美日韩不卡视频| 4hu四虎永久在线影院成人| 欧美色图在线观看| 欧美一卡2卡三卡4卡5免费| 日韩一区二区三区四区| 精品日产卡一卡二卡麻豆| 国产亚洲人成网站| 日韩理论片在线| 日韩成人一级片| 成人午夜伦理影院| 欧美日韩久久久久久| 精品国产sm最大网站免费看| 久久久久久久久久久99999| 国产精品伦理一区二区| 洋洋成人永久网站入口| 久草热8精品视频在线观看| 99久久99久久久精品齐齐| 欧美日韩一区 二区 三区 久久精品| 欧美一区二区在线播放| 国产精品久久久久久久浪潮网站 | 亚洲第一狼人社区| 国产成人久久精品77777最新版本| www.66久久| 91精品国产免费| 亚洲一区二区三区在线| 97精品超碰一区二区三区| 精品国产乱码久久久久久蜜臀| 亚洲图片你懂的| 国产精品资源在线| 欧美一二三四在线| 天天影视色香欲综合网老头| 99国产精品久久久久久久久久久| 精品国产乱码久久久久久久久| 日日嗨av一区二区三区四区| 91福利小视频| 一区二区成人在线观看| 99视频精品在线| 国产精品女上位| 99久久99久久综合| 亚洲免费观看在线视频| 国产宾馆实践打屁股91| 久久久噜噜噜久噜久久综合| 伦理电影国产精品| 日韩视频免费观看高清在线视频| 亚洲成人免费视| 91精品国产福利| 久久精品99久久久| 日韩精品专区在线影院重磅| 久久国产精品99久久久久久老狼| 久久综合九色综合欧美98 | 亚洲国产欧美在线| 欧美裸体一区二区三区| 免费观看一级欧美片| 精品日韩一区二区|