

【兩個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
}
}