STM32F030F4在Bare Metal中无法正确启动I2C1

时间:2019-02-09 07:12:07

标签: i2c stm32f0

STM32F030F4无法正确启动I2C1。 这是我的代码:

//Clocks------------------------------------------------
    RCC->AHBENR  = 0x200000;
    RCC->APB1ENR = 0x4040 ; 
//------------------------------------------------------    

//GPIO-------------------------------------------------- 
//Configure Alternate Fucntion GPIO to I2C1
    GPIOA->AFR[1]  = 0x440  //(0b0100)<<4 | (0b0100)<<8 //AF4;
//Set GPIOA Pin 9-10 as Alternate Function
    GPIOA->MODER   = 0x280000;
//Set GPIOA pin 9-10 as speed as High
    GPIOA->OSPEEDR = 0x3c0000; 
//Set GPIOA pin 9-10 as open drain
    GPIOA->OTYPER  = 0x600;
//Set GPIOA pin 9-10 as no Pull-up Pull-down
    GPIOA->PUPDR   = 0x0;
//------------------------------------------------------

//I2C Resgisters
    I2C1->TIMINGR = 0x00201D2D;
    I2C1->CR1     = 0x1;
    I2C1->CR2           = 0x307001c;
    I2C1->TXDR      = 0x111;        
    //Start I2C 
    I2C1->CR2 |= (0b1) << 13;

但是输出不正确。 就像这样: enter image description here

SDA端口不起作用。

2 个答案:

答案 0 :(得分:0)

这行似乎有问题。

GPIOA->AFR[1]  = GPIO_Aternate_Function_I2C1;

如果I2C引脚为9和10,则应设置AFSEL9和AFSEL10的值。但是,应设置AFSEL8(这是AFR [1]中的最低值),然后清除其他内容。

此代码应执行以下操作:

GPIOA->AFR[1]  = GPIO_Aternate_Function_I2C1 * 0x00000110;

答案 1 :(得分:0)

问题解决了。

时钟有问题: 变化:(

//Enable PORTA clocks
RCC->AHBENR  |= 0x20000;

//Enable I2C1 clocks
RCC->APB1ENR |= 0x200000 ;