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

📄 595spi.c

📁 基于LPC2129的开关量输入源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************
 * Copyright (c) 2007,tianjin university  andouwa       *
 * All rights reserved.                                 *
*********************************************************
 * 文件名称:595spi.c                                   *
 * 摘 要:arm用spi口控制数字电位器的函数定义            *
*********************************************************
 * 当前版本:v0.1                                       *
 * 作 者:   安豆娃                                     *
 * 完成日期:                                           *
********************************************************/
#include  "config.h" 

#define   SPI_STOR_CLK     (1<<21)
#define   SPI_CLK          (1<<22)
#define   SPI_DATA         (1<<23)
#define   HC541A_EN        (1<<24)
#define   HC541B_EN        (1<<25)

#define   MODE_S      0x00100000                            //485写数据使能端宏定义
#define   UART0       0x00000005                            //串口引脚功能宏定义

/* 定义串口模式设置数据结构 */
typedef  struct  UartMode
{  uint8 datab;         // 字长度,5/6/7/8
   uint8 stopb;         // 停止位,1/2
   uint8 parity;    	  // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}UARTMODE;


fp32      Tpclk = 11059200.0;

uint16    Cont1_freq;
uint16    Cont2_freq;
uint16    Cont3_freq;
uint16    Cont4_freq;

uint8     frenq[2];


/****************************************************************************
* 名称:RstWdt()
* 功能:看门狗喂狗操作。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  RstWdt(void)
{  
	 
   WDFEED = 0xAA;
   WDFEED = 0x55;
   
}


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

/****************************************************************************
* 名称:Initboard()                      需要修改
* 功能:初始化板子 I/O口功能 方向
****************************************************************************/
void Initboard()
{
   PINSEL0  = 0x000CC0C0;			              //四个中断引脚  具体的第二功能引脚及引脚方向在各自初始化化函数中完成
   PINSEL1  = 0x00000001;                   //P0.16 P0.3 P0.7 P0.9
  
   
   T0PR = 0;			    	                    // 设置定时器0 为0分频
   
   WDTC  = 0xB9A000;					  // 设置WDTC,喂狗重装值  1s内没有给看门狗写数  就会复位!
   WDMOD = 0x03;						  // 设置并启动WDT
   
   RstWdt();
}

/****************************************************************************
* 名称:IRQ_Eint0()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint0(void)
{  
	 static uint8  count = 0;
	 fp32          Tc_value;
	 
	 if(count == 1)
	 {
	 		T0TCR = 0x03;		   							// 启动并复位T0TC
	 		T0TCR = 0x01; 
	 }
	 else if(count == 2)
	 {
	 		T0TCR = 0x00;                   // 停止T0TC
	 		Tc_value   = T0TC + 2.75;
	 		Cont1_freq = (uint16)(Tpclk/Tc_value + 0.5);
	 		count = 0;
	 		   
	 	//	Eint0_flag = 1;	
	 }
	 
	 while( (EXTINT&0x01)!=0 )	        //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)	
   {  
      EXTINT = 0x0F;		              // 清除EINT0中断标志
   }
   
   count++;
   
   VICVectAddr = 0;			     					// 向量中断结束  退出中断时必须 
}		

/****************************************************************************
* 名称:IRQ_Eint1()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint1(void)
{  
	 static uint8  count = 0;
	 fp32          Tc_value;
	 
	 if(count == 1)
	 {
	 		T0TCR = 0x03;		   							// 启动并复位T0TC
	 		T0TCR = 0x01; 
	 }
	 else if(count == 2)
	 {
	 		T0TCR = 0x00;                   // 停止T0TC
	 		Tc_value   = T0TC + 3.5;
	 		Cont2_freq = (uint16)(Tpclk/Tc_value + 0.5);
	 		count = 0;
	 		
	 	//	Eint1_flag = 1;	
	 }
	 
	 while( (EXTINT&0x02)!=0 )	        //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)	
   {  
      EXTINT = 0x0F;		              // 清除EINT0中断标志
   }
   
   count++;

   VICVectAddr = 0;			     					// 向量中断结束  退出中断时必须 
}		

/****************************************************************************
* 名称:IRQ_Eint2()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint2(void)
{  
	 static uint8  count = 0;
	 fp32          Tc_value;
	 
	 if(count == 1)
	 {
	 		T0TCR = 0x03;		   							// 启动并复位T0TC
	 		T0TCR = 0x01; 
	 }
	 else if(count == 2)
	 {
	 		T0TCR = 0x00;                   // 停止T0TC
	 		Tc_value   = T0TC + 3.5;
	 		Cont3_freq = (uint16)(Tpclk/Tc_value + 0.5);
	 		count = 0;	
	 		
	 	//	Eint2_flag = 1;
	 }
	 
	 while( (EXTINT&0x04)!=0 )	        //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)	
   {  
      EXTINT = 0x0F;		              // 清除EINT0中断标志
   }
   
   count++;
   
   VICVectAddr = 0;			     					// 向量中断结束  退出中断时必须
}		

/****************************************************************************
* 名称:IRQ_Eint3()
* 功能:外部中断EINT0服务函数,取反LED1。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_Eint3(void)
{  
	 static uint8  count = 0;
	 fp32          Tc_value;
	 
	 if(count == 1)
	 {
	 		T0TCR = 0x03;		   							// 启动并复位T0TC
	 		T0TCR = 0x01; 
	 }
	 else if(count == 2)
	 {
	 		T0TCR = 0x00;                   // 停止T0TC
	 		Tc_value   = T0TC + 3.5;
	 		Cont3_freq = (uint16)(Tpclk/Tc_value + 0.5);
	 		count = 0;	
	 		
	 	//	Eint3_flag = 1;
	 }
	 
	 while( (EXTINT&0x08)!=0 )	        //等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)	
   {  
      EXTINT = 0x0F;		              // 清除EINT0中断标志
   }
   
   count++;
 
   VICVectAddr = 0;			     					// 向量中断结束  退出中断时必须
}

/*******************************************************************
Eint_init()  键盘初始化函数    对应的I/O口  P1.23-P1.25设置为输入  
           并设置使能相应的中断
参数:     无
********************************************************************/
void Eint_init()
{   
   EXTMODE  = 0x00;	    	              // 设置EINT中断均为高电平触发模式
   EXTPOLAR = 0x0F;
   
   VICIntSelect = 0x00000000;		        // 设置所有中断分配为IRQ中断
   
   VICVectCntl0 = 0x20|14;							// 分配EINT0中断到向量中断1
   VICVectCntl1 = 0x20|15;							// 分配EINT0中断到向量中断2
   VICVectCntl2 = 0x20|16;							// 分配EINT0中断到向量中断3
   VICVectCntl3 = 0x20|17;							// 分配EINT0中断到向量中断4
   
   VICVectAddr0 = (int)IRQ_Eint0; 			// 设置中断服务程序地址
   VICVectAddr1 = (int)IRQ_Eint1; 			// 设置中断服务程序地址
   VICVectAddr2 = (int)IRQ_Eint2; 			// 设置中断服务程序地址
   VICVectAddr3 = (int)IRQ_Eint3; 			// 设置中断服务程序地址
   
   EXTINT = 0x0F;		                    // 清除EINT中断标志	
  // VICIntEnable = 0x0003C000;		        // 使能EINT中断
}

/****************************************************************************
* 名称:spiinit()

⌨️ 快捷键说明

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