这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ZLG,BUG ZLG程序的BUG

共2条 1/1 1 跳转至

ZLG,BUG ZLG程序的BUG

院士
2006-09-17 18:14:16     打赏
ZLG,BUG ZLG程序的BUG



关键词: 程序    

院士
2006-12-22 22:43:00     打赏
2楼
问 /************************************************************************************
** 函数名称: INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
** 功能描述: 向 CAT1025 写入数据
** 输 入:   INT8U  addr:        CAT1025 I2C 总线地址
             INT8U  offset:        偏移地址
             INT16U len:        读的长度
             INT8U  *sendbuff:  接收数据指针
** 输 出:   实际写入的字节数
*************************************************************************************/
INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff)
{
    INT8U pages,nums,i;
    INT8U buff[PAGE_SIZE_CAT1025 + 1];                                //写入缓冲区
    INT16U actlen = 0;
    
    pages = len / PAGE_SIZE_CAT1025;                                //CAT1025一次只能写一页,一页为16字节?
    nums  = len % PAGE_SIZE_CAT1025;                                //不够整数页的字节数
    buff[0] = offset;                                                //buff[0]为写入偏移地址

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

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

这个是USB-EEPROM的实验程序,因为偏移地址正好为0所以没有问题,当偏移地址不为0,但此时第一次执行仍是写入最大页写字节,此时就会导致翻页, 1: ZLG程序的不严密处/*************************************************************************************************************************
** 函数名称: get_configuration()            Name:        get_configuration()
** 功能描述: 获取USB事件的配置值            Function:    get the configuration value of USB events
** 输     入: 无                                Input:        NULL
** 输     出: 无                                Output:        NULL
*************************************************************************************************************************/
void get_configuration(void)
{
    INT8U c = bEPPflags.bits.configuration;    //取出配置值        get the configuration value
        
    single_transmit(&c, 1);                    //发送配置值        transmit the configuration value
}

/************************************************************************************************************************
** 函数名称: set_configuration()            Name:        set_configuration()
** 功能描述: 设置USB事件的配置值            Function:    set the configuration value of USB events                        
** 输     入: 无                                Input:        NULL
** 输     出: 无                                Output:        NULL
*************************************************************************************************************************/
void set_configuration(void)
{
    if (ControlData.DeviceRequest.wValue == 0) {            
        //配置值不对,设备进入未配置状态        the configuration value is error,device enter no configuration status
        single_transmit(0, 0);                                //发向一个空包响应    respone by transmitting a empty packet
        bEPPflags.bits.configuration = 0;                    //标记未配置        mark the USB be not configurated
        init_unconfig();
        
    } else if (ControlData.DeviceRequest.wValue == 1) {        //配置设备            configurate the device
        single_transmit(0, 0);                                //发向一个空包响应    response by transmittign a empty packet
        init_unconfig();
        init_config();
        bEPPflags.bits.configuration = 1;                    //标志已配置        mark the USB has be configurated
    } else
        stall_ep0();                        //没有该请求,返回STALL     the unknown request,transmit stall
}

这个是D13的程序,INT8U c = bEPPflags.bits.configuration;    //取出配置值,这里取出配置值和发送配置值不应该是从用户自己定义的结构体中取出,若用户修改描述符的配置值将枚举无法成功。应该从描述符中取出发送或判断,如下

/*-------------------------------------------------------------------------------------------------------
** 函数名称: Get_Configuration
** 功能描述: 获取配置描述符中的bConfiguartuion Value值,系统调用
** 输 入:   无
** 输 出:   无
** 全局变量: USB_descriptor,USBEventFlags.ConfiguartionStatus
** 调用模块: ISP1161_WriteEndpoint
** 作 者:   ---
** 日 期:   2005.8.16
**-----------------------------------------------------------------------------------------------------*/
void Get_Configuartion(void)
{
if(USBEventFlags.ConfiguartionStatus==1)
ISP1161DC_WriteEndpoint(1,1,USB_Configuartion_Descriptor+5);
else
ISP1161DC_WriteEndpoint(1,1,0);
}

/*-------------------------------------------------------------------------------------------------------
** 函数名称: Set_Configuration
** 功能描述: 设置是否配置标志,系统调用
** 输 入:   无
** 输 出:   无
** 全局变量: USB_descriptor,DeviceRequestValue,USBEventFlags.ConfiguartionStatus
** 调用模块: ISP1161_WriteEndpoint,Stall_Endpoint0
** 作 者:   ---
** 日 期:   2005.8.16
**-----------------------------------------------------------------------------------------------------*/
void Set_Configuration(void)
{
if(DeviceRequestValue==0)
USBEventFlags.ConfiguartionStatus=0;                
else if(DeviceRequestValue==*(USB_Configuartion_Descriptor+5))
USBEventFlags.ConfiguartionStatus=1;                    
else
{
  Stall_Endpoint0();                        
  return;
}
ISP1161DC_WriteEndpoint(1,0,0);    
}

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]