主题中讨论的其他器件: MSP430FR2422
工具与软件:
**主题:** MSP430FR2422的 PCF8574 I2C NACK 问题
**问题说明:**
我使用位拆裂 I2C 实现将 PCF8574与 MSP430FR2422连接。 `具有正确的启动/停止条件和数据转换(在示波器上进行验证)、PCF8574在地址字节之后始终以 NACK 进行响应(` 0x40 μ s 用于写入)。
1.** PCF8574地址:** A0、A1、A2接地(地址:`0x40`)。
**代码:**
```μ A
void init_I2C (void)
{
CONF_SCL_OP;
CONF_SDA_OP;
}
空 I2C_EVM Start_Bit (空)
{
SET_SDA;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
RST_SDA;I2C_DELAY ();
RST_SCL;
}
空 I2C_EVM Stop_Bit (空)
{
RST_SCL;I2C_DELAY ();
RST_SDA;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
SET_SDA;
}
unsigned char I2C_Void Get_Ack (void)
{
unsigned char ack;
RST_SDA;
RST_SCL;
SET_SDA;
CONF_SDA_IP;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
//I2C_DELAY ();
if (! GET_SDA_LVL)
ACK = 1;
设计
ACK = 0;
RST_SCL;
CONF_SDA_OP;
return (ack);
}
空 DataSendToI2C (无符号字符 RDATA)
{
unsigned char i;
CallNop ();//asm (" NOP ");
for (i=0;i<8;i++)
{
if (RDATA & 0x80)
SET_SDA;
设计
RST_SDA;
I2C_DELAY();
SET_SCL;I2C_DELAY ();
RST_SCL;I2C_DELAY ();
RDATA = RDATA<<1;
}
I2C_DELAY();
I= I2C_I2C() Get_Ack;
I2C_DELAY();
CallNop ();//asm (" NOP ");
}
unsigned char DataRecvFromI2C (void)
{
unsigned int i、recd;
RECT = 0;
SET_SDA;
P1REN|=BIT5;
CONF_SDA_IP;
I2C_DELAY();
for (i=0;i<8;i++)
{
recd = recd<<1;
SET_SCL;
I2C_DELAY();
中频(GET_SDA_LVL)
recd = recd|0x01;
RST_SCL;
I2C_DELAY();
}
P1REN&=~BIT5;
CONF_SDA_OP;
return (recd);
}
void I2C_delay (void)
{
unsigned char Del=100;//50
while (Del--);
}
void CallNop (void)
{
asm ("NOP:");
}
void I4.72 Dev_Delay (空)
{
unsigned char Del=100;//50
while (Del--);
}
空 ReadWriteDelay (空)
{
unsigned int Del = 4000;
while (Del--);
}
void PCF8574_Write (unsigned char DeviceAdd、unsigned int 数据)
{
I2C_I2C() Start_Bit;
I4.72 Dev_Delay ();
DataSendToI2C (DeviceAdd);
I4.72 Dev_Delay ();
CNT=0;
DataSendToI2C (data);
I4.72 Dev_Delay ();
I2C_I2C() Stop_Bit;
CallNop();
ReadWriteDelay ();
}
void main (void)
{
init_i2C();
while (1){
PCF8574_Write (0x40、0x00);
DELAY_3ms (1);
}
}
``μ A
**问题:**
为什么 PCF8574在地址字节后始终以 NACK 进行响应、如何解决此问题?