打印
[ZLG-ARM]

I2C总线模块不能连续读写等 4 个问题

[复制链接]
2806|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
swill_333|  楼主 | 2007-5-11 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一,    
1,    果在任务I2CreadWrite()中不加延时程序 1,2,连续读写EEPROM    ,这个任务只会在执行一次,以后不会再执行。其他任务Buzer(void *pdata)和TaskUart0Receive能够正常运行,
2,    尝试过去掉pUart0Queue=OSQPend(Uart0Even,0,&err); 改为直接连续在这个任务中读写EEPROM,也不行,必须的加加延时程序 1,2,才能正常进入此任务。
3,    我想不明白?请教各位!

#include "config.h"
#include "stdlib.h"

/******************* Stack Define **********************/
#define    TaskStkLengh    128//Define the Task0 stack length 定义用户任务0的堆栈长度
#define I2cRdWrtSize    128//Define I2c function stack length
 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈
OS_STK  BuzerStk[TaskStkLengh];
OS_STK  I2CReadWriteStk[I2cRdWrtSize];
OS_STK  Uart0Stk[TaskStkLengh];


/********** I/O Define *****************/
#define      BEEPCON  0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */


/********** Parameter Ddfine ******************/
    //---Uart0
#define  SynUart0 0x55// Uart0 communiction start



/**************Fuction Declare****************/
void     Task0(void *pdata);            //Task0 任务0
   


/****************************************************************************
//FuctionName:Buzer
//Description:蜂鸣器1秒叫一次
 //Input:
//Output:
//Author:
//Date:24_Apr_07
****************************************************************************/
void Buzer(void *pdata)
{
    pdata=pdata;
    for(;;)
    {    
     IO0SET = BEEPCON;
     OSTimeDly(100); //延时1S            
     IO0CLR = BEEPCON;  
     OSTimeDly(50);      
    }                                           
}


/****************************************************************************
//FuctionName:I2CReadWrite
//Description:I2c 接收UART0的数据,再写如EEPROM,再读出,对比看正确否
//Input:
//Output:
//Author:
//Date:
****************************************************************************/
void I2CReadWrite(void *pdata)
{
 
   INT8U *pUart0Queue;
   INT8U err; 
   INT8U ReadBuf[10];       
   INT8U I2cWordAdr[]={0x10};
   //INT8U WriteBuf[]={0x01,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
      
    pdata=pdata;    
    
    while(1)
    {        
           
        pUart0Queue=OSQPend(Uart0Even,0,&err);  
      //先读到BUF,后面对比    
        I2cRead(CAT24WC02, ReadBuf,I2cWordAdr, 1, 10); 
         OSTimeDly(1);//I2c不能连续读写,一定加延时,---------------1 
          
        ReadBuf[0]= *pUart0Queue;        
       //写串口接到的数据到EEPROM                                
        I2cWrite(CAT24WC02,pUart0Queue, 10);
         OSTimeDly(1);------------------------------------------------------------2
      //再读出,对比,看正确否   
        I2cRead(CAT24WC02, ReadBuf, ReadBuf, 1, 10);  
        OSTimeDly(2);
           
     /*          
       I2cRead(CAT24WC02, ReadBuf, WriteBuf, 1, 10);
       OSTimeDly(100);
       
       I2cWrite(CAT24WC02, WriteBuf, 11);
       OSTimeDlyHMSM(0,0,2,0);//Dly 2S  
       
       I2cRead(CAT24WC02, ReadBuf, WriteBuf, 1, 10);
       OSTimeDly(100);  
      */         
    }             
}


/****************************************************************************
//FuctionName:TaskUart0Receive
//Description:接收从上位机EasyARM软件的数据,第一字节是同步头0X55,第二字节是
//发送的数据字节数量
//Input:
//Output:
//Author:
//Date:9-May-07
****************************************************************************/
void  TaskUart0Receive(void *pdata)
{
    INT8U *pUart0Buf;
    INT8U Uart0Buf[10];
    INT8U i=0x00;
    INT8U z=0x00;    
    
    pdata = pdata;/* 避免编译警告 */

    for (;;)
    {
        while (UART0Getch() != SynUart0);  //第一字节是同步头0X55   
        z=UART0Getch();  //第二字节是发送的数据字节数量
         pUart0Buf = Uart0Buf;                 
        for(i=0x00;i<z;i++)
        {                              
            *pUart0Buf++ = UART0Getch();//Save data to Uart0Buf
                         
        } 
                    
        OSQPostFront(Uart0Even,Uart0Buf);//发送消息Queue        
            
        OSTimeDly(1);                   
    }
}


/******************************************************************************
                            Task0 任务0
***************************************************************************/
void Task0    (void *pdata)
{
    pdata = pdata;
    
    TargetInit ();
   
    OSTaskCreate (Buzer,(void *)0, &BuzerStk[TaskStkLengh-1], 3);//Test Timer0 setting,
    
    OSTaskCreate(I2CReadWrite,(void*)0,&I2CReadWriteStk[I2cRdWrtSize-1],2);//I2c reading and writing fuction       
    
    OSTaskCreate(TaskUart0Receive,(void*)0,&Uart0Stk[TaskStkLengh-1],1);//Uart0 receive     
              
    while (1)
    {
        OSTimeDly(10);
    }
}


int main (void)
{
    PINSEL0=0X00000000;//Conection GPIO
    IO0DIR=BEEPCON;//I/O output pin    
    OSInit ();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 0);        
    OSStart ();
    return 0;                                                            
}
   
/******************************************************************************
                        End Of File
******************************************************************************/

二,
  周立功的EasyArm上位机串口通讯软件不能用作串口2,3。
  我主板只有一个串口,买了个扩展串口卡,但EasyArm在选用2,3时,即使不接实验板
它自己也能够自发自收,不需要经过实验板

三,
   我买的EasyArm自己带的I2C读写程序,I2CWRITE()函数(在基础教程P448),子地址和数据放在同个BUF里面,使用不方便。
   如果24C16要使用这个模块函数,那怎么办呢?

四,
  深圳周立功分公司不提供技术支持
  我在深圳的销售商那里买的EasyArm2200,问深圳周立功分公司答复不是他们那儿买的,不提供技术支持,深圳周立功分公司周末从不上班,我周末才休息,我怎么能到他们那里买呢?!

相关帖子

沙发
malaohu| | 2007-5-11 19:48 | 只看该作者

说实话,你的帖子太长了看不下去:(

sorry,我也不太懂

使用特权

评论回复
板凳
swill_333|  楼主 | 2007-5-14 09:52 | 只看该作者

谢谢提醒!

谢谢 malaohu 提醒!

使用特权

评论回复
地板
zlgARM| | 2007-5-14 19:05 | 只看该作者

swill_333

uc/os下,任务不能执行的原因是优先级不够,无法在任务调度中获得运行权。请您分析一下加了延时和没加延时这两种情况下,任务的优先级变化。
最好能自己模拟地画出运行任务变化的状态图。

使用特权

评论回复
5
swill_333|  楼主 | 2007-5-15 08:52 | 只看该作者

谢谢 zlgARM ,我继续努力

谢谢 zlgARM 指点,我试一试.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

32

帖子

0

粉丝