I2C连续读的时候发送应答型号应该是怎样的?

2020-01-23 14:29发布

下面是程序,从电容触摸屏中读取坐标,问题是如果我每次只读一个地址的数据就没问题,连续读取的话就会都是第一个地址的数据,
void i2c_master_send_ACK( void)
{
        SDA = 1;
        i2c_delay();
        SCL = 1;
        i2c_delay();
        SCL = 0;
        i2c_delay();
}
这里发送应答应该是将SDA=0才感觉是对的,要拉低SDA给对方应答信号,但是如果这里发送SDA=0的话,
后面就连读一次的数据都会出现这个错误printf("msg i2c read error: %d ",ret);
现在的程序至少执行ft5x06_i2c_rxdata(u8 *rxdata,u8 length)的length长度=1的不会出现任何错误
请帮忙看一下.

  1. void i2c_delay(void)
  2. {
  3.         u8 i=5;
  4.         while(i--);
  5. }

  6. void i2c_start(void)
  7. {
  8.         SDA = 1;
  9.         SCL = 1;
  10.         i2c_delay();
  11.         SDA = 0;
  12.         i2c_delay();
  13.         SCL = 0;
  14.         i2c_delay();
  15. }

  16. void i2c_stop(void)
  17. {
  18.         SDA = 0;
  19.         SCL = 1;
  20.         i2c_delay();
  21.         SDA = 1;
  22.         i2c_delay();
  23. }

  24. void i2c_master_send_ACK( void)
  25. {
  26.         SDA = 1;
  27.         i2c_delay();
  28.         SCL = 1;
  29.         i2c_delay();
  30.         SCL = 0;
  31.         i2c_delay();
  32. }

  33. u8 i2c_master_recv_ACK(void)
  34. {
  35.         u8 ACK=0;
  36.         SCL = 1;
  37.         i2c_delay();
  38.        
  39.         ACK |= SDA;
  40.         i2c_delay();
  41.        
  42.         SCL = 0;
  43.         i2c_delay();
  44.         return ACK;
  45. }

  46. u8 i2c_master_send_byte(u8 Byte)
  47. {
  48.         u8 i,ACK;
  49.         for(i=0;i<8;i++)
  50.         {
  51.                 SDA = Byte>>(7-i)&0x01;
  52.                 i2c_delay();
  53.                 SCL = 1;
  54.                 i2c_delay();
  55.                 SCL = 0;
  56.                 i2c_delay();
  57.         }
  58.         ACK = i2c_master_recv_ACK();
  59.         return ACK;                        //ACK=1=失败,ACK=0=成功
  60. }

  61. u8 i2c_master_recv_byte( void )
  62. {
  63.         u8 i,temp;
  64.         for(i=0;i<8;i++)
  65.         {
  66.                 temp=temp<<1;
  67.                 SCL = 1;
  68.                 i2c_delay();
  69.                 temp |= SDA;
  70.                 SCL = 0;
  71.                 i2c_delay();
  72.         }
  73.         return temp;
  74. }

  75. //i2c数据传输,每次传输一个数据包
  76. int i2c_transfer_msg(u8 SlaveAddr_and_RorW , u8 *msg , u8 length)
  77. {
  78.         int ret;
  79.         u8 i;
  80.         i2c_start();
  81.         ret = i2c_master_send_byte(SlaveAddr_and_RorW);
  82.         if(SlaveAddr_and_RorW&0x01)                        //RorW=1=Read
  83.         {
  84.                 for(i=0;i<length;i++)
  85.                 {
  86.                         msg[i]=i2c_master_recv_byte();
  87.                         i2c_master_send_ACK();
  88.                 }
  89.         }
  90.         else        //RorW=0=Write
  91.         {
  92.                 for(i=0;i<length;i++)
  93.                 {
  94.                         ret += i2c_master_send_byte(msg[i]);
  95.                 }
  96.         }
  97.         i2c_stop();
  98.         return ret;                //=0表示没任何错误
  99. }

  100. //master从ft5x06中读数据,数据缓冲区第一个字节为起始读地址
  101. static int ft5x06_i2c_rxdata(u8 *rxdata,u8 length)
  102. {
  103.         int ret;
  104.         u8 SlaveAddr_and_RorW;
  105.         SlaveAddr_and_RorW = (ft5x06_I2C_SLAVE_ADDRESS<<1) + 0;        //Write
  106.         ret = i2c_transfer_msg(SlaveAddr_and_RorW,rxdata,1);
  107.                
  108.         SlaveAddr_and_RorW = (ft5x06_I2C_SLAVE_ADDRESS<<1) + 1;        //Read
  109.         ret += i2c_transfer_msg(SlaveAddr_and_RorW,rxdata,length);
  110.         if(ret)
  111.                 printf("msg i2c read error: %d ",ret);
  112.         return ret;                //=0表示没任何错误
  113. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
david1234
1楼-- · 2020-01-23 16:53
 精彩回答 2  元偷偷看……
bias
2楼-- · 2020-01-23 21:54
david1234 发表于 2014-7-22 15:10
I2C read的最后一个字节,主机不能发送ACK,否者总线可能死锁。

I2CREAD最后一个字节后(从机不知何为最后 ...

谢谢,这个问题我没注意到,要发送一个noack后再stop

但是现在还没到这个错误这里,连续读取的第二个字节就已经出错了,和第一个字节内容一样,感觉是应答没发好,从机没有把第二个字节准备好给我。
wxty
3楼-- · 2020-01-24 02:09
david1234 发表于 2014-7-22 15:10
I2C read的最后一个字节,主机不能发送ACK,否者总线可能死锁。

I2CREAD最后一个字节后(从机不知何为最后 ...

弄个超时,重发。
laoshuhunya
4楼-- · 2020-01-24 06:54
楼主,你的i2c_master_send_ACK、i2c_master_recv_ACK 、i2c_master_recv_byte 这些函数是错误的。
接收每个位之前,SDA应该先置1,这样才能接收到正确的数据位。
huaidan1628
5楼-- · 2020-01-24 07:07
主机先发送应答
david1234
6楼-- · 2020-01-24 10:46
 精彩回答 2  元偷偷看……

一周热门 更多>