📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Latest modified Date: 2008-05-10
** Latest Version: 1.0
** Descriptions: ZLG_USB2400 Device 软件包示例程序USB-EEPROM编程器
**
**--------------------------------------------------------------------------------------------------------
** Created by: ZhengMingyuan
** Created date: 2005-08-08
** Version: 1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by: LingGuilin
** Modified date: 2008-05-10
** Version: 1.0
** Descriptions: ZLG_USB2400 Device 软件包示例程序USB-EEPROM编程器
**
*********************************************************************************************************/
#include "main.h"
#define TASKSTART_ID 4 /* 起动任务的ID */
#define TASKSTART_PRIO TASKSTART_ID /* 起动任务的优先级 */
#define TASKSTART_STACK_SIZE 512 /* 定义起动任务堆栈长度 */
#define TASKREAD_ID 5 /* 读任务的ID */
#define TASKREAD_PRIO TASKREAD_ID /* 读任务的优先级 */
#define TASKREAD_STACK_SIZE 512 /* 定义读任务堆栈长度 */
#define TASKWRITE_ID 6 /* 写任务的ID */
#define TASKWRITE_PRIO TASKWRITE_ID /* 写任务的优先级 */
#define TASKWRITE_STACK_SIZE 512 /* 定义写任务堆栈长度 */
OS_STK TASKSTART_STACK[TASKSTART_STACK_SIZE]; /* 起动任务堆栈 */
OS_STK TASKREAD_STACK[TASKREAD_STACK_SIZE]; /* 读任务堆栈 */
OS_STK TASKWRITE_STACK[TASKWRITE_STACK_SIZE]; /* 写任务堆栈 */
OS_EVENT *Write_Sem; /* 读任务就绪信号量 */
OS_EVENT *Read_Sem; /* 写任务就绪信号量 */
#define PAGE_SIZE_CAT1025 16 /* CAT24C04 的页面大小:16字节 */
#define CAT24C04_FirstPage (0xA4) /* CAT24C04的第1页 */
#define CAT24C04_SecondPage (0xA6) /* CAT24C04的第2页 */
#define I2C0_VIC 9 /* I2C0的VIC通道号 */
#define Usb_VIC 22 /* UDC的VIC通道号 */
#define CMD_READ_24C02 0x01 /* 读CAT24C04命令 */
#define CMD_WRITE_24C02 0x02 /* 写CAT24C04命令 */
typedef struct tagCmd
{
INT8U cmd; /* 命令: 1 -- 读; 2 -- 写 */
INT8U addr; /* CAT24C04的器件地址 */
INT16U offset; /* 读写CAT24C04的偏移地址 */
INT16U len; /* 读写长度 */
}I2C_COMMAND; /* 读写CAT24C04命令结构体 */
I2C_COMMAND I2C_2; /* 读写命令结构变量 */
INT16U ReadCAT24C04 (INT16U usOffset,
INT8U *ucRcvBuf,
INT16U usReadLen); /* CAT24C04读函数 */
INT16U WriteCAT24C04 (INT16U usOffset,
INT8U *pucWriteBuf,
INT16U usWriteLen); /* CAT24C04写函数 */
void TaskStart (void *pdata); /* 主任务函数原型声明 */
void TaskRead (void *pdata); /* 读任务函数原型声明 */
void TaskWrite (void *pdata); /* 写任务函数原型声明 */
/*********************************************************************************************************
** Function name: main
** Descriptions: 多任务启动主函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
OSInit(); /* 初始化uC/OS-II */
OSTaskCreateExt(TaskStart,
(void *)0,
&TASKSTART_STACK[TASKSTART_STACK_SIZE-1],
TASKSTART_PRIO,
TASKSTART_ID,
&TASKSTART_STACK[0],
TASKSTART_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 创建起动任务 */
OSStart(); /* 开始多任务调度 */
}
/*********************************************************************************************************
** Function name: TaskStart
** Descriptions: 接收PC机发送的CAT24C04控制信息
** input parameters: pdata 传递给任务的参数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void TaskStart (void *pdata)
{
INT8U ucErr = 0;
pdata = pdata;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
TargetInit(); /* 目标板初始化 */
I2cInit(100000); /* I2C初始化 */
vicIrqFuncSet(Usb_VIC,1,(uint32)usbDevException); /* 设置USB中断优先级为1 */
vicIrqFuncSet(I2C0_VIC,2,(uint32)I2c_Exception); /* 设置I2C0中断优先级为2 */
Write_Sem = OSSemCreate(0); /* 创建写等待信号量 */
Read_Sem = OSSemCreate(0); /* 创建读等待信号量 */
OSTaskCreateExt(TaskRead,
(void *)0,
&TASKREAD_STACK[TASKREAD_STACK_SIZE-1],
TASKREAD_PRIO,
TASKREAD_ID,
&TASKREAD_STACK[0],
TASKREAD_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 创建读任务 */
OSTaskCreateExt(TaskWrite,
(void *)0,
&TASKWRITE_STACK[TASKWRITE_STACK_SIZE-1],
TASKWRITE_PRIO,
TASKWRITE_ID,
&TASKWRITE_STACK[0],
TASKWRITE_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 创建写任务 */
ucErr = usbDevInit(3); /* 初始化USB设备控制器 */
if (ucErr != 0) { /* 若初始化失败 */
while(1);
}
while (1) {
ucErr = usbDevReadPort1((INT8U *)&I2C_2,
sizeof(I2C_COMMAND),
200); /* 读取CAT24C04控制信息 */
if (ucErr == OS_NO_ERR) {
if (I2C_2.cmd == CMD_READ_24C02) {
OSSemPost(Read_Sem); /* 发送读取CAT24C04信号量 */
}
if (I2C_2.cmd == CMD_WRITE_24C02) {
OSSemPost(Write_Sem); /* 发送写入CAT24C04信号量 */
}
}
OSTimeDly(10); /* 延时1个滴嗒 */
}
}
/*********************************************************************************************************
** Function name: TaskRead
** Descriptions: 等待读命令,从CAT24C04读取数据后通过逻辑端点2发送到PC机
** input parameters: pdata 传递给任务的参数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void TaskRead (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U ucErr = 0;
INT8U ucAck = 1;
INT8U ucRcvBuf[514];
INT16U usReadLen =0;
for (;;) {
OSSemPend(Read_Sem,0,&ucErr); /* 等待读信号量 */
ucErr = usbDevWritePort1(&ucAck,1,200); /* 应答PC主机 */
if (ucErr == USB_NO_ERR) {
usReadLen = ReadCAT24C04 (I2C_2.offset,
&ucRcvBuf[2],
I2C_2.len); /* 从CAT24C04读取数据 */
ucRcvBuf[0] = (INT8U)(usReadLen / 256); /* 成功读取字节数高字节 */
ucRcvBuf[1] = (INT8U)(usReadLen % 256); /* 成功读取字节数低字节 */
usbDevWritePort2(ucRcvBuf,
usReadLen + 2,
200); /* 向PC机发送已读取数据 */
}
}
}
/*********************************************************************************************************
** Function name: TaskWrite
** Descriptions: 等待写命令,通过逻辑端点2从PC机读取数据并将其写入CAT24C04
** input parameters: pdata 传递给任务的参数
** output parameters: 无
** Returned value: 无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -