|
|
  |
Keil:отладка SPI |
|
|
|
Jun 21 2008, 08:01
|
Тутэйшы
   
Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263

|
Скорее всего нужно написать скрипт, который запустить в отладчике. По крайней мере по i2c и uart данные отлично гоняются. i2c я качнул с сайта кейла какой-то пример и подрихтовал под свои нужды. По симулятору кейла можно почитать на www.onembedding.com. Вот пример для i2c и уарт: Код // 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
//mode com1 38400 //assign com1 <s0in>s0out
SIGNAL void q (void) { // while (1) // { S0IN = 0xC0; twatch (60000); S0IN = 0x81; twatch (60000); S0IN = 0x07; twatch (60000);
S0IN = 0x05; twatch (60000);
S0IN = 0x06; twatch (60000); S0IN = 0x00; twatch (60000); S0IN = 0x00; twatch (60000); S0IN = 0x00; twatch (60000); S0IN = 0x05; twatch (60000); S0IN = 0xDA; twatch (60000); // } }
|
|
|
|
|
Jun 24 2008, 05:17
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(vesago @ Jun 21 2008, 15:01)  Скорее всего нужно написать скрипт, который запустить в отладчике. как то сложно все. Хотелось бы просто в окошечко SPIDAT в указанной закладке данный написать , а они бы воспринялись прогой. Например изменение флага ISPI тут же вызывает переход проги на прерывание. А SPIDAT обнуляется и ничего в прогу не передается.
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jun 24 2008, 21:30
|
Группа: Новичок
Сообщений: 4
Регистрация: 24-06-08
Пользователь №: 38 534

|
Цитата(SALOME @ Jun 21 2008, 09:35)  Подскажите, плз, как сделать, чтобы при отладке программы в Кeil uVision3 данные записанные в окне отладчика SPIDAT записывались в память при пошаговой отладке? Просто в консоли написать, например: SPI_IN=0x12 После очередного обмена, когда txbsy стал нулем именно это значение окажется в SPI0DAT в том самом непослушном окне
|
|
|
|
|
Jun 25 2008, 01:56
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Fufelly @ Jun 25 2008, 04:30)  Просто в консоли написать, например: SPI_IN=0x12 После очередного обмена, когда txbsy стал нулем именно это значение окажется в SPI0DAT в том самом непослушном окне Попробовала Вашу методу. У меня она не сработала. Я отлаживаю ADuC845 и "txbsy, SPI0DAT" в нем отсутствуют. Вообщем-то я выхожу из положения путем записи данных от SPI в целевой регистр. Но это уже извраты. Хотелось бы нормально работать с отладчиком.
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jun 30 2008, 02:16
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(vesago @ Jun 28 2008, 01:50)  Тут и тут расписано как это сделать. Подрихтуйте под свои нужды приведенный скрипт. Подскажите, плз, как этими скриптами пользоваться. Как оболочка с ними взимодействует?
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jul 3 2008, 18:54
|
Группа: Новичок
Сообщений: 4
Регистрация: 24-06-08
Пользователь №: 38 534

|
Цитата(SALOME @ Jun 25 2008, 05:56)  Попробовала Вашу методу. У меня она не сработала. Я отлаживаю ADuC845 1. Процессор не был указан и я привел пример для Silabs F023 2. SPI процессора в режиме SLAVE (я так понял) и это ВАЖНО! Код #include <aduc845.h> unsigned char a; void main(void) { SPICON=0x2b; for(;;){ SPIDAT=0x45; for(;! ISPI;); a=SPIDAT; // ставим сюда точку останова } } 3. Запускаем программу на выполнение 4. В консоли пишем spi_ss=0 spi_in=0x12 spi_ss=1 5. Срабатывает точка останова и в переменную a попадает 0x12, а консольная переменная spi_out принимает значение 0x45, в чем можно убедиться просто набрав в консоли: spi_out Следующим этапом должно стать освоение работы с ini файлами.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|