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

📄 rm-idd-2214.c

📁 工业级 ARM7 LPC2210通过I2C接口读写AT24C02,用于存储命令
💻 C
字号:
/****************************************************************************
* 文件名:DATARET.C
* 功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,将接收计数值加一后输
*      出LED1--LED8显示,并将数据原封不动地发送回上位机。
* 说明:将跳线器JP8短接。
*      通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
****************************************************************************/
#include  "config.h" 
#include  "I2CInt.h"

#define   UART_BPS	4800			/* 定义通讯波特率 */
#define   CAT24WC02 0xA0            /* 定义器件地址 */

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



uint8  rcv_buf[39];       		// UART0数据接收缓冲区
uint8  countdata;
volatile uint8  rcv_new;     	// 接收新数据标志


// EEPROM 0X00--0X0F
uint8  Singel_A_CheckTime;
uint8  Singel_A_Frequency;
uint8  Singel_A_NoFireDelay;
uint8  Single_A_Q;

uint8  Double_A_CheckTime;
uint8  Double_A_Frequency;
uint8  Double_A_NoFireDelay;
uint8  Double_A_Q;


// EEPROM 0X10--0X1D
uint8  Double_B_CheckTime;
uint8  Double_B_Frequency;
uint8  Double_B_NoFireDelay;
uint8  Double_B_Q;

uint8  Flag_Single_Double;
uint8  Flag_A_B;
uint8  Flag_Enable_Bypass;


// EEPROM 0X20--0X27
uint16 A_pps;
uint16 B_pps;



extern SendByte(uint8);
extern UART1_SendByte(uint8);


extern ADC(void);
extern DAC(void);
extern DataRet(void);
extern Relay(void);



#define   PA0     0X00010000       // P2.16
#define   PA1     0x00020000       // P2.17
#define   PA2     0x00040000       // P2.18
#define   PA3     0x00080000       // P2.19

#define   PA4     0x00100000       // P2.20

#define   PA5     0x00200000       // P2.21
#define   PA6     0x00400000       // P2.22
#define   PA7     0x00800000	   // P2.23



#define   PB0     0X01000000       // P2.24
#define   PB1     0X02000000       // P2.25



#define   PB4     0X10000000       // P2.28
#define   PB5     0X28000000       // P2.29
#define   PB6     0X40000000       // P2.30
#define   PB7     0X80000000       // P2.31

#define   P2_DIR  0XFBFF0000



#define   PB2     0X20000000       // P0.29
#define   PB3     0X40000000       // P0.30
#define   P0_DIR  0X60000000


  
  

 /****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<50; i++);
}
   




/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART0_Ini(uint32 baud, UARTMODE set)
{  uint32  bak;
   
   // 参数过滤 
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   // 设置串口波特率 
   U0LCR = 0x80;                        // DLAB位置1
   bak = (Fpclk>>4)/baud;
   U0DLM = bak>>8;
   U0DLL = bak&0xff;
   
   // 设置串口模式 
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
   bak |= set.parity<<4;              	// 设置奇偶校验
      
   U0LCR = bak;
   
   return(1);
}




             
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口1。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:无
****************************************************************************/  
void  UART1_Ini(void)
{  uint16 Fdiv;

   U1LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;  // 设置波特率
   U1DLM = Fdiv / 256;							
   U1DLL = Fdiv % 256;						
   U1LCR = 0x03;
}
       
       
       
       
/****************************************************************************
* 名称:Time0Init()
* 功能:定时器0初始化函数
* 出口参数:无
****************************************************************************/    
void  Time0Init(void)
{   /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
	   Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
	*/
	T0PR = 99;			    					// 设置定时器0分频为100分频,得110592Hz
	T0MCR = 0x03;		   						// 匹配通道0匹配中断并复位T0TC
	//T0MR0 = 110592;	    						// 比较值(1S定时值)
	T0MR0=20000;
	T0TCR = 0x03;		   						// 启动并复位T0TC
	T0TCR = 0x01; 
	
	
}
       
       
       
       
       
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART0(void)
{ 
	//uint8 buffer;
	
   if( 0x04==(U0IIR&0x0F) ) rcv_new = 1;// 设置接收到新的数据标志
      
   T0TCR = 0x03;		   						// 启动并复位T0TC
   T0TCR = 0x01; 
   rcv_buf[countdata] = U0RBR;
   countdata++;
    
   //UART1_SendByte(0x33); 
   //UART1_SendByte(rcv_buf[countdata-1]);
   //UART1_SendByte(buffer);
   
   VICVectAddr = 0x00;              	// 中断处理结束
}  
       
       
/****************************************************************************
* 名称:IRQ_Time0()
* 功能:定时器0中断响应函数
* 出口参数:无
****************************************************************************/       
void __irq  IRQ_Time0(void)
{  
   //UART1_SendByte(0x11);
   countdata=0;
   T0IR = 0x01;	    			            	// 清除中断标志
   VICVectAddr = 0x00;				            // 通知VIC中断处理结束
}

        
        
/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c		初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void  I2C_Init(uint32 fi2c)
{  if(fi2c>400000) fi2c = 400000;

   //PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

   I2SCLH = (Fpclk/fi2c + 1) / 2;	// 设置I2C时钟为fi2c
   I2SCLL = (Fpclk/fi2c) / 2;
   I2CONCLR = 0x2C;
   I2CONSET = 0x40;					// 使能主I2C
   
   /* 设置I2C中断允许 */
   VICIntSelect = 0x00000000;		// 设置所有通道为IRQ中断
   VICVectCntl3 = 0x29;				// I2C通道分配到IRQ slot 0,即优先级最高
   VICVectAddr3 = (int)IRQ_I2C;	    // 设置I2C中断向量地址	
   VICIntEnable = 0x0270;           // 使能I2C中断 
}
             
 
void CheckI2CData()
{

    
	uint8  data_buf[38];
	uint8  i;
	
	//  测试程序
	for(i=0;i<38;i++) data_buf[i]=0x11+i;
 	ISendStr(CAT24WC02, 0x00, data_buf, 16);	// 在0x00地址处写入16字节数据
 	DelayNS(1);
 	ISendStr(CAT24WC02, 0x10, data_buf+16, 14);	// 在0x00地址处写入14字节数据
 	DelayNS(1);
 	ISendStr(CAT24WC02, 0x20, data_buf+30, 8);	// 在0x00地址处写入8字节数据
    
    DelayNS(1); 
    for(i=0; i<38; i++) data_buf[i] = 0;
    IRcvStr(CAT24WC02, 0x00, data_buf, 16);	// 在0x00地址处读出10字节数据
    DelayNS(1);
    IRcvStr(CAT24WC02, 0x10, data_buf+16, 14);	// 在0x00地址处读出10字节数据
    DelayNS(1);
    IRcvStr(CAT24WC02, 0x20, data_buf+30, 8);	// 在0x00地址处读出10字节数据
    DelayNS(1);
    for(i=0;i<38;i++) SendByte(data_buf[i]);
   
    UART1_SendByte(0xaa);
    


}


                        

/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int  main(void)
{  
   UARTMODE  uart0_set;
   //uint8 i; 
   uint8 test;
   //uint8  data_buf[10];
     
        
   PINSEL0 = 0x00050055;                // 设置I/O连接到UART0、UART1
   PINSEL1 = 0x00000000; 
   PINSEL2 = 0x00000914;                
                      
   rcv_new = 0;
   
   uart0_set.datab = 8;                 // 8位数据位
   uart0_set.stopb = 1;                 // 1位停止位
   uart0_set.parity = 0;                // 无奇偶校验
   UART0_Ini(UART_BPS, uart0_set);        // 初始化串口模式
   //UART0_Ini();
   UART1_Ini();
   
   U0FCR = 0x01;                        // 使能FIFO,并设置触发点为8字节
   U0IER = 0x01;                        // 允许RBR中断,即接收中断
   
   
   /* 设置I2C中断允许 */
   
   
   
  
   /* 设置中断允许 */
   VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
   VICVectCntl2 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
   VICVectAddr2 = (int)IRQ_UART0;       // 设置UART0向量地址
   VICIntEnable = 0x00000270;           // 使能UART0中断
   
   
   /* 设置定时器1中断IRQ */
   
   /* 设置定时器0中断IRQ */
	VICIntSelect = 0x00;						// 所有中断通道设置为IRQ中断
	VICVectCntl0 = 0x24;						// 定时器0中断通道分配最高优先级(向量控制器0)
	VICVectAddr0 = (uint32)IRQ_Time0; 			// 设置中断服务程序地址向量 
	VICIntEnable = 0x00000270;					// 使能定时器0中断
   
   
   
   
    IO0DIR = P0_DIR;
   IO2DIR = P2_DIR; 
   // PA、PB初始化
     
     IO2SET=PB0;  //
     IO2CLR=PB1;
     IO0SET=PB2;
     IO0CLR=PB3;  //
     
     
     //   IO2CLR=PB4;
  //   IO2SET=PB5;
     
   //  IO2SET=PB7;
     
     
     
    // IO2CLR=PA0;
     
      IO2SET=PA0;
      
     IO2CLR=PA1;
     IO2CLR=PA2;
     
    // IO2SET=PA4;
    // IO2CLR=PA5;
          
    // IO2SET=PA7;
    

   
   countdata=0;
   test=0;
   Time0Init();
   I2C_Init(100000);                      	// I2C初始化
   
   while(1)
   {
   	/*  //UART1_SendByte(0xaa);
      //CheckI2CData();
      IO2SET=PB1;
      DelayNS(10);
      IO2CLR=PB1;
      DelayNS(10);*/
   }  
  
  /*
   while(1)
   {
   // i2c
   for(i=0; i<10; i++) data_buf[i] = i+'0';
   ISendStr(CAT24WC02, 0x00, data_buf, 10);	// 在0x00地址处写入10字节数据
   DelayNS(10);
   
   for(i=0; i<10; i++) data_buf[i] = 0;
   IRcvStr(CAT24WC02, 0x00, data_buf, 10);	// 在0x00地址处读出10字节数据
   
   for(i=0;i<10;i++) UART1_SendByte(data_buf[i]);
   DelayNS(100);
   }
   */
  
  
   /*
   while(1)
   {
   
   		
   	    // A/D转换程序
    	ADC();
   	 
   	 
   	 	// 继电器和发光管处理程序
    	Relay();
    	
    	
    	// A/D转换程序
    	DAC();
    	
    	
    	
    	 // 串口处理程序
    	if( (1==rcv_new) && (0==countdata) )
    	{   
    	    DataRet();
    	    rcv_new=0; 	       		
	
    	}  	
    	
   	   
   	   
    
   		
   		
   
   } 
  
  
  
	
   
   */
   return(0);
}

⌨️ 快捷键说明

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