Вопрос

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

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

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

Sdo-gnd

CS - VCC

GND - GND

3.3V - 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.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top