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

prgjz

Участник
  • Постов

    62
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные prgjz


  1. STM32L5 FDCAN из Cube L5 не работает у меня с PCAN

    https://www.peak-system.com/PCAN-USB-FD.365.0.html?&L=1

    Выдаёт ощибку на CAN бусе.

    Может кто нибудь сказать что я не прав?

    IMXRT1064  не делает проблем. NXP SDK имеет бит тайминг калькулятор.

    В Cube MX я не нашёл такого...

    Читал рекомендации STM32L5 для FDCAN 80Mhz такт подавать.

    Но как то глупо иметь 110MHz а использовать только 80.

    https://www.rutronik.com/development-stories/rutdevkit-stm32l5/

    Вообще молодцы! У низ FDCAN пример 20Mhz?!?

    Буду очень признателен если кто меня прояснит.

  2. Доброго времени!

    Пытаюсь запустить SPI NAND Flash TC58CVG2S0HxAI на LPC4088 от NXP.

    Вроде всё просто но не работает правильно.

     

    ID читается.

    Стирание, запись и чтение происходит без ошибок.

    Но какой блок бы я не считывал — они содержат то что я

    в последний зписывал. Сохраняется и после сенятия/подачи напряжения.

    Пишу всегда блоком 4224 Байт (ECC включена).

     

    Может кто поделится опытом что я не так делаю?

    NAND.zip

  3. Получился у кого порт для IAR M4?

    У меня для LPC1769 без проблем...

    А вот LPC4087 только без FPU работает.

    Посмотрел в scmRTOS\port\cortex\mx-gcc\

    и сделал изменеимя в os_target_asm.s

     

    os_start

    ......

    #if __ARMVFP__

    LDR R4, [R0, #(4 * 15)] // Load process entry point into R4

    ADD R0, R0, #(4 * 17) // emulate context restore

    #else

    LDR R4, [R0, #(4 * 14)] // Load process entry point into R4

    ADD R0, R0, #(4 * 16) // emulate context restore

    #endif

     

    вообще не стартует.

    Если

    LDR R4, [R0, #(4 * 14)] и ADD R0, R0, #(4 * 16) оставить

    то TProc1::exec() вызывается правильно но PendSV_Handler

    при первом вызове в конце в летит и переключение не происходит.

     

     

     

     

     

     

    Моя ошибка - не доглядел...

    Изменил в os_target.cpp

     

    #ifdef __ARMVFP__

    StackPointer -= 6; // emulate "push LR,R12,R3,R2,R1,R0"

    *(--StackPointer) = 0xFFFFFFFDUL; // exc_return: Return to Thread mode, floating-point context inactive, execution uses PSP after return.

    StackPointer -= 8; // emulate "push R4-R11"

    #else

    StackPointer -= 14; // emulate "push R14,R12,R3,R2,R1,R0,R11-R4"

    #endif

     

    и всё пошло!!!

     

  4. Не могу разоброаться с функцинй __STREXH.

    NXP LPC1769.

     

    __no_init static volatile unsigned short can_a_tx_count; // at address 0x10007bb0

     

    volatile unsigned ttt;

    void can_a_route_buf(unsigned char * buf, unsigned int len)

    {

    .....

    ttt = __STREXH(can_a_tx_count+len,&can_a_tx_count); // возвращает всегда 1, а хотелось бы 0

    }

     

    Что делаю не так?

  5. упс... минимальный стек больше при FPU.

    Заработало но результат как и у kosyak©:

    При TN_SUPPORT_FPU = 0 и TN_SUPPORT_FPU = 1 работает без проблем.

    А вот при TN_SUPPORT_FPU = 2 падает в HardFault на инструкции VMOV S0,R0.

    R0 = 0x320. Уже день пробился безрезультатно.

    Меня собственно устраивает TN_SUPPORT_FPU = 1 :)

     

    Не подскажет ли кто как в EWARM заставть компилятор для определённой

    функции не делать код для FPU (#pragma например)?

  6. Всё отлтчно работает: C166v753 и MDK5.03 совместно установлены.

    При запуске проекта для С166 (у меня в частности XC167CI) ругается "Error: Device not found"

    но при нажатии на кнопку "OK" перестаёт ругаться и всё работает.

    Лечилка одна и таже. Выбираю Target C166 "Prof. Developers Kit/RealView MDK".

    Версия лекарства не известна, датируется 29.07.2010 13:18.

  7. Здравствуйте! TNKernal на LPC1778 без проблем. Решил прменять на LPC4078 из за плавающей точки.

    Если в настройках EWARM 6.50.2.4 LPC1778 на LPC4078 меняю - всё ещё хорошо.

    С добавлением FPU=VFPv4 программа ведёт себя как ревнивая женщина....

    fpu_init(); вызывается. Выражения в плавающей точкой применяются только

    в одной задаче. Кто может сталкивался с подобной проблемой? Проведите ликбез пожалуйста.

     

  8. #define DMA_TOUT 10000000

    Ещё ни разу не выалился по таймауту.

    Сама запись через DMA относительно постоянна по времени.

    SanDisk Extreme Pro 20Mhz CLK: 2мс ждёт в цикле для 16ти секторов (8kbyte)

    for (i = DMA_TOUT; i; i--) {

    if (LPC_GPDMA->RawIntTCStat & (1<<(GPDMA_MCI_WRITE_CHANNEL))) {

    /* Data transfer finished. */

    break;

    }

    }

     

    В начале использовал прерыания чтобы не ждать. Но для поблочного переноса нужно дать для того чтоб в конце

    переноса CMD12 (Stop Read or Write transm.) послать.

    При использовании ОСи не проблема подождать в низко приоритетной задаче.

    Я использую TNKernel которую могу только порекомендовать.

    Без ОСи ждать действтительно не лучший вариант.

     

  9. Сожалею но не могу секунду ждать. У меня логгер 25600Hz 32 канала записывает.

    Только я не совсем понимаю зачем тогда поблочная запись если секунду ждать можно?

    Пробовал заменить на

    for(volatile unsigned int i = 100; i;--i);

    работает.

  10. Всё просто: сначала (CMD13+CMD25) а потом в цикле равном количеству секторов

    for (j = 0; j < cnt; buf += 512, j++) {
       /* Set MCI Transfer registers. */
       LPC_MCI->DATATMR  = DATA_WR_TOUT_VALUE;
       LPC_MCI->DATALEN  = 512;
    
       /* Start DMA Memory to Peripheral transfer. */
       DmaStart (DMA_WRITE, buf);
       LPC_MCI->DATACTRL = 0x99;
    
       for (i = DMA_TOUT; i; i--) {
         if (LPC_GPDMA->RawIntTCStat & 0x01) {
           /* Data transfer finished. */
           break;
         }
       }
    
       if (i == 0) {
         /* DMA Data Transfer timeout. */
         return (__FALSE);
       }
    
       if (cnt == 1) {
         break;
       }
    
       /* Wait until Data Block sent to Card. */
       while (LPC_MCI->STATUS != (MCI_DATA_END | MCI_DATA_BLK_END)) {
         if (LPC_MCI->STATUS & (MCI_DATA_CRC_FAIL | MCI_DATA_TIMEOUT)) {
           /* Error while Data Block sending occured. */
           return (__FALSE);
         }
       }
       /* Wait 2 SD clocks */
       for (i = WAIT_2SD_CLK(__CPUCLK); i; i--);
     }

     

    И в конце CMD12

  11. В MCI_Cmd_WriteBlock() numOfBlock и не нужна. Я тоже не знаю зачем они её туда передают...

    В этой функции другая ошибка:

    cmdIf.Argument = blockNum * BLOCK_LENGTH;

    А должно что то типа

    if(SDHC)

    cmdIf.Argument = blockNum;

    else

    cmdIf.Argument = blockNum * BLOCK_LENGTH;

     

    А вот в MCI_WriteBlock(), которая в свою очередь вызывает MCI_Cmd_WriteBlock() стоит

    LPC_MCI->DATALEN = BLOCK_LENGTH*numOfBlock;

    Кстати сегодня вышел новый релиз в котором исправлены некоторые ошибки в lpc177x_8x_mci.c

    Посмотрите на http://sw.lpcware.com/index.php

     

  12. Делал, запись работает а вот читать поблочно не получается. На LPCWare.com есть пример который я в начале взял за основу.

    Но у меня примерно после 7 секунд почему то не вызывалось прерывание MCI и программка зависала не получив флаг окончания переноса данных.

  13. Работает на LPC1769 и LPC2387:

    void rtc_init( void )

    {

    /// Enable power for RTC

    PCONP_bit.PCRTC = 1;

    // CTC reset and select RTC clock from 32 Khz.oscillator

    #if __CORE__ < 7

    if(LPC_RTC->CCR != 0x11)

    LPC_RTC->CCR = 0x12;

     

    #else

    // If RTC is stopped, clear STOP bit.

    if ( LPC_RTC->RTC_AUX & (0x1<<4) )

    {

    LPC_RTC->RTC_AUX |= (0x1<<4);

    LPC_RTC->CCR = 0x12;

    }

    #endif

    // Clear RTC interrupt register

    LPC_RTC->ILR = 0xFF;

    // Dasable all the alrams.

    LPC_RTC->AMR = 0xFF;

    // Enable only second count interrupt.

    LPC_RTC->CIIR = 0x01;

    // Disable all subsecond interrupts.

    #if __CORE__ < 7

    // Enable RTC

    LPC_RTC->CCR = 0x11;

    #else

    LPC_RTC->CALIBRATION = 0;

    LPC_RTC->CCR = 0x11;

    #endif

    rtc_read(0);

    }

  14. Рабочий проект выложить не могу, а отдельно сделать к сожалению сейчас нет времени. Выкладываю свои изменения в стеке Юрия которому, пользуясь случаем, огромное спасибо за эту работу. Всё остальное в tcp.cpp. Основное изменение это возможность одновременно использовать для Cortex и ARM7 проектов. MAC address первые три NXP Semiconductors (0x00,0x60,0x37) остальные берутся из серийного номера. Успеха!

    tn_net.zip

    tcp.zip

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