我有两个使用STM32F070CB MCU的相同定制板。我正在尝试使用一个作为I2C主设备,一个作为从设备。我正在尝试遵循STM32Cube示例中提供的代码。我可以从主机发送并与从机一起接收,但是当我尝试从主机发送时,我遇到了问题。将示波器放在SDA上会显示地址,并且读取命令是从主机发送的,但没有数据从从机发出。在SDA上观察到FF,但我认为这仅来自上拉电阻,因为从未调用过HAL_I2C_SlaveTxCpltCallback。
这是主代码:
while (1)
{
HAL_Delay(500);
HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)36, txBuf, 1, 1000);
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
while(HAL_I2C_GetError(&hi2c1) == HAL_I2C_ERROR_AF);
HAL_Delay(35); // wait to allow slave to begin transmit
HAL_I2C_Master_Receive(&hi2c1, (uint16_t)36, rxBuf, 4, 1000);
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
while(HAL_I2C_GetError(&hi2c1) == HAL_I2C_ERROR_AF);
supplyTemperature = (float*)&rxBuf;
printf("Analog Supply Temperature: %.2f\n\r", *supplyTemperature);
}
这是奴隶:
void adcTest(SPI_HandleTypeDef *hspi, I2C_HandleTypeDef *hi2c)
{
float supplyTemperature;
float returnTemperature;
float deltaTemperature;
uint8_t rxBuf[5] = {0};
uint8_t txBuf[10] = "Hi\n\r";
HAL_I2C_Slave_Receive_IT(hi2c, rxBuf, 1);
while(1)
{
switch(state)
{
case BTU_READY:
BTU_getTemperature(RTD_SUPPLY, &supplyTemperature);
printf("RTD Supply Temperature: %.2f\n\r", supplyTemperature);
BTU_getTemperature(RTD_RETURN, &returnTemperature);
printf("RTD Return Temperature: %.2f\n\r", returnTemperature);
deltaTemperature = supplyTemperature - returnTemperature;
break;
case BTU_RECEIVED_I2C_MESSAGE:
state = BTU_TRANSMITTING_I2C;
HAL_I2C_Slave_Transmit_IT(hi2c, txBuf, 4);
printf("Recieved %c\n\r", rxBuf[0]);
break;
case BTU_TRANSMITTING_I2C:
while(state == BTU_TRANSMITTING_I2C);
break;
case BTU_TRANSMIT_I2C_COMPLETE:
state = BTU_READY;
HAL_I2C_Slave_Receive_IT(hi2c, rxBuf, 1);
break;
default:
break;
}
}
}
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
state = BTU_RECEIVED_I2C_MESSAGE;
}
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
state = BTU_TRANSMIT_I2C_COMPLETE;
}
https://google.github.io/guava/releases/20.0/api/docs/com/google/common/base/Function.html