[学习笔记] AC7801的简易I2C通信

[复制链接]
5708|8
 楼主| RunningX 发表于 2021-6-1 10:54 | 显示全部楼层 |阅读模式
本帖最后由 RunningX 于 2021-6-4 18:01 编辑

在AC7801的I2C驱动库中,已经把I2C的大部分中断处理都做了。包括一些数据接收的处理,都已经在库函数里面给实现了。
对于一些用户的使用,可能要求使用更加灵活,数据处理全部由用户进行处理,而不是通过库函数来实现。
这里做了一个最常用的使用方式,发送是主动的polling方式,而接收则是用中断来实现(更改了I2C库文件里面的宏定义,中断处理由用户自己操作)。
工程如下:
7801简易I2C通信.rar (3.75 MB, 下载次数: 21)
该工程中主机跟从机的通信协议如下:
1、主机发送地址0x30(方向写)和命令0xAA      
2、主机发送地址0x30(方向读)   
3、从机从步骤1主机写中读到命令0xAA,然后在步骤2中识别到主机读的指令,回复两个数据
4、主机读到两个数据,发送stop位,停止通信
5、代码在主循环中每隔1s重复一次步骤1~4
7328460b5a1570754c.png
需要注意的几个点:
1、地址为高7位,最低位为方向位
2、主机发送start位跟stop位,需要先检测是否处于ready状态
3、TACK设置,是为下一个接收到的数据的回复。比如当前把TACK设置为1,则下一个数据收到后,回复NACK
4、从机接受到地址后,不会产生BND中断,但会产生从机地址匹配中断。所以从机接到主机读的指令后,第一个数据发送是在地址匹配中断里面发的
5、I2C中ACK的波形为低电平,NACK为高电平
6、由于数据发送方会在第9个SCK释放SDA线(释放后为高电平),假如应答位是ACK(低电平),那么可能会看到ACK波形前面会有一个很小的高电平脉冲。这个脉冲时间也就是SDA线被释放到ACK应答之间的间隔,不影响数据识别。
7、当主机传输方向为RX时,读数据寄存器会自动发下一个时钟;所以读最后一个字节数据的时候,读数据寄存器前,需要把传输方向改为TX,避免多发一个时钟


请以上面的代码为准,下面的那个代码是错的(发的附件好像不能删改,而且会自动附上,这个功能建议21ic论坛人员看到的话,可以改一下功能,有点麻烦)




7801简易I2C通信.rar

3.74 MB, 下载次数: 19

weifeng90 发表于 2021-6-3 21:09 来自手机 | 显示全部楼层
看下代码学习一下。
yangxiaor520 发表于 2021-6-4 07:43 来自手机 | 显示全部楼层
讲解详细,感谢楼主的分享。
huquanz711 发表于 2021-6-8 18:33 来自手机 | 显示全部楼层
那个图片是逻辑分析仪的上位机?
 楼主| RunningX 发表于 2021-6-9 09:20 | 显示全部楼层
huquanz711 发表于 2021-6-8 18:33
那个图片是逻辑分析仪的上位机?

自己造声卡 发表于 2021-6-9 12:16 | 显示全部楼层
这个是用逻辑分析仪看的吧。。。。
foxsbig 发表于 2021-6-10 15:48 | 显示全部楼层
i2c我都是用IO模拟的,跟你比起来有点低端了。
两只袜子 发表于 2021-6-13 18:03 来自手机 | 显示全部楼层
帮顶一下
HuangHongLun 发表于 2021-6-15 09:07 | 显示全部楼层
附件应该是可以直接删除的。然后你重新上传就好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

223

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部