本帖最后由 RunningX 于 2021-6-4 18:01 编辑
在AC7801的I2C驱动库中,已经把I2C的大部分中断处理都做了。包括一些数据接收的处理,都已经在库函数里面给实现了。
对于一些用户的使用,可能要求使用更加灵活,数据处理全部由用户进行处理,而不是通过库函数来实现。
这里做了一个最常用的使用方式,发送是主动的polling方式,而接收则是用中断来实现(更改了I2C库文件里面的宏定义,中断处理由用户自己操作)。
工程如下:
7801简易I2C通信.rar
(3.75 MB)
该工程中主机跟从机的通信协议如下:
1、主机发送地址0x30(方向写)和命令0xAA
2、主机发送地址0x30(方向读)
3、从机从步骤1主机写中读到命令0xAA,然后在步骤2中识别到主机读的指令,回复两个数据
4、主机读到两个数据,发送stop位,停止通信
5、代码在主循环中每隔1s重复一次步骤1~4
需要注意的几个点:
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论坛人员看到的话,可以改一下功能,有点麻烦)
|