STM32F0不作为I2C从机发送

时间:2018-08-20 17:52:14

标签: i2c stm32f0

我有两个使用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

0 个答案:

没有答案
相关问题