2017-06-07 77 views
2

我必須用I2C連接STM32F4發現和pcf8574的代碼。STM32F4 I2C無庫

我無法使用任何庫函數。我嘗試了一些我沒有做到的事情。我在init代碼後寫了。

我的初始化代碼

RCC->APB1ENR|=RCC_APB1ENR_I2C1EN ; // enable APB1 peripheral clock for I2C1 
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOBEN; // enable clock for SCL and SDA pins 

//SCL on PB6 and SDA on PB7 
GPIOB->MODER|=GPIO_MODER_MODER6; // set pin to alternate function 
GPIOB->MODER|=GPIO_MODER_MODER7; // set pin to alternate function 

GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR6; //set GPIO speed 
GPIOB->OSPEEDR |=GPIO_OSPEEDER_OSPEEDR7; //set GPIO speed 

GPIOB-> OTYPER |= GPIO_OTYPER_OT_6; // set output to open drain --> the line has to be only pulled low, not driven high 
GPIOB-> OTYPER |= GPIO_OTYPER_OT_7; // set output to open drain --> the line has to be only pulled low, not driven high 

GPIOB-> PUPDR |=GPIO_PUPDR_PUPDR6_0; // enable pull up resistors 
GPIOB-> PUPDR |=GPIO_PUPDR_PUPDR7_0; // enable pull up resistors 

GPIOB-> AFR[1] = 0x44000000; // Connect I2C1 pins to AF (af4) 

// configure I2C1 

I2C1-> CR2 = 8; // set peripheral clock to 8mhz 
I2C1-> CR2 = 40; // 100khz i2c clock 
I2C1-> CR2 |= ~(I2C_CR1_SMBUS); // I2C mode 
I2C1-> OAR2 = 0x00; // address not important 
I2C1-> CR2 |= 1; // i2c enable; 

回答

6
I2C1-> CR2 |= ~(I2C_CR1_SMBUS); // I2C mode 

這條線做不同的東西,你認爲。如果當時的想法是,以清除該位是shuold是

I2C1-> CR2 &= ~(I2C_CR1_SMBUS); // I2C mode 

否則你設置的所有位除了I2C_CR1_SMBUS的CR2寄存器,它保持不變。

另一個問題是您嘗試使用CR1位定義設置CR2。

與啓用位錯誤的寄存器相同。

在第一次使用STM32微處理器之前,I2C應該被重置。

1

你好我有一個設置STM32F4 DISCO板同樣的問題去

我注意到,您設置

I2C1-> CR2 = 8; // set peripheral clock to 8mhz 
I2C1-> CR2 = 40; // 100khz i2c clock 

你正在寫兩次相同的寄存器。 對於需要設置I2C1->CCR計算出的值I2C時鐘

我希望這有助於