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

📄 main.c

📁 基于zlg SmartARM2300平台的源码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Litiantian
** Created date:		2007-01-04
** Version:				1.0
** Descriptions:		LPC2300系列ARM SSP用作SPI从机应用示例
**
**------------------------------------------------------------------------------------------------------
** Modified by:			liuyanlong
** Modified date:		2007-09-03
** Descriptions:		对代码风格和注释进行了调整、校对
********************************************************************************************************/
#include  	"config.h" 

#define  SSP_INT		10					// SPI中断源ID
#define  BEEP			(1 << 27)			// 定义BEEP口			
#define  SLAVE_CS		(1 << 16)			// 从机片选口

volatile uint8 	RcvFlag = 0;				// 接收到新数据标志
volatile uint8 	RcvData = 0;				// 接收到的数据


/*********************************************************************************************************
** 函数名称:SSP_IRQ
** 函数功能:SSP中断服务函数
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void __irq SSP_IRQ(void)
{
    RcvData 	= SSP0DR;					// 接收数据
    RcvFlag 	= 0x01;						// 接收到新数据
    SSP0ICR 	= 0x03;  					// 清除标志位
    VICVectAddr = 0x00;
} 

/***********************************************************************
** 函数名称:SPIInit																									
** 功能说明:初始化SPI为主机,并初始化相关引脚					
** 入口参数:无																
** 出口参数:无																
*************************************************************************/
void  SPIInit(void)
{  
	/* 设置硬件SPI的通讯脚 */
    PINSEL0	|= 	0xc0000000;					// 设置P0.15脚为SCK脚
    PINSEL1	 =	(0x03 << 2) | (0x03 << 4);	// 设置P0.17、P0.18管脚为SPI接口
	
	/* 初始化P0.16为GPIO输出,用作片选脚 */	
	IO0DIR 	|= SLAVE_CS;
		               
 	/* 设置SPI的工作方式 */
 	S0SPCR   = 	(0 << 3) |					// CPHA = 0, 数据在SCK 的第一个时钟沿采样
 				(1 << 4) |					// CPOL = 1, SCK 为低有效
 				(1 << 5) |					// MSTR = 1, SPI 处于主模式
 				(0 << 6) |					// LSBF = 0, SPI 数据传输MSB (位7)在先
 				(0 << 7);					// SPIE = 0, SPI 中断被禁止

	S0SPCCR  = 0x52;						// 设置SPI时钟分频
}

/*********************************************************************************************************
** 函数名称:SSPSlave_Init
** 函数功能:将SSP控制器设置为从机SPI,并初始化其引脚
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void  SSPSlave_Init(void)
{
	PCONP 	|= (1 << 21);		   			 // 在外设功率控制寄存器里使能SSP外设,默认情况下,该外设已被使能
	
	/* 初始化P1.20、P1.21、P1.23、P1.24为SSP接口引脚 */
	PINSEL3  = 0;
	PINSEL3 |= (0x03 << 8) | (0x03 << 10) | (0x03 << 14) | (0x03 << 16);    
	/* 初始化SSP的通讯方式,设置数据长度为8bit,帧格式为SPI,SCK 为低有效
    ,数据在SCK 的第一个时钟沿采样,设置位速率。 */
    SSP0CR0  = (0x00 << 8) |          		// SCR  设置SPI位速率
               (0x00 << 7) |         	 	// CPHA 时钟输出相位,仅SPI模式有效 
               (0x01 << 6) |         		// CPOL 时钟输出极性,仅SPI模式有效
               (0x00 << 4) |          		// FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
               (0x07 << 0);           		// DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSP0CR1  = (0x00 << 3) |         		// SOD  从机输出禁能,1=禁止,0=允许
               (0x01 << 2) |         		// MS   主从选择,0=主机,1=从机
               (0x01 << 1) |         		// SSE  SSP使能,1=允许SSP与其它设备通信
               (0x00 << 0);          		// LBM  回写模式
   
   /* 初始化SSP的中断接口 */			
    SSP0ICR  	  = 0x03;				 	// 清除接收溢出和超时中断
    SSP0IMSC 	  = 0x02;				 	// 中断使能寄存器,使能接收超时中断
	VICIntEnClr  |= (1 << SSP_INT);	 		// 禁止SPI中断
	VICVectPri10  = 0x05;			 		// 设置SPI中断优先级为5
	VICVectAddr10 = (uint32)SSP_IRQ; 		// 装入SPI中断服务程序地址
	VICIntEnable |= (1 << SSP_INT);	 		// 使能SPI中断
   	IRQEnable();							// IRQ中断使能
}

/*********************************************************************************************************
* 函数名称:SPI_SendData
* 函数功能:SPI接口向SSP从机发送数据
* 入口参数:data        待发送的数据
* 出口参数:无
*********************************************************************************************************/
void  SPI_SendData(uint8 data)
{  
    IO0CLR |= SLAVE_CS; 
    S0SPDR  = data;
    while (0 == (S0SPSR & 0x80));			// 等待SPIF置位,即等待数据发送完毕
	S0SPSR  = 0;							// 清除SPIF标志
	IO0SET |= SLAVE_CS;
}

/********************************************************************************************************
** 函数名称:DelayNS
** 函数功能:长软件延时
** 入口参数:dly		延时参数,值越大,延时越久
** 出口参数:无
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
    uint32  i = 0;
    
    for(; dly > 0; dly--)
    { 
        for (i = 0; i < 50000; i++);
	}
}

/*******************************************************************************************
** 函数名称:main																
** 函数功能:LPC2300系列ARM SSP用作SPI从机应用示例			
** 入口参数:无																
** 出口参数:无
** 调试说明:需用杜邦线将P0.15~P0.18分别和P1.20、P1.21、P1.23、P1.24短接;将BEEP和P1.27脚短接。
*******************************************************************************************/
int main(void)
{  	
    uint32 i = 0;
	
	IO1DIR |= BEEP;							// 初始化BEEP口
	IO1SET |= BEEP;							// 关闭蜂鸣器
    SPIInit();								// 初始化SPI接口
    SSPSlave_Init();        				// 初始化SSP接口
    for (i = 0; i < 8; i++)
    {
		RcvFlag = 0;						// 清除接收到新数据标志
	    
        SPI_SendData(i);					// 发送数据
        DelayNS(100);	    				// 延时
		
		if (RcvFlag != 0)   				// 如果接收到新数据
   		{
	  		if (RcvData == i)
      		{	
      			/* 接收的数据是否与发送的数据相同,通讯无误,蜂鸣器长鸣一次 */
				IO1CLR |= BEEP;										
				DelayNS(100);
				IO1SET |= BEEP;
      		}
      			/* 数据错误,BEEP一直响 */
      		else 
       		{	
       			IO1CLR |= BEEP;
   			}
   		}
   		/* 通讯出错,BEEP一直响 */
   		else 
   		{
   			IO1CLR |= BEEP;
    	}
    } 
	while (1);
    return (0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -