lianglpk 发表于 2023-11-24 20:13

CY8CMBR3XXX 程序问题

最近在做一个测试应用,用到CY8CMBR3108,用STC MCU,IC写)X37地址有ACK,写寄存器地址总是没有ACK,SDA总是高电平,有没有大佬遇到过啊,如何解决这个问题,下面是部分程序
//3108 read data
unsigned charI2C_3108_ReadData(unsigned charslaveAddress , unsigned charregAddr , unsigned char*readBuffer , unsigned charnumberOfBytes )
{
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 = IIC_RecvByte();
                 IIC_ACK() ;
      // if (!errorStatus)
      //{
                        //       return errorStatus;            
      //}
      }
                readBuffer = 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。
页: [1]
查看完整版本: CY8CMBR3XXX 程序问题