Ср окт 18, 2017 17:02:03
GPIO_InitTypeDef gpio;
I2C_InitTypeDef i2c;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* Configure I2C_EE pins: SCL and SDA */
gpio.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &gpio);
/* I2C configuration */
i2c.I2C_Mode = I2C_Mode_I2C;
i2c.I2C_DutyCycle = I2C_DutyCycle_2;
i2c.I2C_OwnAddress1 = 0;
i2c.I2C_Ack = I2C_Ack_Enable;
i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
i2c.I2C_ClockSpeed = 100000;
/* Apply I2C configuration after enabling it */
I2C_Init(I2C1, &i2c);
/* I2C Peripheral Enable */
I2C_Cmd(I2C1, ENABLE);
// На всякий случай ждем, пока шина освободится
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
// Генерируем старт - тут все понятно )
I2C_GenerateSTART(I2C1, ENABLE);
// Ждем пока взлетит нужный флаг
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
// Посылаем адрес подчиненному
I2C_Send7bitAddress(I2C1, slaveAddress, transmissionDirection);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// А теперь у нас два варианта развития событий - в зависимости от выбранного направления обмена данными
if(transmissionDirection == I2C_Direction_Transmitter)
{
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
}
if(transmissionDirection == I2C_Direction_Receiver)
{
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
}
Ср окт 18, 2017 20:20:35
Пт окт 20, 2017 08:57:47
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
Сб окт 21, 2017 16:22:58
Вс окт 22, 2017 13:47:10
Вс окт 22, 2017 22:52:20
Пн окт 23, 2017 08:05:45
Пн окт 23, 2017 17:18:18
dosikus писал(а):Такие "советы" надо множить на нуль...
Fusion писал(а):Аппаратный I2C 400 кГц с датчиком AP3216C у меня работает без сбоев.
Чт окт 26, 2017 18:07:00