ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
74259 Топик полностью
vesago (18.11.2006 15:04, просмотров: 1) ответил DVK на В симуляторе Keil-а не работают PWM, SPI и может еще чего ...( Чип AT91SAM7S256 )
В общем так Не знаю как с SPI, но I2C драйвер для LPC я успешно отладил в симуляторе. Для этого пришлось написать, точнее подправить макрос по мотивам соответствующей апликухи кейла. Вот он:
// Simulation of I2C Memory (Slave)

MAP 0x30000, 0x37FFF READ WRITE      // Map User 64kB Memory region

DEFINE int SADR                              // Slave Address

signal void I2CMEMORY (void) {
  unsigned long adr;

  adr = 0x30000;

  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

Думаю, что и SPI таким же макаром надо. Сей макрос запускает виртуальную память с доступом по I2C. В симуляторе чудесно наблюдаю в соответствующем окне лог команд и изменение ячеек виртуальной памяти. В железе один к одному пошло.