2017-06-07 11 views
2

STM32F4検出用コードとpcf8574をI2Cに配線する必要があります。ライブラリなしのSTM32F4 I2C

ライブラリ機能は使用できません。私はそれをしなかったことを試してみる。私はinitコードの後に​​書きました。

私の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 

この行は、あなたが考えることを別の何かをします。アイデアは、そのビットをクリアすることだった場合、それは

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

ことshuoldそうしないと、変更されませんI2C_CR1_SMBUS除くCR2レジスタのすべてのビットを設定します。

もう1つの問題は、CR1ビット定義を使用してCR2を設定しようとしていることです。

同じビットは、イネーブルビット違反レジスタです。

多くのSTM32マイクロプロセッサで最初に使用する前にI2Cをリセットする必要があります。

1

こんにちは、私は

を行くためにSTM32F4 DISCOボードの設定と同じ問題を抱えています私はあなたが同じレジスタに二回書いている

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

を設定していることに気づきました。私は、これは

に役立ちます願っていますが、計算値

I2C1->CCRを設定する必要がI2Cクロックの