?? spi.c
字號:
#define SPI
#include "config.h"
/*
*********************************************************************************************************
** 函數名稱 :SPI0_Init()
** 函數功能 :SPI0接口初始化
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************
*/
void SPI0_Init(void)
{
uint8 cFlag;
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ; // 設置管腳連接SPI
IO1DIR = IO1DIR | ARM7_SPI_INT ; // 設置中斷管腳方向
IO1SET = ARM7_SPI_INT; // 關ARM7到ARM9的SPI中斷
SPCR = (0 << 3) | // CPHA = 0, 數據在SCK的第一個時鐘沿采樣
(1 << 4) | // CPOL = 1, SCK 為低有效
(0 << 5) | // MSTR = 0, SPI處于從模式
(0 << 6) | // LSBF = 0, SPI 數據傳輸MSB(位7)在先
(1 << 7); // SPIE = 0, SPI 中斷被禁止
IRQEnable(); // 使能IRQ中斷
VICIntSelect = 0x00000000; // 設置所有的通道為IRQ中斷
VICVectCntl0 = 0x20 | SPI0; // SPI0分配到IRQ slot0
VICVectAddr0 = (uint32)IRQ_SPI0; // 設置SPI0向量地址
VICIntEnable = VICIntEnable | (1 << SPI0); // 使能SPI0中斷
cFlag = SPI_SPSR; // 讀取狀態寄存器清除狀態標志
SPI_SPINT = 1; // 清除中斷標志
gbSPITxbusy = false; // SPI0接收狀態
gnSPIRxTotal = 0; // SPI0接收數據長度清零
gnSPIRxCount = 0; // SPI0接收數據計數器清零
}
/*
*********************************************************************************************************
** 函數名稱 :IRQ_SPI0()
** 函數功能 :SPI0接收中斷
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************
*/
void __irq IRQ_SPI0(void)
{
uint8 cSPIFlag,cSPIData;
SPI_SPINT = 1; // 清除SPI0中斷標志
gcSPIComm = 0; // SPI0通訊超時計數
if(!gbSPITxbusy) // SPI0接收狀態
{
if(gnSPIRxCount >= MAXBUFFERLEN-1) // 長度合法性判斷
gnSPIRxCount = 0; // 長度不合法清零
cSPIFlag = SPI_SPSR; // 讀取狀態字清除標志
SPIRxBuf[gnSPIRxCount++] = SPI_SPDR; // 讀取SPI0數據寄存器
if(SPIRxBuf[0]!=SPI_BOOT) // 接收幀引導字節
gnSPIRxCount = 0; // 引導字節不合法清零
if(gnSPIRxCount==2&&SPIRxBuf[1]!=CF_START) // 接收幀前導字節
gnSPIRxCount = 0; // 前導字節不合法清零
if((SPIRxBuf[0]==0xab)&&(SPIRxBuf[1]==0x0f)) // 引導和前導都正確
{
if(gnSPIRxCount==4)
{
gnSPIRxTotal = SPIRxBuf[3] << 8;
gnSPIRxTotal += SPIRxBuf[2];
gnSPIRxTotal += 4;
}
if(gnSPIRxCount==gnSPIRxTotal)
{
gbSPIFrameOK = true;
gnSPIRxCount = 0;
}
}
}
else // SPI0發送狀態
{
cSPIFlag = SPI_SPSR; // 讀取狀態字清除標志
cSPIData = SPI_SPDR; // 讀取數據清除數據寄存器
if(gnSPITxCount < gnSPITxTotal)
SPI_SPDR = SPITxBuf[gnSPITxCount++];
else
{
if(gnSPITxCount==4)
gbSPITxbusy = false; // 置SPI0為接收狀態
}
}
VICVectAddr = 0x00; // 向量中斷結束
}
/*
*********************************************************************************************************
** 函數名稱 :SPI_Send()
** 函數功能 :SPI0中斷發送
** 入口參數 :nTxLen:發送數據長度
** 出口參數 :無
*********************************************************************************************************
*/
void SPI_Send(uint16 nTxLen)
{
uint8 cSPIFlag;
gnSPITxTotal = nTxLen+4; // 發送總字節數
gnSPITxCount = 1;
SPITxBuf[0] = SPI_BOOT; // 幀引導
SPITxBuf[1] = CF_START; // 幀前導
memcpy(&SPITxBuf[2],(uint8 *)&nTxLen,2);
cSPIFlag = SPI_SPSR;
SPI_SPDR = SPITxBuf[0]; // 發送第一個字節
IO1CLR = ARM7_SPI_INT; // 觸發ARM9中斷
IO1SET = ARM7_SPI_INT;
gbSPITxbusy = true; // SPI0發送狀態
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -