使用两个板子,在例程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函数封装哪里有问题?求指导
主机调用代码:
- 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);
复制代码
从机调用代码:
- 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)
- {
- }
复制代码
从机回调函数:
- 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;
- }
复制代码
|
注意到代码又改变了~~
库里面有个例程,可以参考一下。
STM32Cube_FW_G0_V1.5.0\Projects\STM32G081B-EVAL\Examples\I2C\I2C_TwoBoards_ComIT\
已经找到原因,对比更新最新的G0代码时漏了开接收中断。
HAL_I2C_Mem_Read_IT函数最后调用I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
在I2C_Mem_ISR_IT里检测TC标志的地方需调用I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
主机没开接收中断,没有读RXDR就会拉低时钟线