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

Симуляция i2c в кейле

Несколько дней назад на каком-то форуме видел вопрос - как кейлом симулировать i2c. А тут намедни самому понадобилось отладить соответствующий модуль. Скачал с кейла макрос и немного поправил - пользуйтесь кому надо.

Если кто не знает - сохраняем как I2CMemory.ini, подключаем в дебагере. Макрос автоматом запускается. Адрес слейва 0x0A, что соответствует 0x50 без бита операции. Пишет читает в область памяти 0x30000 - 0x300FF - можно открыть в окошке и наблюдать. Вообще макросы - сила дебагера кейла. Для определения времени выполнения кода на www.onembedding.com имеется соответствующий макрос.

 

// Simulation of I2C Memory (Slave)

MAP 0x30000, 0x300FF READ WRITE      // Map User Memory region

DEFINE int SADR                              // Slave Address

signal void I2CMEMORY (void) {
  unsigned long adr;

  adr = 0x30000;//V:0;
  while (1) {
    wwatch (I2C_OUT);                        // Wait for data from Microcontroller
    while (I2C_OUT == 0x0100) {              // START detected
      wwatch (I2C_OUT);                      // Wait for data from Microcontroller
      if (I2C_OUT > 0xFF) continue;
      if ((I2C_OUT >> 1) != SADR) continue;  // test if Slave is addressed
      I2C_IN = 0xFF00;                       // ACK to Microcontroller
      if (I2C_OUT & 1) {                     // Slave Read
        while (1) {  
          I2C_IN = _RBYTE(adr);              // Read Byte from Memory
          adr++;                             // Increment Address
          wwatch (I2C_OUT);                  // Wait for ACK from Microcontroller
          if (I2C_OUT != 0xFF00) break;
        }
      }
      else {                                 // Slave Write
        wwatch (I2C_OUT);                    // Wait for data from Microcontroller
        if (I2C_OUT > 0xFF) continue;
        adr = (I2C_OUT << 8) | 0x30000;          // Set Memory Address High Byte
        I2C_IN = 0xFF00;                     // ACK to Microcontroller
        wwatch (I2C_OUT);                    // Wait for data from Microcontroller
        if (I2C_OUT > 0xFF) continue;
        adr = I2C_OUT | adr;                 // Set Memory Address Low Byte
        I2C_IN = 0xFF00;                     // ACK to Microcontroller
        while (1) {
          wwatch (I2C_OUT);                  // Wait for data from Microcontroller
          if (I2C_OUT > 0xFF) break;
          _WBYTE (adr, I2C_OUT);             // Store Byte in Memory
          adr++;                             // Increment Address
          I2C_IN = 0xFF00;                   // ACK to Microcontroller
        }
      } 
    }
  }
}


SADR = 0x50  // Slave Address
I2CMemory()  // Starting signal function

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


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

С помощью данного макроса я отладил свой драйверок, написанный на основе кода, любезно выложенного ZLTIGO. Все работает, однако через раз (при чтении). При выполнении второй операции чтения после посылки адреса слейва в прерывании i2c возвращает код потери арбитража 0х38. Сдается мне, что я что-то не так делаю. К тому же прочитал мануал на 2101 (вроде и в 2138 такое есть) - там после многих кодов вроде 0x8, 0x10 и т.п. рекомендуется выставлять бит ACK, даже если мастер. Я попробовал кое-где ставить - сбоить начинает. Со своей проблемой я справился путем старта после получения кода потери арбитража, однако интересно как на самом деле правильно делать?

Вот тут обсуждение в тему велось http://www.telesys.ru/wwwboards/mcontrol/1...es/227979.shtml.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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