Отговори на тема  [ 21 мнения ]  Отиди на страница 1, 2  Следваща
Безумен проблем 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Безумен проблем
От два дни си блъскам главата с много странен проблем, който не съм виждал никога преди...
Имам един 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;
}




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

_________________
'просто' е технически синоним на 'красиво'


Вто Яну 11, 2022 4:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: Безумен проблем
това ми се е случвало - с дебъгер работи, директно не ... ама нямам спомени ...

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

_________________
main[-1u]={1};


Вто Яну 11, 2022 4:26 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Безумен проблем
Структура е:
https://github.com/terjeio/Trinamic-lib ... r/tmchal.h

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


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

_________________
'просто' е технически синоним на 'красиво'


Вто Яну 11, 2022 4:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение 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") заместител на дебъгера за проверка къде точно се омазва в "директен режим"

_________________
main[-1u]={1};


Вто Яну 11, 2022 4:53 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: Безумен проблем
TMC_spi_datagram_t има четно/нечетно (подозрително) подравняване от масив към структура (армовете могат някой неща дето пиковете не могат)
чесно клазано в момента много много не мисля - просто "гледам" дали има нещо "подозрително"
пробвай с принтф

_________________
main[-1u]={1};


Вто Яну 11, 2022 5:01 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 2:35 pm
Мнения: 1748
Мнение 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 2:04 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Безумен проблем
Значи, проблемът сис сигурност е в пакетирането! Махнах прагмата в tmc5160.h и тогава инициализацията минава, но с грешни резултати.
Разместване на trinamic_motor_t структурата не помага за съжаление...

_________________
'просто' е технически синоним на 'красиво'


Сря Яну 12, 2022 11:38 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение 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

_________________
main[-1u]={1};


Сря Яну 12, 2022 12:12 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 12:48 pm
Мнения: 4406
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: Безумен проблем
Един въорос, опитвал ли си да говориш със съпорта? Не е гаражна компания , би трябвало да ти отговорят....
То Тринамик, ги купиха Максим, оък максим пожелага да ги куоят Аналог....

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Сря Яну 12, 2022 12:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: Безумен проблем
не мога да анализарам кода ти, но навярно имаш некъв масив данни от които използваш директно struct с нечетно отместване
( това в някой случай минава на ARM, но на PIC не ... а явно кода е тестван с ARM )

навярно...

_________________
main[-1u]={1};


Сря Яну 12, 2022 12:29 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение 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)) {  .....

_________________
'просто' е технически синоним на 'красиво'


Сря Яну 12, 2022 12:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: Безумен проблем
Код:
datagram: 0x0x8007ff6f   [6F]: 00, 00, 00, 00  -->  [FF]: FF, FF, FF, FF не чете


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

принтни и xchgSPI

_________________
main[-1u]={1};


Сря Яну 12, 2022 1:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение 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;
}

_________________
'просто' е технически синоним на 'красиво'


Сря Яну 12, 2022 1:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4715
Мнение Re: Безумен проблем
[6F]: 00, 00, 00, 00 или не предава --> [FF]: FF, FF, FF, FF или не чете ... на пръв поглед това се вижда
провери( printf ) драйвер фунk на SPI

_________________
main[-1u]={1};


Сря Яну 12, 2022 1:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4616
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: Безумен проблем
Проверих го с принтове.Каквото е на екрана това минава през SPI бъса

_________________
'просто' е технически синоним на 'красиво'


Сря Яну 12, 2022 1:35 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 21 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни