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;
}
Hi ,
可以尝试增加延时以及判断ACK的延时时间, 可能是ACK时序问题 可能是由于你写入的寄存器地址或数据不正确,导致接收设备没有正确响应。 I2C起始和停止信号是否正确 电源和接地是否连接正确 MBR3系列的芯片,如果你的I2C代码没问题的话,最有可能的原因就是MBR3芯片通常工作在sleep模式,所以会错过或ACK比较慢。
1.你可以延长等待ACK的时间。
2.或者retry一次。就是通过前面的操作把MBR3唤醒,然后后面紧跟的一次通讯就不会因为sleep而错过了。 是不是时序有问题啊 I2C通信需要一些延时来确保时序正确。尝试在不同的地方增加或减少一些延时,看看是否对问题有影响。 I2C的停止信号设置的不对,需要看一下。 还是看官方如何解答吧 搞定了,要多次访问才行,要不不能从睡眠状态唤醒! 一般来说,slaveAddress左移1位后,最低位(LSB)是读写位。 写操作时地址应为 (slaveAddress << 1) | I2C_3108_WRITE,读操作时地址应为 (slaveAddress << 1) | I2C_3108_READ。
页:
[1]