⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.c

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