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

isz

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

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

  • Посещение

Репутация

0 Обычный

Информация о isz

  • Звание
    Участник
    Участник
  • День рождения 02.05.1982

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Ethernet и STM32F407

    Отвечаю сам себе. Причина банальна - невнимательность. Не перевел выводы в самый быстрый режим. Это строчка все исправила: EthPins::SetSpeed(EthPins::Speed::Fastest);
  2. Ethernet и STM32F407

    Добрый день. Сломал голову на проблеме при отправке ethernet фреймов. Работа ведется на отладочной плате и код из CubeMX на ней работает. Прием в моем коде тоже корректно работает. Для проверки сократил код до минимума. Вот его кусок: uint8_t testData[128]; uint8_t dest_mac[]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; uint8_t my_mac[]={0x00,0x80,0xE1,0x00,0x57,0x23}; int main () { InitHw(); while (ethernetif_init(my_mac)!=ETH_SUCCESS); for(uint8_t a=0; a< 128; a++) testData[a]=a; memcpy(testData,dest_mac,6); memcpy(testData+6,my_mac,6); for (;;) { ethernetif_output(testData, 128); volatile uint32_t i; for(i=0; i<10000000;i++); } } Функции ethernetif_init и ethernetif_output - это переделанные функции из апнота AN3966 (LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers) с сайта ST. Библиотека STM32F4x7_ETH_Driver от туда же без переделок. На компе в WireShark вижу следующее: Некоторые ошибки пометил. Почему так получается никак не могу понять. Код практически идентичен различным примерам. Где закралась ошибка не вижу своим замыленым взглядом. Прослеживал отладчиком до самой отправки. Данные целые и в буфере testData и потом в буферах Tx_Buff из библиотеки. Вот код функций uint32_t ethernetif_init(uint8_t* mac) { Clock::EthMacClock::Enable(); Clock::EthMacTxClock::Enable(); Clock::EthMacRxClock::Enable(); Clock::SyscfgClock::Enable(); // Select MII or RMII uint32_t temp = (SYSCFG->PMC&(~SYSCFG_PMC_MII_RMII_SEL))|SYSCFG_PMC_MII_RMII_SEL; SYSCFG->PMC|= temp; EthPins::SetConfiguration(EthPins::Configuration::AltFunc); EthPins::AltFuncNumber(11); // Enable ethernet interrupts NVIC_EnableIRQ(ETH_IRQn); return low_level_init(mac); } static uint32_t low_level_init(uint8_t* mac) { int i; ETH_SoftwareReset(); ETH_StructInit(&eth_init); eth_init.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable; // ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; // ETH_InitStructure.ETH_Speed = ETH_Speed_10M; // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; eth_init.ETH_LoopbackMode = ETH_LoopbackMode_Disable; eth_init.ETH_RetryTransmission = ETH_RetryTransmission_Disable; eth_init.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; eth_init.ETH_ReceiveAll = ETH_ReceiveAll_Disable; eth_init.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable; eth_init.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; eth_init.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; eth_init.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; #ifdef CHECKSUM_BY_HARDWARE eth_init.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable; #endif /*------------------------ DMA -----------------------------------*/ /* When we use the Checksum offload feature, we need to enable the Store and Forward mode: the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, if the checksum is OK the DMA can handle the frame otherwise the frame is dropped */ eth_init.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable; eth_init.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; eth_init.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; eth_init.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; eth_init.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; eth_init.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable; eth_init.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; eth_init.ETH_FixedBurst = ETH_FixedBurst_Enable; eth_init.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat; eth_init.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat; eth_init.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1; while (ETH_GetSoftwareResetStatus() == SET); if (ETH_Init(&eth_init, 1)==ETH_ERROR)return ETH_ERROR; /* initialize MAC address in ethernet MAC */ ETH_MACAddressConfig(ETH_MAC_Address0, mac); /* Initialize Tx Descriptors list: Chain Mode */ ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); /* Initialize Rx Descriptors list: Chain Mode */ ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); for(i=0; i<ETH_RXBUFNB; i++) { ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE); } #ifdef CHECKSUM_BY_HARDWARE /* Enable the TCP, UDP and ICMP checksum insertion for the Tx frames */ for(i=0; i<ETH_TXBUFNB; i++) { ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull); } #endif // /* Note: TCP, UDP, ICMP checksum checking for received frame are enabled in DMA config */ /* Enable the Ethernet Rx Interrupt */ ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE); /* Enable MAC and DMA transmission and reception */ ETH_Start(); return ETH_SUCCESS; } void ethernetif_output(uint8_t* buf, uint16_t len ) { uint8_t *buffer; __IO ETH_DMADESCTypeDef *DmaTxDesc; uint16_t framelength = 0; uint32_t byteslefttocopy = 0; uint32_t payloadoffset = 0; // if (txMutex.try_lock(netifGUARD_BLOCK_TIME)) { DmaTxDesc = DMATxDescToSet; buffer = (uint8_t *)(DmaTxDesc->Buffer1Addr); // bufferoffset = 0; if((DmaTxDesc->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) { goto error; } /* Get bytes in current lwIP buffer */ byteslefttocopy = len; payloadoffset = 0; /* Check if the length of data to copy is bigger than Tx buffer size*/ while( byteslefttocopy > ETH_TX_BUF_SIZE ) { /* Copy data to Tx buffer*/ memcpy(buffer , buf + payloadoffset, (ETH_TX_BUF_SIZE ) ); /* Point to next descriptor */ DmaTxDesc = (ETH_DMADESCTypeDef *)(DmaTxDesc->Buffer2NextDescAddr); /* Check if the buffer is available */ if((DmaTxDesc->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) { goto error; } buffer = (uint8_t *)(DmaTxDesc->Buffer1Addr); byteslefttocopy = byteslefttocopy - ETH_TX_BUF_SIZE; payloadoffset = payloadoffset + ETH_TX_BUF_SIZE; framelength = framelength + ETH_TX_BUF_SIZE; } /* Copy the remaining bytes */ memcpy( buffer , buf + payloadoffset, byteslefttocopy ); // bufferoffset = bufferoffset + byteslefttocopy; framelength = framelength + byteslefttocopy; /* Prepare transmit descriptors to give to DMA*/ ETH_Prepare_Transmit_Descriptors(framelength); /* Give semaphore and exit */ error: // txMutex.unlock(); } }
  3. STM32F4

    Спасибо за ответ. Инфу в эррате нашел.
  4. STM32F4

    Хм, эррату почитаю. Но здесь же нет побитовой записи. Запись в регистр происходит сразу из переменной tempreg1. Затем читает, ждет и опять пишет.
  5. STM32F4

    Добрый день. В библиотеке HAL запись в регистры Ethernet происходит следующим образом /* Write to ETHERNET MACCR */ (heth->Instance)->MACCR = (uint32_t)tmpreg1; /* Wait until the write operation will be taken into account : at least four TX_CLK/RX_CLK clock cycles */ tmpreg1 = (heth->Instance)->MACCR; HAL_Delay(ETH_REG_WRITE_DELAY); (heth->Instance)->MACCR = tmpreg1; Для чего это сделано и как работает? Я догадываюсь что для пересечения клоковых доменов, но не совсем понимаю почему именно так.
  6. Добрый день. Железо: клон saleae logic ПО: https://sigrok.org/
  7. Строкой SDIO->ICR=(SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC); должны были очищаться биты CCRCFAILC, CTIMEOUTC, CMDRENDC, CMDSENTC регистра STA. По факту этого не происходило. Первое чтение регистра давала старые данные. При повторном чтении регистр STA регистр был уже сброшен. Как вариант 2 раза читать регистр STA. Но еще лучше окончание передачи команды и получения ответа (или таймаута) отслеживать путем тестирования бита CMDACT регистра STA.
  8. SDIO интерфейс STM32F407

    Добрый день. Не могу разобраться с работой интерфейса SDIO. Шлю по очереди команды CMD0, CMD8, CMD55. Команда 0 без ответа. После команды 8 получаю нормально ответ (опросом бит CTIMEOUT, CMDREND, CCRCFAIL региста STA. Как и положено бит выставляется после получения ответа. Проблема возникает при отправке следующей команды. Функция отправки команды отдает сразу управления не дожидаясь получения ответа. Соответственно и в регистре RESPCMD содержится старая команда CMD8. Код функции отправки команд: SDIO->ICR=(SDIO_ICR_CCRCFAILC | SDIO_ICR_CTIMEOUTC | SDIO_ICR_CMDRENDC | SDIO_ICR_CMDSENTC); SDIO->ARG=argument; SDIO->CMD=(uint32_t)(cmd&SDIO_CMD_CMDINDEX)|respType|SDIO_CMD_CPSMEN; if (respType==NoResponse) { while (!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDSENT))) {}; } else { while (!(SDIO->STA & (SDIO_STA_CTIMEOUT | SDIO_STA_CMDREND | SDIO_STA_CCRCFAIL))) {}; } response[0]=SDIO->RESP1; response[1]=SDIO->RESP2; response[2]=SDIO->RESP3; response[3]=SDIO->RESP4; Вот что видно в логическом анализаторе. Линия D6 - это вывод отладки. Переключаю его состояние при выходе из функции отправки. Видно, что при отправке последней команды контроллер выходит из функции в самом начале. Перед командой 55 поставлена искусственная задержка. Заранее благодарю за помощь.
  9. LPC1768 GPIO Interrupt

    Именно в эти обработчики нужны для внешних прерываний. Настройка происходит в контроллере внешних прерываний, по крайней мере в контроллерах stm32. У NXP думаю аналогично.
  10. LPC1768 GPIO Interrupt

    А как же эти: EINT0_IRQHandler EINT1_IRQHandler EINT2_IRQHandler EINT3_IRQHandler
  11. Отладчик подключен только по SWDIO, SWCLK, земля, питание. Выводы JTAG к отладчику не подключены. Еще заметил, что это наблюдается ,когда отладку начинать с заливкой FLASH и до сброса питания. Если после сброса питания запустить отладку без заливки FLASH, то все ОК.
  12. Добрый день. В микроконтроллере STM32F107 выводы PB3, PB4 использую в качестве SPI3 SCK и MISO. Эти же выводы используются как JTAG. В программе JTAG отключаю с помощью макроса __HAL_AFIO_REMAP_SWJ_NOJTAG(); Отладку произвожу с помощью SWD. Если подать питание на плату, то на выводе SCK есть импульсы. Если начать отладку, вывод SCK (JTDO) постоянно в высоком уровне, обмен по SPI не идет. Вывод остается в высоком уровне до отключения питания. Куда следует копать? Отладка очень нужна :rolleyes: Среда Eclipse, отладчик J-Link
  13. Спасибо за ответы. Для этого используются какие-то специальные приспособления? Просто на не хотелось бы ISP разъем разводить.
  14. Добрый день. Решил тему создать в этом разделе. Если ошибся перенесите. Вопрос такой. В какой момент производится заливка программы в микроконтроллер при производстве изделия. До монтажа на ПП или после. Если до, то как прошивка переносит пайку. Как вообще массово прошивают контроллеры?
  15. IAR EWARM 5.40

    Сделал все что написано, появилась ошибка Error[Pa002]: the type attribute "__task" is not allowed on this declaration ...\src\main.cpp 40 на строки объявления функций процессов template<> OS_PROCESS void Proc1::Exec() Что еще можно сделать? Кстати, еще русские коментарии в заголовочном файле конфигурации scmRTOS_CONFIG.h при компиляции ассемблерного файла фызвали кучу ошибок, пришлось их удалить
×
×
  • Создать...