

【两个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
}
}