OpenEdv-开源电子网

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

通过IIC通信协议,实现主机从从机读取2个字节

[复制链接]

5

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-8-13
在线时间
4 小时
发表于 2021-11-8 14:51:05 | 显示全部楼层 |阅读模式
1金钱
方式1:通过IIC通信协议,实现主机从从机读取2个字节,当主机读取完第1个字节的时候,主机发送非应答信号;当主机读取完最后一个字节的时候,主机发送停止信号。
方式2:通过IIC通信协议,实现主机从从机读取2个字节,当主机读取完第1个字节的时候,主机发送应答信号;当主机读取完最后一个字节的时候,主机发送非应答信号,并产生停止信号。
通过IIC通信协议,实现主机从从机读取2个字节,是通过哪种方式啊?学习STM32的时候,书籍上说的是方式2。而在学习IMXULL时候,通过参考正点原子官方给的裸机例程中的i2c程序,发现是通过方式1,有点搞不懂。。。。。。

void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size)
{
        volatile uint8_t dummy = 0;

        dummy++;        
       
       
        while(!(base->I2SR & (1 << 7)));
       
        base->I2SR &= ~(1 << 1);                                
        base->I2CR &= ~((1 << 4) | (1 << 3));       
       
       
        if(size == 1)
        base->I2CR |= (1 << 3);

        dummy = base->I2DR;
       
        while(size--)
        {
                while(!(base->I2SR & (1 << 1)));        
                base->I2SR &= ~(1 << 1);                       

                 if(size == 0)
        {
                i2c_master_stop(base);                        
        }

        if(size == 1)
        {
            base->I2CR |= (1 << 3);//倒数第二个数据,主机发送非应答信号
        }
                *buf++ = base->I2DR;
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-8-13
在线时间
4 小时
 楼主| 发表于 2021-11-15 16:44:59 | 显示全部楼层
本帖最后由 changing 于 2021-11-15 16:46 编辑

if(size == 1)
{
            base->I2CR |= (1 << 3);//倒数第二个数据,主机发送非应答信号
  }
修改为:
if(size == 1)
{
            base->I2CR &=~ (1 << 3);//倒数第二个数据,主机发送应答信号
  }
也可以
不过标准IIC协议:主机不是发送完非应答信号之后,再发送停止信号吗,这样的话就缺少了一个主机发送非应答信号的过程
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 14:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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