打印
[应用相关]

如何使用I2C写从机后立即读从机,中间不产生结束信号

[复制链接]
883|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sicsphy|  楼主 | 2022-7-27 17:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用AT32F435的硬件I2C读取电容触摸屏,FT6206触摸屏从机地址是0x38。正确读取时序是应该先向0x38写数据0x01(电容触摸IC的指令),然后从0x38持续读数据即可获得触摸位置坐标信号。如图所示,下面是采集厂家提供的单片机产生的正确I2C波形,可以读出电容触摸坐标信号(未按下时后面读出0是对的)。上面是我基于咱们AT32最新版的I2C库产生的波形,可以看到写指令和读的地址是一样正确的,但是在写和读信号中间多了一个终止信号,然后后面就无法读出正确的坐标信息(未按下时读取到错误的0xFF)。

想问一下怎么写能不产生中间的终止信号?谢谢各路大神

858b19511b5c88fa47db72df1636124.jpg (326.57 KB )

858b19511b5c88fa47db72df1636124.jpg

使用特权

评论回复
沙发
Sicsphy|  楼主 | 2022-7-27 17:20 | 只看该作者
附上这一段的代码
while(i2c_flag_get(I2C1,I2C_BUSYF_FLAG));
i2c_transmit_set(I2C1,FT6206_ADDR,1,I2C_AUTO_STOP_MODE,I2C_GEN_START_WRITE);
i2c_data_send(I2C1,0x01);
while(i2c_flag_get(I2C1,I2C_TDBE_FLAG));
i2c_ack_enable(I2C1, TRUE);
while(i2c_flag_get(I2C1,I2C_BUSYF_FLAG));

i2c_transmit_set(I2C1,FT6206_ADDR,6,I2C_AUTO_STOP_MODE,I2C_GEN_START_READ);
for(i=0;i<6;i++)
        {
                while(i2c_flag_get(I2C1, I2C_RDBF_FLAG));
                *(buf+i)=i2c_data_receive(I2C1);
                while(i2c_flag_get(I2C1,I2C_BUSYF_FLAG));
        }

使用特权

评论回复
板凳
Sicsphy|  楼主 | 2022-7-27 17:23 | 只看该作者
补充两点:1、图中最后NAK是我忘使能ACK了,后来我使能之后有ACK也不行,读的都是0xFF错误码。2、这个代码中I2C_AUTO_STOP_MODE如果改成I2C_SOFT_STOP_MODE,就会把总线一直拉低,直接卡死也没办法取消中间的结束信号

使用特权

评论回复
地板
Sicsphy|  楼主 | 2022-7-27 17:28 | 只看该作者
我在论坛上有看到用旧版库实现写从机之后产生一个起始信号不产生终止信号就直接读从机的代码,求一个旧版库,官网找不到

使用特权

评论回复
5
骑着蜗牛狂奔O| | 2022-7-27 19:43 | 只看该作者
用EEPROM demo里面的代码, 你用错函数了

使用特权

评论回复
6
xch| | 2022-7-28 09:25 | 只看该作者
Sicsphy 发表于 2022-7-27 17:28
我在论坛上有看到用旧版库实现写从机之后产生一个起始信号不产生终止信号就直接读从机的代码,求一个旧版库 ...

Restart

使用特权

评论回复
7
Sicsphy|  楼主 | 2022-7-28 10:36 | 只看该作者
骑着蜗牛狂奔O 发表于 2022-7-27 19:43
用EEPROM demo里面的代码, 你用错函数了

谢谢谢谢,确实是eeprom demo里面用的这个函数,之前没看到。
替换成下面这句一句话搞定了,太感谢了,波形完美。
i2c_transmit_set(I2C1,FT6206_ADDR,6*(j-1),I2C_AUTO_STOP_MODE,I2C_GEN_START_READ);

使用特权

评论回复
8
liszt99| | 2022-7-29 10:42 | 只看该作者
Sicsphy 发表于 2022-7-28 10:36
谢谢谢谢,确实是eeprom demo里面用的这个函数,之前没看到。
替换成下面这句一句话搞定了,太感谢了,波 ...

你这个函数,和你一开始用的函数不是一样的嘛,我看就里面的一个参数改了而已。

使用特权

评论回复
9
skyred| | 2022-8-2 21:07 | 只看该作者
难道不是时序的事么

使用特权

评论回复
10
chenjun89| | 2022-8-3 08:07 | 只看该作者
好像不行吧

使用特权

评论回复
11
james03| | 2022-8-3 09:45 | 只看该作者
一般来说就是写完之后就直接发送Restart信号即可,前提是需要I2C从机支持这种用法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝