|
<br />一, <br />1, 果在任务I2CreadWrite()中不加延时程序 1,2,连续读写EEPROM ,这个任务只会在执行一次,以后不会再执行。其他任务Buzer(void *pdata)和TaskUart0Receive能够正常运行,<br />2, 尝试过去掉pUart0Queue=OSQPend(Uart0Even,0,&err); 改为直接连续在这个任务中读写EEPROM,也不行,必须的加加延时程序 1,2,才能正常进入此任务。<br />3, 我想不明白?请教各位!<br /><br />#include "config.h"<br />#include "stdlib.h"<br /><br />/******************* Stack Define **********************/<br />#define TaskStkLengh 128//Define the Task0 stack length 定义用户任务0的堆栈长度<br />#define I2cRdWrtSize 128//Define I2c function stack length<br /> <br />OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈<br />OS_STK BuzerStk[TaskStkLengh];<br />OS_STK I2CReadWriteStk[I2cRdWrtSize];<br />OS_STK Uart0Stk[TaskStkLengh];<br /><br /><br />/********** I/O Define *****************/<br />#define BEEPCON 0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */<br /><br /><br />/********** Parameter Ddfine ******************/<br /> //---Uart0<br />#define SynUart0 0x55// Uart0 communiction start<br /><br /><br /><br />/**************Fuction Declare****************/<br />void Task0(void *pdata); //Task0 任务0<br /> <br /><br /><br />/****************************************************************************<br />//FuctionName:Buzer<br />//Description:蜂鸣器1秒叫一次<br /> //Input:<br />//Output:<br />//Author:<br />//Date:24_Apr_07<br />****************************************************************************/<br />void Buzer(void *pdata)<br />{<br /> pdata=pdata;<br /> for(;;)<br /> { <br /> IO0SET = BEEPCON;<br /> OSTimeDly(100); //延时1S <br /> IO0CLR = BEEPCON; <br /> OSTimeDly(50); <br /> } <br />}<br /><br /><br />/****************************************************************************<br />//FuctionName:I2CReadWrite<br />//Description:I2c 接收UART0的数据,再写如EEPROM,再读出,对比看正确否<br />//Input:<br />//Output:<br />//Author:<br />//Date:<br />****************************************************************************/<br />void I2CReadWrite(void *pdata)<br />{<br /> <br /> INT8U *pUart0Queue;<br /> INT8U err; <br /> INT8U ReadBuf[10]; <br /> INT8U I2cWordAdr[]={0x10};<br /> //INT8U WriteBuf[]={0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};<br /> <br /> pdata=pdata; <br /> <br /> while(1)<br /> { <br /> <br /> pUart0Queue=OSQPend(Uart0Even,0,&err); <br /> //先读到BUF,后面对比 <br /> I2cRead(CAT24WC02, ReadBuf,I2cWordAdr, 1, 10); <br /> OSTimeDly(1);//I2c不能连续读写,一定加延时,---------------1 <br /> <br /> ReadBuf[0]= *pUart0Queue; <br /> //写串口接到的数据到EEPROM <br /> I2cWrite(CAT24WC02,pUart0Queue, 10);<br /> OSTimeDly(1);------------------------------------------------------------2<br /> //再读出,对比,看正确否 <br /> I2cRead(CAT24WC02, ReadBuf, ReadBuf, 1, 10); <br /> OSTimeDly(2);<br /> <br /> /* <br /> I2cRead(CAT24WC02, ReadBuf, WriteBuf, 1, 10);<br /> OSTimeDly(100);<br /> <br /> I2cWrite(CAT24WC02, WriteBuf, 11);<br /> OSTimeDlyHMSM(0,0,2,0);//Dly 2S <br /> <br /> I2cRead(CAT24WC02, ReadBuf, WriteBuf, 1, 10);<br /> OSTimeDly(100); <br /> */ <br /> } <br />}<br /><br /><br />/****************************************************************************<br />//FuctionName:TaskUart0Receive<br />//Description:接收从上位机EasyARM软件的数据,第一字节是同步头0X55,第二字节是<br />//发送的数据字节数量<br />//Input:<br />//Output:<br />//Author:<br />//Date:9-May-07<br />****************************************************************************/<br />void TaskUart0Receive(void *pdata)<br />{<br /> INT8U *pUart0Buf;<br /> INT8U Uart0Buf[10];<br /> INT8U i=0x00;<br /> INT8U z=0x00; <br /> <br /> pdata = pdata;/* 避免编译警告 */<br /><br /> for (;;)<br /> {<br /> while (UART0Getch() != SynUart0); //第一字节是同步头0X55 <br /> z=UART0Getch(); //第二字节是发送的数据字节数量<br /> pUart0Buf = Uart0Buf; <br /> for(i=0x00;i<z;i++)<br /> { <br /> *pUart0Buf++ = UART0Getch();//Save data to Uart0Buf<br /> <br /> } <br /> <br /> OSQPostFront(Uart0Even,Uart0Buf);//发送消息Queue <br /> <br /> OSTimeDly(1); <br /> }<br />}<br /><br /><br />/******************************************************************************<br /> Task0 任务0<br />***************************************************************************/<br />void Task0 (void *pdata)<br />{<br /> pdata = pdata;<br /> <br /> TargetInit ();<br /> <br /> OSTaskCreate (Buzer,(void *)0, &BuzerStk[TaskStkLengh-1], 3);//Test Timer0 setting,<br /> <br /> OSTaskCreate(I2CReadWrite,(void*)0,&I2CReadWriteStk[I2cRdWrtSize-1],2);//I2c reading and writing fuction <br /> <br /> OSTaskCreate(TaskUart0Receive,(void*)0,&Uart0Stk[TaskStkLengh-1],1);//Uart0 receive <br /> <br /> while (1)<br /> {<br /> OSTimeDly(10);<br /> }<br />}<br /><br /><br />int main (void)<br />{<br /> PINSEL0=0X00000000;//Conection GPIO<br /> IO0DIR=BEEPCON;//I/O output pin <br /> OSInit (); <br /> OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0); <br /> OSStart ();<br /> return 0; <br />}<br /> <br />/******************************************************************************<br /> End Of File<br />******************************************************************************/<br /><br />二,<br /> 周立功的EasyArm上位机串口通讯软件不能用作串口2,3。<br /> 我主板只有一个串口,买了个扩展串口卡,但EasyArm在选用2,3时,即使不接实验板<br />它自己也能够自发自收,不需要经过实验板<br /><br />三,<br /> 我买的EasyArm自己带的I2C读写程序,I2CWRITE()函数(在基础教程P448),子地址和数据放在同个BUF里面,使用不方便。<br /> 如果24C16要使用这个模块函数,那怎么办呢?<br /><br />四,<br /> 深圳周立功分公司不提供技术支持<br /> 我在深圳的销售商那里买的EasyArm2200,问深圳周立功分公司答复不是他们那儿买的,不提供技术支持,深圳周立功分公司周末从不上班,我周末才休息,我怎么能到他们那里买呢?!<br /><br /> |
|