Как правильно инициализировать I2C STM32?
-
25-10-2019 - |
Вопрос
Я хочу получить данные от акселерометра 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, работающий перед тем, как попробовать неизвестный акселерометр. После того, как вы убедитесь, что конец микроконтроллера работает, вы можете подключить акселерометр и посмотреть, что вы получите.