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

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

?? spid.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
字號:
/* ----------------------------------------------------------------------------
 *         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;
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产日韩一区二区| 菠萝蜜视频在线观看一区| 国产在线观看一区二区| 色综合激情五月| 久久久亚洲精品一区二区三区| 亚洲一区在线观看免费观看电影高清| 国产美女精品人人做人人爽| 欧美私人免费视频| 国产精品色哟哟| 国产一区二区精品久久| 日韩欧美一级特黄在线播放| 一区二区三区在线播放| 风间由美一区二区av101| 欧美成人在线直播| 天堂蜜桃91精品| 欧美性猛交一区二区三区精品| 国产精品久久久久久久久快鸭| 韩国成人精品a∨在线观看| 欧美高清视频一二三区 | 欧美日韩国产成人在线91| 国产精品国产三级国产有无不卡 | 制服丝袜中文字幕一区| 亚洲一区成人在线| 在线视频国内一区二区| 亚洲精品乱码久久久久久日本蜜臀| 国产精品88888| 久久亚洲私人国产精品va媚药| 伦理电影国产精品| 欧美一区二区三区白人| 日本不卡的三区四区五区| 欧美久久久影院| 午夜精品久久久久久久蜜桃app| 日本高清不卡视频| 亚洲最新视频在线观看| 欧美影院午夜播放| 午夜免费久久看| 91精品欧美久久久久久动漫| 青青草国产精品97视觉盛宴| 日韩一区二区三区在线观看| 免费成人美女在线观看| 精品捆绑美女sm三区| 国产成人综合在线| 最新国产成人在线观看| 91黄视频在线| 免费精品视频在线| 久久这里只有精品首页| 成人一区二区视频| 尤物视频一区二区| 欧美精品粉嫩高潮一区二区| 麻豆极品一区二区三区| 国产亚洲精品超碰| 一本到一区二区三区| 五月综合激情网| 久久综合狠狠综合| 成人爱爱电影网址| 首页欧美精品中文字幕| 亚洲精品一区二区精华| 99热这里都是精品| 亚洲国产sm捆绑调教视频| 2023国产精品自拍| 色综合久久中文综合久久97| 亚洲高清视频在线| 久久噜噜亚洲综合| 在线一区二区视频| 国产综合久久久久久久久久久久| 中文字幕一区二区三区在线观看| 欧美日韩一级二级三级| 国产自产视频一区二区三区| 亚洲色图视频网站| 日韩午夜av电影| 色哟哟精品一区| 激情五月激情综合网| 亚洲伊人色欲综合网| 日韩欧美国产三级电影视频| 99久久精品久久久久久清纯| 日韩av中文字幕一区二区| 中文字幕第一区综合| 欧美一级夜夜爽| av影院午夜一区| 精品在线视频一区| 亚洲高清视频中文字幕| 综合色天天鬼久久鬼色| 精品国产乱码久久久久久图片 | 一区二区三区中文字幕电影 | 国产999精品久久久久久绿帽| 亚洲国产sm捆绑调教视频| 国产精品免费aⅴ片在线观看| 9191久久久久久久久久久| 99久久国产综合精品女不卡| 久久精品99国产国产精| 亚洲国产日韩综合久久精品| 国产精品久久久久三级| 久久久久国产精品免费免费搜索 | 色狠狠综合天天综合综合| 国产在线精品免费| 美美哒免费高清在线观看视频一区二区 | 中文字幕欧美日本乱码一线二线 | 天天射综合影视| 一区二区三区蜜桃| 国产精品传媒视频| 久久免费偷拍视频| 国产校园另类小说区| 精品日韩一区二区三区| 日韩一区二区在线观看视频 | 日韩国产精品久久| 亚洲综合男人的天堂| 亚洲精品午夜久久久| 亚洲视频一区在线| 国产精品色哟哟网站| 欧美国产国产综合| 中文字幕成人av| 国产精品久久久久三级| 中文字幕五月欧美| 中文字幕佐山爱一区二区免费| 欧美国产一区在线| 中文字幕一区二区三区蜜月| 国产精品久久看| 最新日韩在线视频| 国产精品美女一区二区在线观看| 国产欧美一区二区三区沐欲| 久久天堂av综合合色蜜桃网| 久久先锋资源网| 亚洲国产精品精华液ab| 欧美韩国日本不卡| 亚洲精品国产精华液| 亚洲综合在线五月| 午夜成人免费电影| 久久99久久99小草精品免视看| 国产一区美女在线| 成人免费三级在线| 色婷婷一区二区| 欧美精品久久一区| 精品美女一区二区三区| 久久久久久一级片| 亚洲欧美日韩精品久久久久| 亚洲一区二区成人在线观看| 肉丝袜脚交视频一区二区| 久久精品国产亚洲aⅴ| 成人午夜视频免费看| 色av成人天堂桃色av| 日韩欧美在线网站| 日本一区二区三区四区| 亚洲男人都懂的| 蜜臀va亚洲va欧美va天堂| 国产成人精品一区二| 在线日韩一区二区| 精品国产不卡一区二区三区| 中文字幕中文字幕一区| 性做久久久久久| 国产成人av自拍| 欧美日韩色一区| 欧美激情艳妇裸体舞| 天堂久久一区二区三区| 成人午夜又粗又硬又大| 欧美另类变人与禽xxxxx| 久久影院午夜论| 亚洲一级在线观看| 国产一区激情在线| 欧美日韩一区二区三区在线 | 夫妻av一区二区| 在线播放国产精品二区一二区四区| 26uuu国产日韩综合| 一区二区三区**美女毛片| 国产精品中文字幕日韩精品 | 91成人国产精品| 久久久激情视频| 日本人妖一区二区| 97精品国产97久久久久久久久久久久| 欧美一级生活片| 亚洲一区二区在线视频| 不卡视频一二三四| 欧美成人vr18sexvr| 午夜视频在线观看一区| 福利一区二区在线观看| 精品区一区二区| 天天操天天综合网| 色婷婷激情一区二区三区| 国产女人18水真多18精品一级做| 日本女人一区二区三区| 欧美在线观看视频在线| 国产精品美女久久久久久 | 91片在线免费观看| 久久久精品日韩欧美| 久久精品噜噜噜成人av农村| 欧美性猛交xxxx乱大交退制版| 1024成人网| 99久久久精品免费观看国产蜜| 久久久久久久综合色一本| 激情综合网av| 欧美一区二区啪啪| 热久久一区二区| 欧美一区二区三区日韩视频| 亚洲午夜免费电影| 欧美日韩在线电影| 亚洲自拍偷拍综合| 欧美日韩免费电影| 天天综合日日夜夜精品| 欧美一区二区高清| 久久精品二区亚洲w码| 精品国产伦一区二区三区观看方式|