发 帖  
【四旋翼飞行器】76小时吃透四轴算法!史上最强软硬结合实战项目,👉戳此立抢👈
[问答] 函数返回值一直都是0x00
128 I2C IIC
分享
我又一个IIC的读函数如下;
u8 I2C_Read_Byte(unsigned char ack)  
{  
    //unsigned char i,receive=0;  
                u8 i,receive = 0;
    SDA_IN();
    for(i=0;i<8;i++ )  
    {  

                                SCL_H();
                          delay_us(5);
        receive<<=1;
                        
        if(READ_SDA())receive++;     
        delay_us(5);
        SCL_L();   
        delay_us(5);                        
    }                     
    if (!ack)  
        I2C_NACK();
    else  
        I2C_ACK();   
               
    return receive;  
}  


他的上一层是:void I2C_Read_Function(u8 ReadAddr,u8 ReData)
{
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_W);
    if(I2C_Wait_ACK())return;  
    I2C_Send_Byte(ReadAddr);
    if(I2C_Wait_ACK())return;  
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_R);      
    if(I2C_Wait_ACK())return;  
    ReData = I2C_Read_Byte(0);  
    I2C_STOP();  

}
而这个函数的上一层是:
I2C_Read_Function(PCF8563_SECOND_REGISTER,R_date.Second_Time);
这个函数在调试的时候发现,receive是有读取到值,当我顶层调用的时候,ReData也是有值的,可是顶层R_date.Second_Time的值一直都是0x00
这个是什么原因呢,数据类型都是U8没有问题啊?
0
2019-1-10 09:09:00   评论 分享淘帖 邀请回答
14个回答
你的意思参数必须得定义成指针吗,是这样吗,我之前也有直接传递变量的时候啊
2019-1-10 09:41:00 评论

举报

YY599566 发表于 2019-1-10 17:45
你的意思参数必须得定义成指针吗,是这样吗,我之前也有直接传递变量的时候啊

如果,你是需要往函数里传入值,可以直接传递变量,如果你要从函数返回值,要么直接返回,要么通过参数的指针来操作函数外层的参数
2019-1-10 10:00:21 评论

举报

dingyang598 发表于 2019-1-10 18:05
如果,你是需要往函数里传入值,可以直接传递变量,如果你要从函数返回值,要么直接返回,要么通过参数的指针来操作函数外层的参数

本帖最后由 watercici 于 2018-5-3 17:04 编辑

那下面这个函数呢:

        R_date.Second_Time = (u8)BCDToDec(R_date.Second_Time & 0x7f);                  

unsigned char BCDToDec(unsigned char _BCD)
{
  unsigned char temp = 0;
        unsigned char temp1 = 0;

  temp = ((unsigned char)(_BCD & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
  temp1 = temp + (_BCD & (unsigned char)0x0F);
        return temp1;
}
这个是temp1的返回值给不了R_date.Second_Time,这个是怎么回事??
在线等,谢谢,有点儿着急
2019-1-10 10:05:53 评论

举报

YY599566 发表于 2019-1-10 18:10
本帖最后由 watercici 于 2018-5-3 17:04 编辑

那下面这个函数呢:

你这个函数是对的呀,你在PC上单独测试这个函数是正确的
2019-1-10 10:14:58 评论

举报

YY599566 发表于 2019-1-10 18:10
本帖最后由 watercici 于 2018-5-3 17:04 编辑

那下面这个函数呢:

老铁 黑皮男说的对
你坚持值传递也可以如下
u8 I2C_Read_Function(u8 ReadAddr)
{
u8 ReData ;
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_W);
    if(I2C_Wait_ACK())return;  
    I2C_Send_Byte(ReadAddr);
    if(I2C_Wait_ACK())return;  
    I2C_START();  
    I2C_Send_Byte(PCF8563_ADDR_R);      
    if(I2C_Wait_ACK())return;  
    ReData = I2C_Read_Byte(0);  
    I2C_STOP();  
return ReData ;

}



R_date.Second_Time=I2C_Read_Function(PCF8563_SECOND_REGISTER);
2019-1-10 10:28:24 评论

举报

vywyefswer 发表于 2019-1-10 18:19
你这个函数是对的呀,你在PC上单独测试这个函数是正确的

可是,我的值传不上来,现在也不能调试,一点运行按钮,就停止,PC指针指向0x00000000
2019-1-10 10:45:12 评论

举报

YY599566 发表于 2019-1-10 18:49
可是,我的值传不上来,现在也不能调试,一点运行按钮,就停止,PC指针指向0x00000000

本帖最后由 anobodykey 于 2018-5-3 17:42 编辑

你的BCDToDec函数是对的,返回值可以正确的返回,你可以通过PC来测试

可以看到num的值是变了的,至于你说的在单片机上,值传不上来是其他的问题。

2019-1-10 10:53:54 评论

举报

void I2C_Read_Function(u8 ReadAddr,u8 ReData),这里是错误的。要么用指针入口,要么用返回结果。
2019-1-10 11:01:30 评论

举报

YY599566 发表于 2019-1-10 18:10
本帖最后由 watercici 于 2018-5-3 17:04 编辑

那下面这个函数呢:

入口的内容是什么,如果是0返回0是正常的。
2019-1-10 11:15:51 评论

举报

你逐行检测循环,看看数值在什么地方开始错误
2019-1-10 11:33:49 评论

举报

TOPCB 发表于 2019-1-10 19:06
void I2C_Read_Function(u8 ReadAddr,u8 ReData),这里是错误的。要么用指针入口,要么用返回结果。

对,这个问题弄明白了,是形参实参的问题
2019-1-10 11:44:25 评论

举报

TOPCB 发表于 2019-1-10 19:06
void I2C_Read_Function(u8 ReadAddr,u8 ReData),这里是错误的。要么用指针入口,要么用返回结果。

对,这个问题弄明白了,是形参实参的问题
2019-1-10 12:02:05 评论

举报

2019-1-10 12:08:33 评论

举报

结贴:这个问题主要是形参实参的问题,实参可以传递给形参,但形参不能传给实参
2019-1-10 12:21:15 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

提问题
课程
    关闭

    站长推荐 上一条 /7 下一条

    快速回复 返回顶部 返回列表