I2C Master приемник не работает, работает только в отладчике - PullRequest
0 голосов
/ 19 января 2019

Я использую микроконтроллер на основе STM32F10x и общаюсь с ведомым устройством.Кажется, все работает до тех пор, пока я не отправлю своему ведомому устройству команду на чтение данных, но это будет зависать во время цикла while, потому что мой флаг BTF никогда не поднимется до высокого уровня.Если бы я удалил цикл while все вместе, я бы получил 0x81 без каких-либо фактических данных.

        I2C1->CR1 |= I2C_CR1_START; // send start bit   
        delay(30000);
        //while((I2C1->SR1 & I2C_SR1_TXE)); //read SR1
        (void)I2C1->SR1;
        I2C1->DR = 0x80; // slave address writing to DR 1000 0000   0x40 with R/W bit as 
        delay(30000);
        while(!(I2C1->SR1 & I2C_SR1_TXE))// make sure transmit is empty.
        {
        }
        (void)I2C1->SR1;
        (void)I2C1->SR2;
        I2C1->DR = 0xE3; // command for slave to send data, hold master mode on, clock stretching enabled
        delay(30000);
        while(!(I2C1->SR1 & I2C_SR1_TXE))
        {
        }
        delay(80000);
        I2C1->CR1 |= I2C_CR1_START; // send start bit   
        (void)I2C1->SR1;

        I2C1->DR = 0x81;
        delay(1000);
        while(!(I2C1->SR1 & I2C_SR1_BTF)) // waiting for byte to finish transfer
        {
        }
        dataaa[0] = I2C1->DR;
        I2C1->CR1 &= ~I2C_CR1_ACK;// acknowledgement disabled
        dataaa[1] = I2C1->DR;
        I2C1->CR1 |= I2C_CR1_STOP;// acknowledgement disabled
        temperature = temperature + dataaa[0];
        temperature = temperature << 8;
        temperature = temperature + dataaa[1];
...