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

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

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

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


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

/***********************************************************************
** 函数名称:  SPISlaveInit																									
** 功能说明:  初始化SPI控制器为从机,并初始化相关引脚					
** 入口参数:  无																
** 出口参数:  无																
*************************************************************************/
void  SPISlaveInit(void)
{  
	/* 设置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 中断被使能

	/* 初始化SPI的中断接口 */			
    VICIntEnClr  |= 1 << SPI0_INT;	// 禁止SPI中断
	VICVectPri10  = 0x05;			// 设置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外设,默认情况下,该外设已被使能。
	
	/* 初始化P1.20、P1.21、P1.23、P1.24为SSP接口引脚,不用另外的IO口作从机选择线,直接用SSEL1完成片选SPI接口的功能。*/
	PINSEL3  = 0;
	PINSEL3 |= (0x03 << 8) | (0x03 << 10) | (0x03 << 14) | (0x03 << 16);    
	
	/* 初始化SSP的通讯方式,设置数据长度为8bit,帧格式为SPI,SCK 为低有效
    ,数据在SCK 的第一个时钟沿采样,设置SPI串行时钟通信速率为默认值。 */
    SSP0CR0  = (0x01 << 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位

    SSP0CPSR = 0x92;                  // 设置SSP从Pclk获得的分频值,主模式下有效, 最小值为0x02。
    SSP0CR1  = (0x00 << 3) |          // SOD  从机输出禁能,1=禁止,0=允许
               (0x00 << 2) |          // MS   主从选择,0=主机,1=从机
               (0x01 << 1) |          // SSE  SSP使能,1=允许SSP与其它设备通信
               (0x00 << 0);           // LBM  回写模式
}

/*********************************************************************************************************
* 函数名称:  SSP_SendData
* 函数功能:  SSP接口向SPI总线发送数据。
* 入口参数:  data        待发送的数据
* 出口参数:  返回值为读取的数据
*********************************************************************************************************/
uint8  SSP_SendData(uint8 data)
{  
    SSP0DR = data;
    while ((SSP0SR & 0x01) == 0); 	// 等待TFE置位,即发送FIFO空   
    return (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分别和P1.20、P1.21、P1.23、P1.24短接;将BEEP和P1.27脚短接。
*******************************************************************************************/
int main(void)
{  	
	volatile  uint8  rcv_data = 0; 
    uint32 i = 0;
	
	IO1DIR |= BEEP;			            // 初始化BEEP口
    SPISlaveInit();			            // 初始化SPI接口
    SSP_Init();                         // 初始化SSP接口

    for (i = 0; i < 8; i++)
    {
		RcvFlag  = 0;		            // 清除接收到新数据标志
        rcv_data = SSP_SendData(i);	    // 发送数据
        DelayNS(100);	                // 延时
		
		if (RcvFlag != 0)               // 如果接收到新数据
   		{
	  		if (RcvData == i)
      		{	
      			/* 接收的数据是否与发送的数据相同,通讯无误,蜂鸣器长鸣一次 */
				IO1CLR |= BEEP;										
				DelayNS(200);
				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 + -