Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Безумен проблем
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=18176
Страница 1 от 2

Автор:  Н'бабане Гт'муан'га [ Вто Яну 11, 2022 5:09 pm ]
Заглавие:  Безумен проблем

От два дни си блъскам главата с много странен проблем, който не съм виждал никога преди...
Имам един PIK32MZ който е закачен към TMC5160A през SPI и се опитвам да подкарам степъра. Намерих някаква библиотека в гита: https://github.com/terjeio/Trinamic-library

Значи проблема: при първоначалната инициализация, степъра си отговаря и всичко си минава нормално когато трасирам кода, обаче ако го пусна директно, не отговаря изобщо. Няма никакви тайминги дето да играят роля, а самите SPI функции се ползват и на други места и си работят нормално.

Не ми идва наум какво би могло да бъде...

Ето как изглежда функцията дето чете:


Код:

uint8_t xchgTMC5160(uint16_t reg, uint8_t *data) {
    nSS1 = 0;
    reg = xchgSPI(SYSTEM_SPI, (uint8_t) reg);
    data[3] = xchgSPI(SYSTEM_SPI, data[3]);
    data[2] = xchgSPI(SYSTEM_SPI, data[2]);
    data[1] = xchgSPI(SYSTEM_SPI, data[1]);
    data[0] = xchgSPI(SYSTEM_SPI, data[0]);
    nSS1 = 1;
    return reg;
}


// interface helper function for the TMC5160 API
TMC_spi_status_t tmc_spi_read (trinamic_motor_t driver, TMC_spi_datagram_t *datagram) {
    openSPI(SYSTEM_SPI, 3, 8, 3000000);
    datagram->addr.write = 0;
    datagram->payload.value = 0;
    xchgTMC5160(datagram->addr.value, (uint8_t *) (uint8_t *) &datagram->payload.value);
    uSec(5);    // a very short delay here
    TMC_spi_status_t s = (TMC_spi_status_t) xchgTMC5160(datagram->addr.value, (uint8_t *) &datagram->payload.data);
    openSPI(SYSTEM_SPI, 0, 0, 0);
    return s;
}




Това с пращането на празния байт е точно според примерния код на автора на библиотеката

Автор:  TheWizard [ Вто Яну 11, 2022 5:26 pm ]
Заглавие:  Re: Безумен проблем

това ми се е случвало - с дебъгер работи, директно не ... ама нямам спомени ...

чекни алигмент и пакетиране на структурите
trinamic_motor_t driver туй нещо цяла структура ли е или пойнтер

Автор:  Н'бабане Гт'муан'га [ Вто Яну 11, 2022 5:38 pm ]
Заглавие:  Re: Безумен проблем

Структура е:
https://github.com/terjeio/Trinamic-lib ... r/tmchal.h

Иначе основната купчина структури е доста по-сложна:
https://github.com/terjeio/Trinamic-lib ... /tmc5160.h


Добра идея, ще прегледам за подравняване, макар че нищо не съм специфицирал ръчно...

Автор:  TheWizard [ Вто Яну 11, 2022 5:53 pm ]
Заглавие:  Re: Безумен проблем

Код:
typedef struct {
    uint8_t id;     // motor id
    uint8_t axis;   // axis index
    uint8_t seq;    // optional motor sequence number (for chained SPI drivers)
    void *cs_pin;   // optional CS pin data for the stepper driver
} trinamic_motor_t;


TMC_spi_status_t tmc_spi_read (trinamic_motor_t driver, TMC_spi_datagram_t *datagram)
ми изглежда подозрителен параметър "пуш" ... макар че не се използва

и бих използвал UART printf("1....2....3") заместител на дебъгера за проверка къде точно се омазва в "директен режим"

Автор:  TheWizard [ Вто Яну 11, 2022 6:01 pm ]
Заглавие:  Re: Безумен проблем

TMC_spi_datagram_t има четно/нечетно (подозрително) подравняване от масив към структура (армовете могат някой неща дето пиковете не могат)
чесно клазано в момента много много не мисля - просто "гледам" дали има нещо "подозрително"
пробвай с принтф

Автор:  bobihot [ Сря Яну 12, 2022 3:04 am ]
Заглавие:  Re: Безумен проблем

TheWizard написа:
Код:
typedef struct {
    uint8_t id;     // motor id
    uint8_t axis;   // axis index
    uint8_t seq;    // optional motor sequence number (for chained SPI drivers)
    void *cs_pin;   // optional CS pin data for the stepper driver
} trinamic_motor_t;


-Интересно предположение. пробвай void *cs_pin да го преместиш първи, или да добавиш uint8_t хх пред него?

Автор:  Н'бабане Гт'муан'га [ Сря Яну 12, 2022 12:38 pm ]
Заглавие:  Re: Безумен проблем

Значи, проблемът сис сигурност е в пакетирането! Махнах прагмата в tmc5160.h и тогава инициализацията минава, но с грешни резултати.
Разместване на trinamic_motor_t структурата не помага за съжаление...

Автор:  TheWizard [ Сря Яну 12, 2022 1:12 pm ]
Заглавие:  Re: Безумен проблем

дам ... те бай дефол са алигнати ( ако не са пакет )


Код:
TMC_spi_status_t tmc_spi_read (trinamic_motor_t driver, TMC_spi_datagram_t *datagram) {
print("1");
    openSPI(SYSTEM_SPI, 3, 8, 3000000);
print("2");   
    datagram->addr.write = 0;
    datagram->payload.value = 0;
    xchgTMC5160(datagram->addr.value, (uint8_t *) (uint8_t *) &datagram->payload.value);
print("3");
    uSec(5);    // a very short delay here
    TMC_spi_status_t s = (TMC_spi_status_t) xchgTMC5160(datagram->addr.value, (uint8_t *) &datagram->payload.data);
print("4");   
    openSPI(SYSTEM_SPI, 0, 0, 0);
print("5");   
    return s;
}


тъпо, но локализира: къде... без дебъгер
тогава принт дъмп параметри
printf("blah %p\n", datagram)
printf("blah %p\n", datagram->addr) ... да го еа и те така, що така


реално "проблема" ти прави trap_isr( wait forever )
там може да printf dump reg ... къде, какво, как от de-asm

Автор:  MYXATA [ Сря Яну 12, 2022 1:20 pm ]
Заглавие:  Re: Безумен проблем

Един въорос, опитвал ли си да говориш със съпорта? Не е гаражна компания , би трябвало да ти отговорят....
То Тринамик, ги купиха Максим, оък максим пожелага да ги куоят Аналог....

Автор:  TheWizard [ Сря Яну 12, 2022 1:29 pm ]
Заглавие:  Re: Безумен проблем

не мога да анализарам кода ти, но навярно имаш некъв масив данни от които използваш директно struct с нечетно отместване
( това в някой случай минава на ARM, но на PIC не ... а явно кода е тестван с ARM )

навярно...

Автор:  Н'бабане Гт'муан'га [ Сря Яну 12, 2022 1:48 pm ]
Заглавие:  Re: Безумен проблем

Добрите стари принтове са в употреба от десетилетия :D Но в тоя случай почти не помагат...
Ето малко моднат код с принтове:

Код:

uint8_t xchgTMC5160(uint16_t reg, uint8_t *data) {
    nSS1 = 0;

printf("datagram: 0x%p   [%02X]: %02X, %02X, %02X, %02X", data,
        (int) reg, (int) data[3], (int) data[2], (int) data[1], (int) data[0]); //###

    reg = xchgSPI(SYSTEM_SPI, (uint8_t) reg);   // getting the status byte here
    data[3] = xchgSPI(SYSTEM_SPI, data[3]);
    data[2] = xchgSPI(SYSTEM_SPI, data[2]);
    data[1] = xchgSPI(SYSTEM_SPI, data[1]);
    data[0] = xchgSPI(SYSTEM_SPI, data[0]);

printf("  -->  [%02X]: %02X, %02X, %02X, %02X\r\n",
        (int) reg, (int) data[3], (int) data[2], (int) data[1], (int) data[0]); //###

    nSS1 = 1;
    return reg;
}


// interface helper function for the TMC5160 API
TMC_spi_status_t tmc_spi_write (trinamic_motor_t driver, TMC_spi_datagram_t *datagram) {
    openSPI(SYSTEM_SPI, 3, 8, 3000000);
    datagram->addr.write = 1;
    uint8_t v[4];
    memcpy(v, datagram->payload.data, 4);
    TMC_spi_status_t s = (TMC_spi_status_t) xchgTMC5160(datagram->addr.value, v);
    openSPI(SYSTEM_SPI, 0, 0, 0);
    return s;
}


// interface helper function for the TMC5160 API
TMC_spi_status_t tmc_spi_read (trinamic_motor_t driver, TMC_spi_datagram_t *datagram) {
    openSPI(SYSTEM_SPI, 3, 8, 3000000);
    datagram->addr.write = 0;
    memset(datagram->payload.data, 0, 4);
    xchgTMC5160(datagram->addr.value, datagram->payload.data);
    uSec(5);    // a very short delay here
    TMC_spi_status_t s = (TMC_spi_status_t) xchgTMC5160(datagram->addr.value, datagram->payload.data);
    openSPI(SYSTEM_SPI, 0, 0, 0);
    return s;
}




Навсякъде където зависи от моя код тук избягвам обръщения към по-големи от байт данни. Ако нещо се случва в библиотеките, там вече не зависи от мен...

Ето резултатите:

1. В трейс (без брейкпоинтс, цялото изпълнение минава и приключва успешно):

Код:
datagram: 0x0x8007ff6f   [6F]: 00, 00, 00, 00  -->  [00]: 00, 00, 00, 00
datagram: 0x0x8007ff6f   [6F]: 00, 00, 00, 00  -->  [F9]: 80, 08, 00, 00
datagram: 0x0x8007ff2e   [01]: 00, 00, 00, 00  -->  [F9]: 80, 08, 00, 00
datagram: 0x0x8007ff2e   [01]: 80, 08, 00, 00  -->  [F9]: 00, 00, 00, 05
datagram: 0x0x8007fed8   [80]: 00, 00, 00, 04  -->  [F9]: 00, 00, 00, 05
datagram: 0x0x8007fed8   [EC]: 16, 00, 81, 35  -->  [F9]: 00, 00, 00, 04
datagram: 0x0x8007fed8   [ED]: 00, 00, 22, 05  -->  [F9]: 16, 00, 81, 35
datagram: 0x0x8007fed8   [F0]: C8, 0D, 0E, 24  -->  [F9]: 00, 00, 22, 05
datagram: 0x0x8007fed8   [91]: 00, 00, 00, 80  -->  [F9]: C8, 0D, 0E, 24
datagram: 0x0x8007fed8   [93]: 00, 00, 00, 00  -->  [F9]: 00, 00, 00, 80
datagram: 0x0x8007feb8   [8B]: 00, 00, 00, 85  -->  [F9]: 00, 00, 00, 00
datagram: 0x0x8007fed8   [90]: 00, 06, 09, 04  -->  [F9]: 00, 00, 00, 85
datagram: 0x0x8007ff74   [6C]: 00, 00, 00, 00  -->  [F9]: 00, 06, 09, 04
datagram: 0x0x8007ff74   [6C]: 00, 06, 09, 04  -->  [F9]: 16, 00, 81, 35


2. Наливам същия код във флаша и пускам:

Код:
datagram: 0x0x8007ff6f   [6F]: 00, 00, 00, 00  -->  [FF]: FF, FF, FF, FF
datagram: 0x0x8007ff6f   [6F]: FF, FF, FF, FF  -->  [FF]: FF, FF, FF, FF



Ето това е което се изпълнява на по-високо ниво:

Код:
TMC5160_t m;
TMC5160_SetDefaults(&m);
if(TMC5160_Init(&m)) {  .....

Автор:  TheWizard [ Сря Яну 12, 2022 2:18 pm ]
Заглавие:  Re: Безумен проблем

Код:
datagram: 0x0x8007ff6f   [6F]: 00, 00, 00, 00  -->  [FF]: FF, FF, FF, FF не чете


xchgSPI() ... DMA ( кеш/некеш ? ) или baremetal в TX/RX рег

принтни и xchgSPI

Автор:  Н'бабане Гт'муан'га [ Сря Яну 12, 2022 2:21 pm ]
Заглавие:  Re: Безумен проблем

Код:
unsigned long xchgSPI(unsigned char channel, unsigned long tx_data) {
    unsigned long rx_data = 0;
    if(channel >= 0) {
        SpiChnGetRov((SpiChannel) channel, TRUE);
        SpiChnPutC((SpiChannel) channel, tx_data);  /* transmit data */
        rx_data = SpiChnGetC((SpiChannel) channel); /* receive data */
    }
   return rx_data;
}

Автор:  TheWizard [ Сря Яну 12, 2022 2:25 pm ]
Заглавие:  Re: Безумен проблем

[6F]: 00, 00, 00, 00 или не предава --> [FF]: FF, FF, FF, FF или не чете ... на пръв поглед това се вижда
провери( printf ) драйвер фунk на SPI

Автор:  Н'бабане Гт'муан'га [ Сря Яну 12, 2022 2:35 pm ]
Заглавие:  Re: Безумен проблем

Проверих го с принтове.Каквото е на екрана това минава през SPI бъса

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/