我用的国民技术031芯片调试I2C功能,发现SCL和SDA的波形如图所示,在第9,第18第27的位置均为ACK信号,但是27应答信号之后的SCL就连续出现两个高电平,不知道是哪里出了问题,哪位小伙伴能帮忙看看!

以下是初始化
```c
int i2c_master_init(void)
{
I2C_InitType i2c1_master;
GPIO_InitType i2c1_gpio;
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_I2C1, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
GPIO_InitStruct(&i2c1_gpio);
/*PB6 -- SCL; PB7 -- SDA*/
i2c1_gpio.Pin = I2Cx_SCL_PIN | I2Cx_SDA_PIN;
i2c1_gpio.GPIO_Speed = GPIO_SPEED_HIGH;
i2c1_gpio.GPIO_Mode = GPIO_MODE_AF_OD;
i2c1_gpio.GPIO_Alternate = GPIO_AF_I2C;
i2c1_gpio.GPIO_Pull = GPIO_PULL_UP;
GPIO_InitPeripheral(GPIOx, &i2c1_gpio);
I2C_DeInit(I2Cx);
i2c1_master.BusMode = I2C_BUSMODE_I2C;
i2c1_master.FmDutyCycle = I2C_FMDUTYCYCLE_2; //if the spped greater than 400KHz, the FmDutyCycle mast be configured to I2C_FMDUTYCYCLE_2
i2c1_master.OwnAddr1 = I2C_MASTER_ADDR;
i2c1_master.AckEnable = I2C_ACKEN;
i2c1_master.AddrMode = I2C_ADDR_MODE_7BIT;
i2c1_master.ClkSpeed = 100000;
I2C_Init(I2Cx, &i2c1_master);
I2C_Enable(I2Cx, ENABLE);
return 0;
}
以下是在main函数中的while循环里调用的函数
```c
I2C_EE_WriteBuffer(tx_buf, TEST_EEPROM_ADDR, 1);//TEST_EEPROM_SIZE
void I2C_EE_WriteBuffer(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)
{
if (I2C_GetFlag(I2Cx, I2C_FLAG_BUSY))
{
return;
}
I2C_pBuffer = pBuffer;
I2C_WriteAddr = WriteAddr;
I2C_NumByteToWrite = NumByteToWrite;
while (I2C_NumByteToWrite > 0)
{
I2C_EE_WriteOnePage(I2C_pBuffer, I2C_WriteAddr, I2C_NumByteToWrite);
}
}
void I2C_EE_WriteOnePage(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
Addr = WriteAddr % I2C_PageSize;
count = I2C_PageSize - Addr;
NumOfPage = NumByteToWrite / I2C_PageSize;
NumOfSingle = NumByteToWrite % I2C_PageSize;
I2C_NumByteWritingNow = 0;
/** If WriteAddr is I2C_PageSize aligned */
if (Addr == 0)
{
/** If NumByteToWrite < I2C_PageSize */
if (NumOfPage == 0)
{
I2C_NumByteWritingNow = NumOfSingle;
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
/** If NumByteToWrite > I2C_PageSize */
else
{
I2C_NumByteWritingNow = I2C_PageSize;
I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
}
}
/** If WriteAddr is not I2C_PageSize aligned */
else
{
/* If NumByteToWrite < I2C_PageSize */
if (NumOfPage == 0)
{
I2C_NumByteWritingNow = NumOfSingle;
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
/* If NumByteToWrite > I2C_PageSize */
else
{
if (count != 0)
{
I2C_NumByteWritingNow = count;
I2C_EE_PageWrite(pBuffer, WriteAddr, count);
}
}
}
}
void I2C_EE_PageWrite(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)
{
#if PROCESS_MODE == 0 /* polling */
sEETimeout = sEE_LONG_TIMEOUT;
while (I2C_GetFlag(I2Cx, I2C_FLAG_BUSY))
{
if ((sEETimeout--) == 0)
sEE_TIMEOUT_UserCallback();
}
/** Send START condition */
I2C_GenerateStart(I2Cx, ENABLE);
/** Test on EV5 and clear it */
sEETimeout = sEE_LONG_TIMEOUT;
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_MODE_FLAG))
{
if ((sEETimeout--) == 0)
sEE_TIMEOUT_UserCallback();
}
/** Send EEPROM address for write */
I2C_SendAddr7bit(I2Cx, EEPROM_ADDRESS, I2C_DIRECTION_SEND);
/** Test on EV6 and clear it */
sEETimeout = sEE_LONG_TIMEOUT;
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_TXMODE_FLAG))
{
if ((sEETimeout--) == 0)
sEE_TIMEOUT_UserCallback();
}
/** Send the EEPROM's internal address to write to */
I2C_SendData(I2Cx, WriteAddr);
/** Test on EV8 and clear it */
sEETimeout = sEE_LONG_TIMEOUT;
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_DATA_SENDED))
{
if ((sEETimeout--) == 0)
sEE_TIMEOUT_UserCallback();
}
/** While there is data to be written */
while (NumByteToWrite--)
{
/** Send the current byte */
I2C_SendData(I2Cx, *pBuffer);
/** Point to the next byte to be written */
pBuffer++;
/** Test on EV8 and clear it */
sEETimeout = sEE_LONG_TIMEOUT;
while (!I2C_CheckEvent(I2Cx, I2C_EVT_MASTER_DATA_SENDED))
{
if ((sEETimeout--) == 0)
sEE_TIMEOUT_UserCallback();
}
}
/** Send STOP condition */
I2C_GenerateStop(I2Cx, ENABLE);
I2C_EE_WaitEepromStandbyState();
I2C_EE_WriteOnePageCompleted();
#endif
}