打印
[CAPSENSE™]

CY8CMBR3XXX 程序问题

[复制链接]
727|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 | 只看该作者
可能是由于你写入的寄存器地址或数据不正确,导致接收设备没有正确响应。

使用特权

评论回复
5
jcky001| | 2023-12-15 09:57 | 只看该作者
I2C起始和停止信号是否正确

使用特权

评论回复
6
elephant00| | 2023-12-15 09:58 | 只看该作者
电源和接地是否连接正确

使用特权

评论回复
7
IFX-MAX| | 2024-2-5 15:41 | 只看该作者
MBR3系列的芯片,如果你的I2C代码没问题的话,最有可能的原因就是MBR3芯片通常工作在sleep模式,所以会错过或ACK比较慢。
1.你可以延长等待ACK的时间。
2.或者retry一次。就是通过前面的操作把MBR3唤醒,然后后面紧跟的一次通讯就不会因为sleep而错过了。

使用特权

评论回复
8
EmmaTT| | 2024-2-28 21:04 | 只看该作者
是不是时序有问题啊

使用特权

评论回复
9
sj8zw8| | 2024-2-29 00:01 | 只看该作者
I2C通信需要一些延时来确保时序正确。尝试在不同的地方增加或减少一些延时,看看是否对问题有影响。

使用特权

评论回复
10
发呆爱好者| | 2024-2-29 10:43 | 只看该作者
I2C的停止信号设置的不对,需要看一下。

使用特权

评论回复
11
AdaMaYun| | 2024-2-29 11:11 | 只看该作者
还是看官方如何解答吧

使用特权

评论回复
12
lianglpk|  楼主 | 2024-4-23 18:45 | 只看该作者
搞定了,要多次访问才行,要不不能从睡眠状态唤醒!

使用特权

评论回复
13
和下土| | 2024-6-30 16:51 | 只看该作者
一般来说,slaveAddress左移1位后,最低位(LSB)是读写位。

使用特权

评论回复
14
结合国际经验| | 2024-6-30 18:40 | 只看该作者
写操作时地址应为 (slaveAddress << 1) | I2C_3108_WRITE,读操作时地址应为 (slaveAddress << 1) | I2C_3108_READ。

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝