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

📄 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:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**-------------------------------------------------------------------------------------------------------
** Modified by:			Litiantian
** Modified date:		2006-01-04
** Version:
** Descriptions:		LPC2400系列ARM SPI作从机的应用示例
**-------------------------------------------------------------------------------------------------------
** Modified by:			wankai
** Modified date:		2008-07-05
** Version:				
** Descriptions:		对程序的风格以及注释略作调整,并检查代码。
**
*********************************************************************************************************/
#include "main.h" 

#define  SPI0_INT		10													/* SPI中断源ID				*/
#define  BEEP			(1 << 30)											/* BEEP口					*/

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


/*********************************************************************************************************
** 函数名称:  SPI_IRQ
** 函数功能:  SPI中断服务函数
** 入口参数:  无
** 出口参数:  无
*********************************************************************************************************/
void __irq SPI_IRQ(void)
{
	uint32 tmp = 0;
	
    tmp 	= (uint32)S0SPSR;												/* 读SPSR寄存器,清零SPIF位	*/
    uiRcvData = (uint8)S0SPDR;        										/* 接收数据					*/
    uiRcvFlag = 0x01;														/* 接收到新数据				*/
    S0SPINT = 0x01;               											/* 清除标志位				*/
    
    VICVectAddr = 0x00;
} 

/*********************************************************************************************************
** 函数名称:  SPISlaveInit																									
** 功能说明:  初始化SPI控制器为从机,并初始化相关引脚					
** 入口参数:  无																
** 出口参数:  无																
*********************************************************************************************************/
void  SPISlaveInit(void)
{  
    PCONP   |= (1 << 8);

	/*  设置SPI的通讯脚  */
    PINSEL0	|= 	0xc0000000;									                /* 设置P0.15脚为SCK脚		*/
    PINSEL1	|=	0x03 | (0x03 << 2) | (0x03 << 4);			                /* 设置P0.16、P0.17、       */
                                                                            /* P0.18管脚为SPI引脚		*/
			               
 	/*  设置SPI的工作方式  */
 	S0SPCR   = 	(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 = 1, SPI 中断被使能	*/
                (8 << 8);

	/*  初始化SPI的中断接口  */			
    VICIntEnClr   = 1 << SPI0_INT;											/* 禁止SPI中断				*/
	VICVectPri10  = 1 << SPI0_INT;											/* 设置SPI中断优先级为5		*/
	VICVectAddr10 = (uint32)SPI_IRQ;										/* 装入SPI中断服务程序地址	*/
	VICIntEnable  = 1 << SPI0_INT;											/* 使能SPI中断				*/
   	IRQEnable();															/* IRQ中断使能				*/
}

/*********************************************************************************************************
** 函数名称:  SSP_Init
** 函数功能:  将SSP控制器设置为SPI主机,并初始化其引脚。
** 入口参数:  无
** 出口参数:  无
*********************************************************************************************************/
void  SSP_Init(void)
{
	PCONP   |= (1 << 21);			 	                                    /* 在外设功率控制寄存器里   */
	                                                                        /* 使能SSP外设,默认情况下,  */
	                                                                        /* 该外设已被使能。         */
	
	/*  初始化P2.22、P2.23、P2.26、P2.27为SSP接口引脚,
	 *  不用另外的IO口作从机选择线,直接用SSEL1完成片选SPI接口的功能。*/
	PINSEL5 &= ~((0x03 << 12) | (0x03 << 14) | (0x03 << 20) | (0x03 << 22));
	PINSEL5 |=((0x03 << 12) | (0x03 << 14) | (0x03 << 20) | (0x03 << 22));
	/*  初始化SSP的通讯方式,设置数据长度为8bit,帧格式为SPI,SCK 为低有效,
     *  数据在SCK 的第一个时钟沿采样,设置SPI串行时钟通信速率为默认值。 */
    SSP0CR0  = (0x01 << 8) |          										/* SCR  设置SPI时钟分频		*/
               (0x00 << 7) |          										/* CPHA 仅SPI模式有效 		*/
               (0x01 << 6) |         									 	/* CPOL SPI模式有效								*/
               (0x00 << 4) |          										/* FRF  帧格式 00=SPI		*/
               (0x07 << 0);           										/* DSS  数据长度,0111=8位	*/

    SSP0CPSR = 0x92;                  										/* SSP从Pclk获得的分频值	*/
    SSP0CR1  = (0x00 << 3) |          										/* SOD  从机输出禁能,0=允许 */
               (0x00 << 2) |          										/* MS   主从选择,0=主机		*/
               (0x01 << 1) |          										/* SSE  SSP使能				*/
               (0x00 << 0);           										/* LBM  回写模式			*/
}

/*********************************************************************************************************
* 函数名称:  SSP_SendData
* 函数功能:  SSP接口向SPI总线发送数据。
* 入口参数:  data        待发送的数据
* 出口参数:  返回值为读取的数据
*********************************************************************************************************/
uint8  SSP_SendData(uint8 data)
{  
    SSP0DR = data;
    while ((SSP0SR & 0x01) == 0); 											/* 等待TFE置位,即发送FIFO空 */
    return ((uint8) SSP0DR);
}

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

/********************************************************************************************************
** 函数名称:  main																
** 函数功能:  演示SPI主机和SPI从机的通讯			
** 入口参数:  无																
** 出口参数:  无
** 调试说明:  需用杜邦线将P0.15~P0.18分别和P2.22、P2.23、P2.26、P2.27短接;将BEEP和P3.30脚短接。
** 注    意: 由于片外Flash读写比较慢,凡涉及延时的地方,均需缩短延时,大约为片内的1/10	
*********************************************************************************************************/
int main(void)
{  	
	volatile  uint8  uircv_data = 0; 
    uint8 i = 0;
	
	FIO3DIR |= BEEP;		            									/* 初始化BEEP口				*/
    FIO3SET  = BEEP;
    SPISlaveInit();			            									/* 初始化SPI接口			*/
    SSP_Init();                         									/* 初始化SSP接口			*/

    for (i = 0; i < 8; i++) {
		uiRcvFlag  = 0;		            									/* 清除接收到新数据标志		*/
        uircv_data = SSP_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 + -