Здравствуйте всем, ребят подскажите, что не так?...куда копать? Уже неделю убил
и никак не получу результат. Отлаживаюсь в keil v 4.10. Проблема следующая: имеется STM32F103Rx и термодатчик LM76. Пытаюсь общаться по I2C. Отправляю адрес на I2C, осцилографом вижу его. Когда дело доходит до отправки команды процесс виснет, результаты безуспешны!! Вот кусочек где виснет:
Код:
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
Проверил адреса, вроде ничего не напутал. Заметил такую странную особенность отправляю адрес 7-битовый смотрю в отладке перефирий I2C вижу, что адрес записывается не в 7-битовую ячейку, а в 10. Пытался понять в каком месте она перекидывает ее в 10, ведь отправляю как 7.
Вот код:
Код:
/* LM76 - Temperature Sensore----------------------------------------------*/
I2C_TypeDef* LM76_I2C;
void LM76Init(I2C_TypeDef* LM76_I2Cx)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
LM76_I2C = LM76_I2Cx;
I2C_Cmd(LM76_I2C, DISABLE);
I2C_DeInit(LM76_I2C);
/* Configure I2C1 pins: SCL and SDA ----------------------------------------*/
Set_System(); // HSE clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
/* Configure I2C1 pins: SCL and SDA ----------------------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* I2C1 configuration ------------------------------------------------------*/
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
I2C_Init(LM76_I2C, &I2C_InitStructure);
I2C_Cmd(LM76_I2C, ENABLE);
}
/*******************************************************************************
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void) {
LM76Init(I2C1);
// Enable I2C1 and I2C2 PEC Transmission
I2C_CalculatePEC(LM76_I2C, ENABLE);
//----- Transmission Phase -----
// Send I2C1 START condition
I2C_GenerateSTART(LM76_I2C, ENABLE);
// Test on I2C1 EV5 and clear it
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_MODE_SELECT));
// Send Slave address
I2C_Send7bitAddress(LM76_I2C, WriteAddress, I2C_Direction_Transmitter);
// Test on I2C1 EV6 and clear it
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// Send Command
I2C_SendData(LM76_I2C, Command);
// Test on I2C1 EV8 and clear it
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(LM76_I2C, Command);
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(LM76_I2C, Command);
// Enable Transfer PEC next for I2C1 and I2C2
I2C_TransmitPEC(LM76_I2C, ENABLE);
// Test on I2C1 EV8 and clear it
while(!I2C_CheckEvent(LM76_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
// Send I2C1 STOP Condition
I2C_GenerateSTOP(LM76_I2C, ENABLE);
while (1);
}
может, я что-то упустил?? Печатная плата исправна! Физически все верно. Пожалуйста подскажите, люди добрые!