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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 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:			wankai
** Modified date:		2008-07-08
** Descriptions:		对代码风格和注释进行了调整、校对
*********************************************************************************************************/
#include  	"config.h" 

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

volatile uint8 	uiRcvFlag = 0;				                                /* 接收到新数据标志			*/
volatile uint8 	uiRcvData = 0;				                                /* 接收到的数据				*/


/*********************************************************************************************************
** 函数名称:SSP_IRQ
** 函数功能:SSP中断服务函数
** 入口参数:无
** 出口参数:无
*********************************************************************************************************/
void __irq SSP_IRQ(void)
{
    uiRcvData 	= (uint8)SSP0DR;			                                /* 接收数据					*/
    uiRcvFlag 	= 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外设,默认情况下,  */
	                                                                        /* 该外设已被使能           */
	
	/* 初始化P2.22、P2.23、P2.26、P2.27为SSP接口引脚。*/
	PINSEL5 |= (0x03 << 12) | (0x03 << 14) | (0x03 << 20) | (0x03 << 22);  
	
	
	   
	/* 初始化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																
** 函数功能:LPC2400系列ARM SSP用作SPI从机应用示例			
** 入口参数:无																
** 出口参数:无
** 调试说明:需用杜邦线将P0.15~P0.18分别P2.22、P2.23、P2.26、P2.27短接;将BEEP和P3.30脚短接。
** 注    意:由于片外Flash读写比较慢,凡涉及延时的地方,均需缩短延时,大约为片内的1/10
*********************************************************************************************************/
int main(void)
{  	
    uint8 i = 0;
	
	FIO3DIR |= BEEP;						                                /* 初始化BEEP口				*/
	FIO3SET |= BEEP;						                                /* 关闭蜂鸣器				*/
    SPIInit();								                                /* 初始化SPI接口			*/
    SSPSlave_Init();        				                                /* 初始化SSP接口			*/
    for (i = 0; i < 8; i++) {
		uiRcvFlag = 0;						                                /* 清除接收到新数据标志		*/
	    
        SPI_SendData(i);					                                /* 发送数据					*/
        DelayNS(100);	    				                                /* 延时						*/
		
		if (uiRcvFlag != 0) {  				                                /* 如果接收到新数据			*/
   			if (uiRcvData == i) {
      			/* 接收的数据是否与发送的数据相同,通讯无误,蜂鸣器长鸣一次*/
				FIO3CLR |= BEEP;										
				DelayNS(150);
				FIO3SET |= BEEP;
      		}
      		/* 数据错误,BEEP一直响 */
      		else  {	
       			FIO3CLR |= BEEP;
   			}
   		}
   		/* 通讯出错,BEEP一直响 */
   		else {
   			FIO3CLR |= BEEP;
    	}
    } 
	while (1);
    return (0);
}
/*********************************************************************************************************
**                            End Of File
*********************************************************************************************************/

⌨️ 快捷键说明

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