Как правильно инициализировать I2C stm32? - PullRequest
3 голосов
/ 29 ноября 2011

Я хочу получить данные от акселерометра ADXL345, но кажется, что я неправильно его подключаю.

SCL-PC6 (с резистором 10 кОм)

SDA-PC7 (с резистором 10 кОм)

SDO- GND

CS - VCC

GND - GND

3,3 В - VCC

Вот мой код для инициализации:

void I2CG_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    I2C_InitTypeDef  I2C_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        // I2CG clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
    // GPIOB clock enable
    // I2CG SCL and SDA configuration
    GPIO_InitStructure.GPIO_Pin = SCL|SDA;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    // Enable I2CG reset state
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, ENABLE);
       // Release I2CG from reset state
       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, DISABLE);
    I2C_DeInit(I2C1);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
    I2C_InitStructure.I2C_OwnAddress1 =  1;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;


    I2C_Init(I2CG, &I2C_InitStructure);
    I2C_Cmd(I2CG, ENABLE);
    I2C_AcknowledgeConfig(I2CG, ENABLE);
}

В одном примере я видел

GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);

GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);

Но у меня нет этого API.

Пожалуйста, помогите мне.Я пробовал много решений, а также пытался подключиться через SPI, но безуспешно :( Пожалуйста, помогите с I2C.

Ответы [ 4 ]

2 голосов
/ 31 мая 2015

Я понимаю, что это старый пост, но на него стоит обратить внимание.Вы не должны использовать флаги APB для настройки шины AHB.Обратитесь к руководству по программированию RM0008 (если вы используете устройство stm32f10x) для соответствующих настроек.

1 голос
/ 05 декабря 2011

SCL-PC6 (с резистором 10 кОм)

SDA-PC7 (с резистором 10 кОм)

SCL и SDA должны быть подключены напрямую. Вы должны использовать подтягивающие резисторы, как на этой схеме: http://en.wikipedia.org/wiki/File:I2C.svg

Ваш код инициализации выглядит нормально, так что, возможно, аппаратная проводка неправильная?

1 голос
/ 11 июня 2014

У меня была такая же проблема, как и у вас. Начальное условие было сгенерировано, но бит I2Cx_SR1.SB не установлен. Я думал, что должен был включить альтернативную функцию I2C, но мне пришлось отключить и все остальные функции на выводе. В моем случае это была функция UART3, конфликтующая с I2C.

0 голосов
/ 29 ноября 2011

Здесь приведен пример кода и примечания к приложению для STM32, сделанные кем-то, кто утверждает, что I2C работает:

http://www.stm32challenge.com/node/143

Возможно, попытайтесь заставить что-то известное, например, серийную EEPROM, работать, прежде чем пытаться использовать неизвестный акселерометр. Как только вы убедитесь, что конец микроконтроллера работает, вы можете подключить акселерометр и посмотреть, что вы получите.

...