По примеру в IAR EWARM написал небольшую программу инициализации интерфейса I2C для работы через прерывания:
CODE
void I2C_Ini(void){
I2C_InitTypeDef I2C_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// I2C RCC
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
// I2C GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);// SCL=B8,SDA=B9
PININI(SCL,GPIO_Mode_AF_OD,GPIO_Speed_50MHz);PINLOCK(SCL); // макросы проверены, ошибок нет
PININI(SDA,GPIO_Mode_AF_OD,GPIO_Speed_50MHz);PINLOCK(SDA);// макросы проверены, ошибок нет
// I2C config
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0xAA;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
// I2C NVIC
NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
NVIC_Init(&NVIC_InitStructure);
I2C_ITConfig(I2C1,I2C_IT_EVT,ENABLE); // enable event IRQ
I2C_ITConfig(I2C1,I2C_IT_ERR,ENABLE); // enable error IRQ
I2C_ITConfig(I2C1,I2C_IT_BUF,ENABLE); // enable buffer IRQ
}
Странно, но результатом ее выполнения является установка бита BUSY, хотя осцилл показывает, что линии SCL и SDA находятся в высоком уровне. По описанию этого бита, его установка свидетельствует о низком уровне хотя бы одной линии. Что же тут не так?
Дальнейшая выдача START бессмысленна, т. к. судя по всему интерфейс неправильно инициализирован...
Сообщение отредактировал IgorKossak - Apr 12 2012, 17:43
Причина редактирования: [codebox]!!!