本帖最后由 lindahnu 于 2024-12-3 11:18 编辑
使用两个板子,在例程I2C_TwoBoards_RestartComIT代码上进行修改:
主机调用HAL_I2C_Mem_Read_IT函数,发送内存地址16位后读10个数据;
从机调用HAL_I2C_Slave_Seq_Receive_IT接收内存地址后再调用HAL_I2C_Slave_Seq_Transmit_IT发送10个数据;
现象:
从机正常接收,给主机发送第1个数据正常,到第2~10个数据时每次第八个时钟拉低了500多个ms才拉高,也就是延时了500多ms才回ack。不知道什么原因?
现在把HAL_I2C_Mem_Read_IT替换成查询模式HAL_I2C_Mem_Read,就没有以上时钟被拉低很久的现象。
这说明HAL_I2C_Mem_Read_IT函数封装哪里有问题?求指导
主机调用代码:
[C] 纯文本查看 复制代码 HAL_I2C_Mem_Read_IT(&hi2c1, (uint16_t)I2C_ADDRESS,, 0x55aa,2,(uint8_t *)aRxBuffer, 10);
替换
HAL_I2C_Mem_Read(&hi2c1, (uint16_t)I2C_ADDRESS,, 0x55aa,2,(uint8_t *)aRxBuffer, 10,1000);
从机调用代码:
[C] 纯文本查看 复制代码 if(HAL_I2C_EnableListen_IT(&hi2c1) != HAL_OK)
{
Error_Handler();
}
while(uwTransferRequested != 1)
{
}
if(HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, (uint8_t *)aRxBuffer, 2, I2C_FIRST_FRAME) != HAL_OK)
{
Error_Handler();
}
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_LISTEN)
{
}
while(uwTransferRequested != 1)
{
}
if(HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, (uint8_t*)aTxBuffer, 10, I2C_LAST_FRAME)!= HAL_OK)
{
Error_Handler();
}
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
{
}
从机回调函数:
[C] 纯文本查看 复制代码 void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c,uint8_t TransferDirection, uint16_t AddrMatchCode)
{
uwTransferRequested = 1;
}
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
uwTransferRequested =0;
}
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
uwTransferRequested =0;
}
|