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

📄 main.c

📁 周立功2103开发板CD资料
💻 C
字号:
#define IN_MAIN
#include "config.h"
#include "SPI.h"
#include "UART.h"
#include "ISR.h"
#include "stdio.h"
#pragma import(__use_no_semihosting_swi)        //don't delete this line

#define		HC595_CS		(1<<8)		// P0.8口为74HC595的片选

#define		SPI_Master		1			//SPI主模式
#define		SPI_Slave		0			//SPI从模式
#define		SPI_Fspi		100000		//通信速率为100K
#define		SPI_INT			1			//中断允许

#define		UARTn_n			0			//UART0
#define		UARTn_baud		9600		//波特率9600
#define		UARTn_datab		8			//8位数据位
#define		UARTn_stopb		1			//1位停止位
#define		UARTn_parity	0			//无奇偶校验位
#define		UARTn_INTEn		0			//UART中断禁止

char	str[50];
uint8	ErrType = 0;			//发生错误的类型
uint8	rcv_data;
/*********************************************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时
** 入口参数:dly		延时参数,值越大,延时越久
** 出口参数:无
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<50000; i++);
}
/*********************************************************************************************************
** 函数名称:Send_Str()
** 函数功能:将str中的数据发送到PC机上。
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void  Send_Str(void)
{
	uint8  i=0;
	while(str[i] != '\n')
		UARTn_SendByte(UARTn_n,str[i++]);
	UARTn_SendByte(UARTn_n,'\n');	
}
/*********************************************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时
** 入口参数:dly		延时参数,值越大,延时越久
** 出口参数:无
********************************************************************************************************/
void  IRQ_SPI(void)
{  
	uint8  tmp=0;  	
	tmp = SPI_SPSR;			//读取SPI状态寄存器
	rcv_data = SPI_SPDR;

	if((tmp & 0x40) != 0)	//发生写冲突	
	{
		ErrType = 2;
		sprintf(str,"SPSR_WCOL = %2x  \n",tmp);				//发生中断时状态寄存器的值
		Send_Str();
		sprintf(str,"SPSR_WCOL(Clear) = %2x  \n",SPI_SPSR);	//发送当前状态寄存器的值
		Send_Str();
	}	
	if(tmp == 0x10)			//模式错误
	{
		ErrType = 1;
		sprintf(str,"Mode Error:SPSR = %2x  \n",SPI_SPSR);	//发送当前状态寄存器的值	
		Send_Str();
		sprintf(str,"Mode Error:SPCR = %2x  \n",SPI_SPCR);	//发送当前控制寄存器的值
		Send_Str();
		while(1)							//等待SSEL变为高电平,含软件去抖
		{
			while((IO0PIN & (1<<7)) == 0);	
			DelayNS(50);
			if((IO0PIN & (1<<7)) != 0)	break;
		}		
	}
	SPI_SPINT = 0x01;		//清除中断标志位
   	VICVectAddr = 0x00;   
}
/*********************************************************************************************************
** Function name:	IRQ_Exception
** Descriptions:	interrupt exceptional handler , change it as needed
**					don't delete this function 
********************************************************************************************************/
void  IRQ_Exception(void)
{
}

uint8 const DISP_TAB[16] = { 0x5a,0xa5,0x5a,0xa5,0x5a,0xa5,0x5a,0xa5,
                             0x5a,0xa5,0x55,0xaa,0x55,0xaa,0x55,0xaa,
                           };
uint8  rcv_data; 	                   
/*********************************************************************************************************
** 函数名称:Main()
** 函数功能:演示SPI接口的模式错误现象。通过UART将信息发送到PC机上显示。
** 说明:跳线JP8短接,JP4和JP9断开。
********************************************************************************************************/
void Main(void)
{
	uint8  i = 0;
    TargetInit(VPBDIV_DATA, PLLCFG_DATA, MAMTIM_DATA);      // don't delete
    while((PLLSTAT & (1 << 10)) == 0);                      // can delete
    
	PINSEL0 = 0x00000000;	//设置I/O连接GPIO
   	PINSEL1 = 0x00000000;
	IO0DIR = HC595_CS;
	
	SPI_Init(SPI_Master,SPI_Fspi,SPI_INT);	//初始化SPI接口
	SetISR(SPI0_INT,0,(uint32)IRQ_SPI);		//设置SPI中断
	IRQEnable();
	//初始化UART
	UARTn_Init(UARTn_n,UARTn_baud,UARTn_datab,UARTn_stopb,UARTn_parity,UARTn_INTEn);
	
	while(1)	
	{  
		IO0CLR = HC595_CS;			    	// 片选
		SPI_SPDR = DISP_TAB[(i++) % 16];	//发送显示数据
		SPI_SPDR = DISP_TAB[(i++) % 16];	//会出现写冲突
  		IO0SET = HC595_CS; 
		DelayNS(100);
		while(ErrType == 1)
		{	
			ErrType = 0;
			SPI_Init(SPI_Master,SPI_Fspi,SPI_INT);	//重新初始化SPI接口
			sprintf(str,"Clear Mode Error:SPSR = %2x  \n",SPI_SPSR);	//发送当前状态寄存器的值	
			Send_Str();
			sprintf(str,"Clear Mode Error:SPCR = %2x  \n",SPI_SPCR);		//发送当前控制寄存器的值
			Send_Str();
		}
	}
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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