📄 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 + -