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

📄 main.c

📁 周立功easyarm2200平台第5章试验代码
💻 C
字号:

#include "config.h"					//包含LPC22xx模板的配置头文件
#include "D12Driver.h"				//包含PDIUSBD12驱动程序的头文件
#include "I2C.h"					//包含I2C总线中间件的头文件

#define PAGE_SIZE_24C02	 16			//CAT24WC02的页面大小:16字节
#define CMD_READ_24C02	 0x01		//读CAT24WC02命令
#define CMD_WRITE_24C02	 0x02		//写CAT24WC02命令

OS_STK  TaskStartStk[128];			// 操作系统起动任务堆栈
OS_STK  ReadTaskStk[256];			// 读任务堆栈
OS_STK  WriteTaskStk[256];			// 写任务堆栈

OS_EVENT *Write_Sem;				// 读任务就绪信号量
OS_EVENT *Read_Sem;					// 写任务就绪信号量

void Init_I2CInt(void);				//I2C中断初始化程序
INT16U Read_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff);
INT16U Write_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff);

void TaskStart(void *pdata);	
void TaskRead(void *pdata);
void TaskWrite(void *pdata);

typedef struct tagCmd			//读写CAT24WC02命令结构体
{
	INT8U  cmd;					//命令: 1 -- 读; 2 -- 写
	INT8U  addr;				//I2C器件CAT24WC02的地址
	INT8U  offset;				//读写CAT24WC02存储空间的偏移地址
	INT16U len;					//读写长度
}I2C_COMMAND;

I2C_COMMAND I2C;				//读写命令结构变量

extern void Usb_Handler(void);
/************************************************************
** 函数名称: void Init_D12Int(void)
** 功能描述: 初始化D12的中断,设置D12的中服务程序地址
** 输   入: 无
** 输   出: 无
************************************************************/
void Init_D12Int(void)
{
	VICVectCntl1 = (0x20 | 0x0E);			//EINT0通道分配到IRQ slot 1
   	VICVectAddr1 = (INT32U)Usb_Handler;		//设置EINT0向量地址
   	VICIntEnable = 1 << 14;					//允许EINT0
}

/**********************************
			主函数
***********************************/
int main (void)
{
    OSInit();                               //初始化 uC/OS-II
    
    OSTaskCreate(TaskStart,(void *)0, &TaskStartStk[127], 3);
    							           //创建起动任务
    OSStart();                             //开始多任务
}

/**********************************
*       起动任务,优先级 3
***********************************/
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3          /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U err;
	pdata = pdata;               	 /* Prevent compiler warning */

	TargetInit();          		 	 // μC/OS-II定时器及相关中断初始化
	I2cInit(30000);				 	 // I2C控制器初始化	
	Init_I2CInt();					 // 初始化I2C的中断
	Init_D12Int();					 // 配置D12的中断
	err = Init_D12();			  	 // PDIUSBD12初始化
	
	Write_Sem = OSSemCreate(0);	 	 // 创建控制读写任务的两个信号量,信号量初值为0
	Read_Sem  = OSSemCreate(0);   
	OSTaskCreate(TaskRead,(void *)0, &ReadTaskStk[255], 1);	   	//创建读任务
	OSTaskCreate(TaskWrite,(void *)0, &WriteTaskStk[255], 2);	//创建写任务
			            
	if (err == 0)				  	 // 如果初始化PDIUSBD12成功,才创建传输控制处理任务
  		OSTaskCreate(TaskSetup,(void *)0, &TaskSetupStk[127], 0);
  		
  	for (;;){
  		err = ReadPort1(sizeof(I2C_COMMAND),(INT8U *)&I2C,200);		//等待来自PC机的命令
		if (err == OS_NO_ERR){						//接收正确
			if (I2C.cmd == CMD_READ_24C02)				
				OSSemPost(Read_Sem);				//使读任务就绪
			if (I2C.cmd == CMD_WRITE_24C02)
				OSSemPost(Write_Sem);				//使写任务就绪
		} 		 
    }  
 }

/*************************************************
** 函数名称: void TaskRead(void *pdata)
** 功能描述: 写 CAT24WC02 任务,优先级为1
** 输 入:   无
** 输 出:   无
**************************************************/
void TaskRead(void *pdata)
{
#if OS_CRITICAL_METHOD == 3           /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U err,buff[260];			  //接收缓冲区
	INT8U ack = 0x01;				  //应答字
	INT16U reclen;
	
	for (;;){ 
	
    	OSSemPend(Read_Sem,0,&err);										//等待TaskStart读命令
    	err = WritePort1(1,&ack,200);									//应答PC主机
    	if (err == USB_NO_ERR){	 										//应答正确
    										   
   	   		reclen = Read_24WC02(I2C.addr,I2C.offset,I2C.len,&buff[2]); //读取数据   			
    																	
    		buff[0] = reclen / 256;
    		buff[1] = reclen % 256;
  	 		WritePort2(reclen + 2,buff,200);			//发送读取到的数据
   	  	}
    }
}

/*************************************************
** 函数名称: void TaskWrite(void *pdata)
** 功能描述: 写 CAT24WC02 任务,优先级为2
** 输 入:   无
** 输 出:   无
**************************************************/
void TaskWrite(void *pdata)
{
#if OS_CRITICAL_METHOD == 3           /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
	INT8U err,buff[260];			//发送缓冲区
	INT8U ack = 0x02;				//应答字
	INT16U actlen;
	
	for (;;){ 
	
    	OSSemPend(Write_Sem,0,&err);					//等待TaskStart的命令
        err = WritePort1(1,&ack,200);					//应答PC机
    	
    	if (err == USB_NO_ERR){							//应答正确
    	
    		err = ReadPort2(I2C.len,buff,200);			//接收要写入的数据
  											    		
       		if (err == USB_NO_ERR){						//接收正确
    			actlen = Write_24WC02(I2C.addr,I2C.offset,I2C.len,buff);  //执行写入  		
    		    		
    			buff[0] = actlen / 256;
    			buff[1] = actlen % 256;
       			WritePort1(2,buff,200);						//发送实际写入的字节数
       		}
   	  	}
    }
}

/********************************************************************************
** 函数名称: INT16U Read_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff)
** 功能描述: 从CAT24WC02读取数据
** 输 入:   INT8U  addr:	    CAT24WC02的 I2C 总线地址
			 INT8U  offset:		偏移地址 
			 INT16U len:		读的长度
			 INT8U  *recbuff:   接收数据指针
** 输 出:   实际读取到的字节数
*********************************************************************************/
INT16U Read_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff)
{
	INT16U actlen = 0;
	
	actlen = I2cRead(addr,recbuff,&offset,1,len);   //读取数据并记录读到的字节数
											
	return actlen;									//返回实际读到的字节数
}


/************************************************************************************
** 函数名称: INT16U Write_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
** 功能描述: 向 CAT24WC02 写入数据
** 输 入:   INT8U  addr:	    CAT24WC02的 I2C 总线地址
			 INT8U  offset:		偏移地址 
			 INT16U len:		读的长度
			 INT8U  *sendbuff:  接收数据指针
** 输 出:   实际写入的字节数
*************************************************************************************/
INT16U Write_24WC02(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
{
	INT8U pages,nums,i;
	INT8U buff[PAGE_SIZE_24C02 + 1];			//写入缓冲区
	INT16U actlen = 0;
	
	pages = len / PAGE_SIZE_24C02;				//CAT24WC02一次只能写一页,一页为16字节?
	nums  = len % PAGE_SIZE_24C02;				//不够整数页的字节数
	buff[0] = offset;					    	//buff[0]为写入偏移地址

	for (i = 0; i < pages; i++)
	{
		memcpy(&buff[1],sendbuff,PAGE_SIZE_24C02);		  		//将要写入的数据复制到写入缓冲区
		actlen += I2cWrite(addr,buff,PAGE_SIZE_24C02 + 1) - 1;  //写入数据并记录已写入的字节数
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);		  			//延时10ms的时间让CAT24WC02	
												  				//内部执行写操作
   		sendbuff += PAGE_SIZE_24C02;
	   	buff[0]  += PAGE_SIZE_24C02;
	}

	if (nums > 0)
	{											//下面写不够整数页的字节数
		memcpy(&buff[1],sendbuff,nums);
		actlen += I2cWrite(addr,buff,nums + 1) - 1;
		OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
 	}
	
	return actlen;								//返回实际写入的字节数
}


/************************************************************************************
** 函数名称: void Init_I2CInt(void)
** 功能描述: 初始化I2C总线控制器的中断
** 输 入:   无
** 输 出:   无
*************************************************************************************/
void Init_I2CInt(void)
{
	extern void I2c_Handler(void);
	
    VICVectAddr12 = (uint32)I2c_Handler;	// 设置I2C中断向量地址
    VICVectCntl12 = (0x20 | 9);				// I2C中断分配到IRQ slot 2
   	//VICIntEnable = 1 << 9;				// 暂时不允许I2C中断
 }

⌨️ 快捷键说明

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