STM32F103 и LM76 проблема I2C

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

STM32F103 и LM76 проблема I2C

Сообщение capacitor » 20 апр 2011, 16:40

Здравствуйте всем, ребят подскажите, что не так?...куда копать? Уже неделю убил :o и никак не получу результат. Отлаживаюсь в 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);
}


может, я что-то упустил?? Печатная плата исправна! Физически все верно. Пожалуйста подскажите, люди добрые!
capacitor
 
Сообщения: 1
Зарегистрирован: 20 апр 2011, 16:12

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5