?? spi.c
字號:
//*------------------------------------------------------------------------------------------------
//* 文件名 : spi.c
//* 功能描述 : SPI接口驅動
//* 作者 : 焦海波
//* 版本 : 0.1
//* 建立日期、時間 : 2008/05/04 14:52
//* 最近修改日期、時間 :
//* 修改原因 :
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 頭文件 ----------------------------------------------
#include "/uCOS-II/ucos_ii.h"
#include "/at91sam7x256/include/AT91SAM7X256.h"
#include "/at91sam7x256/include/lib_AT91SAM7X256.h"
#define OS_GLOBALS
#include "spi.h"
//*-------------------------------------- 函數原型聲明區 ------------------------------------------
static void __irqSPIHandler(void);
//*------------------------------------- 常量、變量定義區 -----------------------------------------
static const SPI0_DEV_DESCRIPTOR SPI[2] = {
{AT91C_BASE_SPI0, SPI0_PINS, AT91C_ID_SPI0, AT91C_PA16_SPI0_MISO, SPI_IRQ_PRIOR, __irqSPIHandler},
{AT91C_BASE_SPI1, SPI1_PINS, AT91C_ID_SPI1, AT91C_PA24_SPI1_MISO, SPI_IRQ_PRIOR, __irqSPIHandler}
};
static ST_SPI_DEV_RW *__pstRWOpt;
//*================================================================================================
//* 函 數 區
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilSPIPinsConfig
//* 功能描述 : SPI相關引腳配置函數
//* 入口參數 : <u32Pins>[in] 相關外設引腳
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilSPIPinsConfig(INT32U u32Pins)
{
//* 首先禁止相關引腳中斷
AT91C_BASE_PIOA->PIO_IDR = u32Pins;
AT91C_BASE_PIOA->PIO_PPUDR = u32Pins;
AT91C_BASE_PIOA->PIO_ASR = u32Pins;
AT91C_BASE_PIOA->PIO_PDR = u32Pins;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __ilSPIConfig
//* 功能描述 : SPI相關控制寄存器配置
//* 入口參數 : <u8SPIDevID>[in] SPI接口占用的外設ID號
//* : <pSPI>[in] SPI相關控制寄存器的基址
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
__inline void __ilSPIConfig(INT8U u8SPIDevID, AT91PS_SPI pSPI)
{
//* 使能SPI輸入時鐘
AT91C_BASE_PMC->PMC_PCER = 1 << u8SPIDevID;
//* 軟件復位SPI
pSPI->SPI_CR = AT91C_SPI_SWRST;
//* 為主機模式,禁止模式故障檢測,禁止片選
pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS;
//* 禁止PDC收發
pSPI->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
//* 使能SPI
pSPI->SPI_CR = AT91C_SPI_SPIEN;
//* 禁止SPI時鐘
AT91C_BASE_PMC->PMC_PCDR = 1 << u8SPIDevID;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : __irqSPIHandler
//* 功能描述 : SPI中斷服務子函數
//* 入口參數 : 無
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
static void __irqSPIHandler(void)
{
INT32U __uSPIStatus;
__uSPIStatus = SPI[__pstRWOpt->u8SPIPort].pSPI->SPI_SR;
if(__uSPIStatus & AT91C_SPI_RXBUFF)
{
//* 禁止PDC收發器
SPI[__pstRWOpt->u8SPIPort].pSPI->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
//* 禁止SPI時鐘輸入
AT91C_BASE_PMC->PMC_PCDR = 1<< SPI[__pstRWOpt->u8SPIPort].u8SPIID;
//* 禁止SPI接收結束中斷
SPI[__pstRWOpt->u8SPIPort].pSPI->SPI_IDR = AT91C_SPI_RXBUFF;
//* 調用SPI設備用戶注冊的回調函數
if(__pstRWOpt->pfunCallBack != NULL)
__pstRWOpt->pfunCallBack(__pstRWOpt->pvArg);
}
u8IsNotRecvEnd = OS_FALSE;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : SPIConfig
//* 功能描述 : 初始配置SPI0
//* 入口參數 : <u8SPIPort>[in] 指定配置的SPI端口號(0代表SPIO,1代表SPI1)
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
void SPIConfig(INT8U u8SPIPort)
{
__ilSPIPinsConfig(SPI[u8SPIPort].u32Pins);
AT91C_BASE_PIOA->PIO_PPUER = SPI[u8SPIPort].u32NeedPullUpPin;
__ilSPIConfig(SPI[u8SPIPort].u8SPIID, SPI[u8SPIPort].pSPI);
//* 向AIC注冊SPI中斷
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
SPI[u8SPIPort].u8SPIID,
SPI[u8SPIPort].u8IRQPrior,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
SPI[u8SPIPort].pfunSPIIsr);
AT91C_BASE_AIC->AIC_IECR = 1 << SPI[u8SPIPort].u8SPIID;
//* 禁止所有SPI中斷
SPI[u8SPIPort].pSPI->SPI_IDR = 0xFFFFFFFF;
u8IsNotRecvEnd = OS_TRUE;
}
//*------------------------------------------------------------------------------------------------
//* 函數名稱 : ReadAndWriteSPIDev
//* 功能描述 : 通過SPI口對相關設備進行讀寫操作
//* 入口參數 : <u8SPIPort>[in] 指定配置的SPI端口號(0代表SPIO,1代表SPI1)
//* : <pstOpt>[in] 指向具體讀寫操作指令的指針(ST_SPI_DEV_RW結構體)
//* 出口參數 : 無
//*------------------------------------------------------------------------------------------------
void ReadAndWriteSPIDev(ST_SPI_DEV_RW *pstOpt)
{
INT32U __u32SPIModeVal;
//* 使能SPI時鐘輸入
AT91C_BASE_PMC->PMC_PCER = 1 << SPI[pstOpt->u8SPIPort].u8SPIID;
//* 首先禁止SPI PDC收發器
SPI[pstOpt->u8SPIPort].pSPI->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
//* 修改SPI模式寄存器,片選指定的SPI設備
__u32SPIModeVal = SPI[pstOpt->u8SPIPort].pSPI->SPI_MR;
__u32SPIModeVal |= AT91C_SPI_PCS;
__u32SPIModeVal &= ~(1 << (pstOpt->u8NPCSPin + 16));
SPI[pstOpt->u8SPIPort].pSPI->SPI_MR = __u32SPIModeVal;
//* 初始化SPI PDC收發器
SPI[pstOpt->u8SPIPort].pSPI->SPI_RPR = (INT32U)pstOpt->pbCmd;
SPI[pstOpt->u8SPIPort].pSPI->SPI_RCR = pstOpt->u8CmdLen;
SPI[pstOpt->u8SPIPort].pSPI->SPI_TPR = (INT32U)pstOpt->pbCmd;
SPI[pstOpt->u8SPIPort].pSPI->SPI_TCR = pstOpt->u8CmdLen;
SPI[pstOpt->u8SPIPort].pSPI->SPI_RNPR = (INT32U)pstOpt->pbData;
SPI[pstOpt->u8SPIPort].pSPI->SPI_RNCR = pstOpt->u32DataLen;
SPI[pstOpt->u8SPIPort].pSPI->SPI_TNPR = (INT32U)pstOpt->pbData;
SPI[pstOpt->u8SPIPort].pSPI->SPI_TNCR = pstOpt->u32DataLen;
//* PDC傳輸、發送使能
SPI[pstOpt->u8SPIPort].pSPI->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;
//* 使能SPI接收結束中斷
__pstRWOpt = pstOpt;
SPI[pstOpt->u8SPIPort].pSPI->SPI_IER = AT91C_SPI_RXBUFF;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -