Код инициализации:
CODE
I2C_InitTypeDef I2C_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = 0x04;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE);
I2C_ITConfig(I2C2, I2C_IT_ERR, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = I2C2_EV_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_EnableIRQ(I2C2_EV_IRQn);
NVIC_SetPriority(I2C2_EV_IRQn, 0); //
NVIC_InitStruct.NVIC_IRQChannel = I2C2_ER_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_EnableIRQ(I2C2_ER_IRQn);
NVIC_SetPriority(I2C2_ER_IRQn, 1); //
NVIC_InitTypeDef NVIC_InitStruct;
I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = 0x04;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE);
I2C_ITConfig(I2C2, I2C_IT_ERR, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = I2C2_EV_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_EnableIRQ(I2C2_EV_IRQn);
NVIC_SetPriority(I2C2_EV_IRQn, 0); //
NVIC_InitStruct.NVIC_IRQChannel = I2C2_ER_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_EnableIRQ(I2C2_ER_IRQn);
NVIC_SetPriority(I2C2_ER_IRQn, 1); //
Обработчик:
CODE
volatile uint16_t sr1 = I2C2->SR1;
volatile uint16_t sr2 = I2C2->SR2;
if (!(sr2 & I2C_SR2_MSL)) return;
if( sr1 & I2C_SR1_SB) //принят ответ ACK, отправка адресса
{
i2c_state = I2C_SEND_ADR_DEV;
I2C2->DR = (uint16_t) i2c_buffer.device_adr;
}
if(sr1 & I2C_SR1_TXE) //принят ответ ACK, данных и стоп
{
switch (i2c_state)
{
case I2C_SEND_ADR_DEV:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
break;
case I2C_SEND_ADR_MEM:
if( i2c_buffer.pos_head < i2c_buffer.pos_tail && i2c_buffer.pos_head < i2c_buffer.len)
{
i2c_state = I2C_SEND_DATA;
I2C1->DR = i2c_buffer.buffer[i2c_buffer.pos_head];
i2c_buffer.pos_head++;
}
else
{
i2c_buffer.pos_tail = 0;
i2c_buffer.pos_head = 0;
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
case I2C_SEND_DATA:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
i2c_buffer.start_adr++;
break;
default:
break;
}
}
if( sr1 & I2C_SR1_RXNE ) //прерывание по чтению
{
switch (i2c_state)
{
case I2C_SEND_ADR_DEV:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
break;
case I2C_SEND_ADR_MEM:
i2c_state = I2C_SEND_ADR_DEV2;
I2C2->DR = (uint16_t) i2c_buffer.device_adr;
break;
case I2C_SEND_ADR_DEV2:
if(i2c_buffer.pos_tail < i2c_buffer.len)
{
i2c_state = I2C_RECEIVE_DATA;
i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR;
i2c_buffer.pos_tail++;
}
else
{
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
case I2C_RECEIVE_DATA:
if(i2c_buffer.pos_tail < i2c_buffer.len)
{
i2c_state = I2C_RECEIVE_DATA;
i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR;
i2c_buffer.pos_tail++;
}
else
{
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
default:
break;
}
}
ПОМОГИТЕ!!!!!!!!
volatile uint16_t sr2 = I2C2->SR2;
if (!(sr2 & I2C_SR2_MSL)) return;
if( sr1 & I2C_SR1_SB) //принят ответ ACK, отправка адресса
{
i2c_state = I2C_SEND_ADR_DEV;
I2C2->DR = (uint16_t) i2c_buffer.device_adr;
}
if(sr1 & I2C_SR1_TXE) //принят ответ ACK, данных и стоп
{
switch (i2c_state)
{
case I2C_SEND_ADR_DEV:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
break;
case I2C_SEND_ADR_MEM:
if( i2c_buffer.pos_head < i2c_buffer.pos_tail && i2c_buffer.pos_head < i2c_buffer.len)
{
i2c_state = I2C_SEND_DATA;
I2C1->DR = i2c_buffer.buffer[i2c_buffer.pos_head];
i2c_buffer.pos_head++;
}
else
{
i2c_buffer.pos_tail = 0;
i2c_buffer.pos_head = 0;
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
case I2C_SEND_DATA:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
i2c_buffer.start_adr++;
break;
default:
break;
}
}
if( sr1 & I2C_SR1_RXNE ) //прерывание по чтению
{
switch (i2c_state)
{
case I2C_SEND_ADR_DEV:
i2c_state = I2C_SEND_ADR_MEM;
I2C2->DR = (uint16_t) i2c_buffer.start_adr;
break;
case I2C_SEND_ADR_MEM:
i2c_state = I2C_SEND_ADR_DEV2;
I2C2->DR = (uint16_t) i2c_buffer.device_adr;
break;
case I2C_SEND_ADR_DEV2:
if(i2c_buffer.pos_tail < i2c_buffer.len)
{
i2c_state = I2C_RECEIVE_DATA;
i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR;
i2c_buffer.pos_tail++;
}
else
{
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
case I2C_RECEIVE_DATA:
if(i2c_buffer.pos_tail < i2c_buffer.len)
{
i2c_state = I2C_RECEIVE_DATA;
i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR;
i2c_buffer.pos_tail++;
}
else
{
i2c_state = I2C_EMPTY;
I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
default:
break;
}
}