OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3502|回复: 6

IIC Read 函数,买了原子的板子有不懂的问题

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-16
在线时间
5 小时
发表于 2017-5-3 21:27:30 | 显示全部楼层 |阅读模式
5金钱

u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
    for(i=0;i<8;i++ )
                        {
        IIC_SCL=0;
        delay_us(2);
                    IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)
                                {
                                        receive++;
        }                                       
                     delay_us(1);
                        }                                         
                                if (!ack)
                                        IIC_NAck();//·¢&#203;ínACK
                                else
                                        IIC_Ack(); //·¢&#203;íACK   
                                return receive;

}

上面我有两个地方不明白, 第一个 IIC_Read_Byte(unsigned char ack)   这个ack,在这里做形参吗?有什么用。
                                       第二个是return receive   ,这个值是返回给那个函数调用的。有什么用

最佳答案

查看完整内容[请看2#楼]

如果需要发送应答信号,入参是1,不用应答,入参是0,return receive是你读到的数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-5-3 21:27:31 | 显示全部楼层
如果需要发送应答信号,入参是1,不用应答,入参是0,return receive是你读到的数据。
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-16
在线时间
5 小时
 楼主| 发表于 2017-5-4 14:10:25 | 显示全部楼层
super910906 发表于 2017-5-4 08:53
如果需要发送应答信号,入参是1,不用应答,入参是0,return receive是你读到的数据。

我在主函数要怎么写
void main(void)
{
     IIC_init();
     delay_init()
     
     IIC_Start()
     IIC_Send_byte(0x18);
     IIC_Wait_akc();
     delay_us(10);
     
     IIC_Send_byte(0x32);
     IIC_Wait_akc();
     delay_us(10);
     
      IIC_Send_byte(0x21);
     IIC_Wait_akc();
     delay_us(10);
  
     下面开始读代码
     IIC_Start()
     IIC_Send_byte(0x19);
     IIC_Wait_akc();
     delay_us(10);
     
     
     IIC_Read_byte();
     IIC_Read_byte();

}

请帮我看看,这部分read 函数对不对。括号里面要写什么吗?
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-5-4 14:32:51 | 显示全部楼层
dingdi 发表于 2017-5-4 14:10
我在主函数要怎么写
void main(void)
{

不对,IIC_Read_byte();有问题,这个函数返回一个变量,你要把返回的变量赋值给另一个变量。如:Read_Data=IIC_Read_byte(1);(定义:uint8_t Read_Data)
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-4 14:58:25 | 显示全部楼层
学习下IIC通信协议~就知道了
回复

使用道具 举报

14

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-4-19
在线时间
137 小时
发表于 2017-5-4 16:53:04 来自手机 | 显示全部楼层
这个是回应参数,有俩种情况,非应答与应答
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-16
在线时间
5 小时
 楼主| 发表于 2017-5-6 01:30:20 | 显示全部楼层
我已经解决了在读第二个byte 的时候,会读不到data了。方法如下
u8 IIC_Read_Byte(unsigned char ack)
{
    IIC_SDA=1;
    delay_us(10);

    for(;;;)
{

}

开始要释放SDA总线,读数据才不会出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 16:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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