

【两个Start信号都由硬件产生,其余时序由软件模拟】
int main(void)
{
    RCC->APB1ENR = _BV(21); // 开启I2C1时钟
    RCC->APB2ENR = 0x1c; // 开启PA、PB、PC时钟
    GPIOA->CRL = 0x00000003; // PA0设为输出
    GPIOB->CRL = 0xbb000000; // PB6~7设为复用功能推挽输出
    GPIOC->CRH = 0x33000000; // PC14~15设为输出    
    I2C1->CR2 = 36;
    I2C1->CCR = 90;
    I2C1->TRISE = 37;
    I2C1->OAR1 = 0x40bc;
    I2C1->CR1 = 0x01; // PE=1(启动总线)    
    I2C1->CR1 |= _BV(8); // 起始信号
    while ((I2C1->SR1 & _BV(0)) == 0); // 等待SB=1    
    GPIOB->CRL = 0x33000000; // PB6~7设为推挽50MHz输出
    num = I2CWrite(0xa0);
    I2CWrite(0x02); // 读取0x02处的内容        
    GPIOB->CRL = 0xbb000000;
    I2C1->CR1 |= _BV(15); // 复位I2C硬件
    I2C1->CR1 &= ~_BV(15);
    I2C1->CR1 = 0x01; // PE=1(启动总线)
    delay();
    I2C1->CR1 |= _BV(8); // 起始信号
    while ((I2C1->SR1 & _BV(0)) == 0); // 等待SB=1
    GPIOB->CRL = 0x33000000;    
    I2CWrite(0xa1);
    num = I2CRead();
    I2CSendAck(0);
    I2CStop();    
    while (1)
    {
        seg_scan(); // 数码管显示051
    }
}