Sicsphy 发表于 2022-7-27 17:07

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

使用AT32F435的硬件I2C读取电容触摸屏,FT6206触摸屏从机地址是0x38。正确读取时序是应该先向0x38写数据0x01(电容触摸IC的指令),然后从0x38持续读数据即可获得触摸位置坐标信号。如图所示,下面是采集厂家提供的单片机产生的正确I2C波形,可以读出电容触摸坐标信号(未按下时后面读出0是对的)。上面是我基于咱们AT32最新版的I2C库产生的波形,可以看到写指令和读的地址是一样正确的,但是在写和读信号中间多了一个终止信号,然后后面就无法读出正确的坐标信息(未按下时读取到错误的0xFF)。

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

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

我在论坛上有看到用旧版库实现写从机之后产生一个起始信号不产生终止信号就直接读从机的代码,求一个旧版库,官网找不到

骑着蜗牛狂奔O 发表于 2022-7-27 19:43

用EEPROM demo里面的代码, 你用错函数了

xch 发表于 2022-7-28 09:25

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

Restart

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);

liszt99 发表于 2022-7-29 10:42

Sicsphy 发表于 2022-7-28 10:36
谢谢谢谢,确实是eeprom demo里面用的这个函数,之前没看到。
替换成下面这句一句话搞定了,太感谢了,波 ...

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

skyred 发表于 2022-8-2 21:07

难道不是时序的事么

chenjun89 发表于 2022-8-3 08:07

好像不行吧

james03 发表于 2022-8-3 09:45

一般来说就是写完之后就直接发送Restart信号即可,前提是需要I2C从机支持这种用法
页: [1]
查看完整版本: 如何使用I2C写从机后立即读从机,中间不产生结束信号