Перейти к содержанию
    

STM32F2 in I2C slave mode

Всем доброго времени!

Есть проект :wacko: ))

Соорудил платформу на которой живут две технологии АРМ9(NUC950ADN) + CortexM3(stm32F2). На АРМ9 линукс+файловая, CortexM3 - standalone (пока без фриртоса). Комуникация между двумя камнями предусмотрел частично по USART частично по I2C чтобы не вешать все на один протокол (АРМ9 играет роль как-бы главной системы для выхода в сеть, ну и больше гипкости с операционкой)))), роль CortexM3 сбор информации с различных подключенных к ниму датчиков, сенсоров... обработка их, ну и дальнейшая передача АРМУ. Часть информации передается по USART, там вроде все понятно, с I2C озадачился:

на ARM9 компильнул и установил I2С тулзы, на М3 поднял либу подсмотрев пример в "STM32F2xx_StdPeriph_Examples\I2C\I2C_TwoBoards".

по дефолту решил что АРМ9 мастер - М3 слейв.

Проблема с ледующего характера:

надо из М3 сделать адекватного слейва (похожего на ЕЕПРОМ) который смог бы реагировать на вот такие команды "i2cget -y -0 0x18 0x01"

исплоьзуя пример:

 /* Get Last I2C Event */
  Event = I2C_GetLastEvent(I2Cx);
  switch (Event)
  { 
    /* ****************************************************************************/
    /*                          Slave Transmitter Events                          */
    /*                                                                            */
    /* ****************************************************************************/  
    
    /* Check on EV1 */
  case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:  
    I2C_SendData(I2Cx, TxBuffer[Tx_Idx++]);
    I2C_ITConfig(I2Cx, I2C_IT_BUF , ENABLE);
    break;
    /* Check on EV3 */
  case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
  case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:    
    if (Tx_Idx < NumberOfByteToTransmit)
    {
      I2C_SendData(I2Cx, TxBuffer[Tx_Idx++]);
    }
    else
    {
      /* Disable I2C event interrupt */
      I2C_ITConfig(I2Cx, I2C_IT_EVT  | I2C_IT_BUF, DISABLE);
    }
    break;
    
    /* ****************************************************************************/
    /*                              Slave Receiver Events                         */
    /*                                                                            */
    /* ****************************************************************************/ 
    
    /* check on EV1*/
  case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
    Rx_Idx = 0x00;
    break;
    
    /* Check on EV2*/
  case I2C_EVENT_SLAVE_BYTE_RECEIVED:  
  case (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_SR1_BTF):  
    RxBuffer[Rx_Idx++] = I2C_ReceiveData(I2Cx);
    break;

    /* Check on EV4 */
  case I2C_EVENT_SLAVE_STOP_DETECTED:             
    I2C_GetFlagStatus(I2Cx, I2C_FLAG_STOPF);
    I2C_Cmd(I2Cx, ENABLE);
    break;
    
  default:
    break;
  }

 

нормально работают команды i2cget -y 0 0x18 - получить значение которое хранится в буфере, i2cset -y 0 0x18 0x2 0x3 - переслать слейву значение 0х3 в регистр 0х2,

 

А из под линукса буду работать именно "i2cget -y 0 0x18 0х00". считать данные по такому то адресу с такого то регистра. Тоесть я понимаю что проблема в коде и его надо переделать, так-как данный пример заточет под просто отправку и под просто прием. А мне надо грубо рабоать с ним как-бы с EEPROM тоесть режим комбинированного старта где пакет " START+ADDR+W+ack+DATA+ACK+STAR2+ADDR+R+ACK" тоесть режим повторног старта когда мастер нагло еще раз лезит со стартом и повторным адресом (так мой осцилограф показывает) ?

После прочтений даташитов и еще прочтений и надо будет еще читать понял то, что мало понял что там ST накрутил..

есть такие функции

/* I2C2 second address configuration */
  I2C_OwnAddress2Config(I2C1, SLAVE_ADDRESS);
  /* Enable I2C2 Dual address */
  I2C_DualAddressCmd(I2C1, ENABLE);

до конца не могу понять для чего они , может их надо использовать?

Сталкивался кто либо с такой задачей или знает в каком русле рыть? буду благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...