繁体   English   中英

STM32F4 I2C无库

[英]STM32F4 I2C without library

我必须使用I2C为STM32F4发现和pcf8574连接代码。

我不能使用任何库函数。 我尝试了一些我没做过的事。 我在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;
I2C1-> CR2 |= ~(I2C_CR1_SMBUS); // I2C mode

这条线做的事与你想的不同。 如果想要明确这一点,那么就应该这样做

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

否则,设置CR2寄存器中的所有位,I2C_CR1_SMBUS除外,它保持不变。

另一个问题是您尝试使用CR1位定义设置CR2。

与使能位相同 - 错误的寄存器。

在首次使用许多STM32微处理器之前,应重置I2C。

嗨我设置STM32F4 DISCO板时遇到同样的问题

我注意到你正在设置

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

你正在两次写同一个寄存器。 对于I2C时钟,您需要将I2C1->CCR设置为计算值

我希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM