[CAPSENSE™] CY8CMBR3XXX 程序问题

[复制链接]
1394|13
 楼主| lianglpk 发表于 2023-11-24 20:13 | 显示全部楼层 |阅读模式
最近在做一个测试应用,用到CY8CMBR3108,用STC MCU,IC写)X37地址有ACK,写寄存器地址总是没有ACK,SDA总是高电平,有没有大佬遇到过啊,如何解决这个问题,下面是部分程序
//3108 read data
unsigned char  I2C_3108_ReadData(unsigned char  slaveAddress , unsigned char  regAddr , unsigned char  *readBuffer , unsigned char  numberOfBytes )
{
  unsigned char i=0,j=0,k=0;
        unsigned int timeout=0;
        unsigned char errorStatus = FALSE;
       
       
        IIC_Start();  
  errorStatus  = IIC_SendByte((slaveAddress<<1)|I2C_3108_WRITE);
        errorStatus  = IIC_SendByte((slaveAddress<<1)|I2C_3108_WRITE);
  errorStatus &= iic_wait_ack();

        while (( !errorStatus)  && (timeout < I2C_3108_READY_STATUS_TIMEOUT))
         {
     IIC_Start();
                 errorStatus &= IIC_SendByte((slaveAddress<<1)|I2C_3108_WRITE);
           errorStatus &= iic_wait_ack();
                 timeout ++;
         }       
        if (timeout>(I2C_3108_READY_STATUS_TIMEOUT-1))
         {
                 errorStatus = FALSE;
                 return errorStatus;
         }
        errorStatus &= IIC_SendByte(regAddr);
        errorStatus &= iic_wait_ack();
        if(!errorStatus)
        {
                return errorStatus;
        }
        IIC_Stop();
        delayMs(50);
        IIC_Start();
        errorStatus &= IIC_SendByte((slaveAddress<<1)|I2C_3108_READ);
        errorStatus &= iic_wait_ack();
        while (( !errorStatus)  && (timeout < I2C_3108_READY_STATUS_TIMEOUT))
                {
           IIC_Start();
           errorStatus &= IIC_SendByte((slaveAddress<<1)|I2C_3108_READ);
           errorStatus &= iic_wait_ack();
                 timeout ++;
          }

        if (timeout>(I2C_3108_READY_STATUS_TIMEOUT-1))
         {
                 errorStatus = FALSE;
                 return errorStatus;
         }

        // delayMs(50);
//        IIC_delay();
//        errorStatus &= IIC_SendByte((slaveAddress<<1)|I2C_3108_READ);
//        errorStatus &= iic_wait_ack();
//        IIC_delay();
        if (errorStatus)
        {
    for (j = 0; j < numberOfBytes-1; j++)
      {
       readBuffer[j] = IIC_RecvByte();
                   IIC_ACK() ;
      // if (!errorStatus)
      //  {
                        //         return errorStatus;              
      //  }
      }
                readBuffer[numberOfBytes-1] = IIC_RecvByte();
          IIC_NOACK() ;
  }

    IIC_Stop();
    return errorStatus;
}       

yangqiji 发表于 2023-12-14 10:00 | 显示全部楼层
Hi ,
可以尝试增加延时以及判断ACK的延时时间,
cr315 发表于 2023-12-15 09:56 | 显示全部楼层
可能是ACK时序问题
两只袜子 发表于 2023-12-15 09:57 | 显示全部楼层
可能是由于你写入的寄存器地址或数据不正确,导致接收设备没有正确响应。
jcky001 发表于 2023-12-15 09:57 | 显示全部楼层
I2C起始和停止信号是否正确
elephant00 发表于 2023-12-15 09:58 | 显示全部楼层
电源和接地是否连接正确
IFX-MAX 发表于 2024-2-5 15:41 | 显示全部楼层
MBR3系列的芯片,如果你的I2C代码没问题的话,最有可能的原因就是MBR3芯片通常工作在sleep模式,所以会错过或ACK比较慢。
1.你可以延长等待ACK的时间。
2.或者retry一次。就是通过前面的操作把MBR3唤醒,然后后面紧跟的一次通讯就不会因为sleep而错过了。
EmmaTT 发表于 2024-2-28 21:04 | 显示全部楼层
是不是时序有问题啊
sj8zw8 发表于 2024-2-29 00:01 | 显示全部楼层
I2C通信需要一些延时来确保时序正确。尝试在不同的地方增加或减少一些延时,看看是否对问题有影响。
发呆爱好者 发表于 2024-2-29 10:43 | 显示全部楼层
I2C的停止信号设置的不对,需要看一下。
AdaMaYun 发表于 2024-2-29 11:11 | 显示全部楼层
还是看官方如何解答吧
 楼主| lianglpk 发表于 2024-4-23 18:45 | 显示全部楼层
搞定了,要多次访问才行,要不不能从睡眠状态唤醒!
和下土 发表于 2024-6-30 16:51 | 显示全部楼层
一般来说,slaveAddress左移1位后,最低位(LSB)是读写位。
结合国际经验 发表于 2024-6-30 18:40 | 显示全部楼层
写操作时地址应为 (slaveAddress << 1) | I2C_3108_WRITE,读操作时地址应为 (slaveAddress << 1) | I2C_3108_READ。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

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