Jump to content

    

xxxmatrixxx

Участник
  • Content Count

    104
  • Joined

  • Last visited

Community Reputation

0 Обычный

About xxxmatrixxx

  • Rank
    Частый гость
  • Birthday 05/31/1985

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1356 profile views
  1. не могли бы выложить часть схемы, где PHY DP83869 соединена с SFP, и насколько хорошо показала себя эта микросхема(DP83869) в работе на разных скоростях, в том числе и на 1Ггбит/с (были ли ошибки при передачи данных, поддерживаемые пакеты и т.д.) скорее всего я перейду на 1Ггбит/с - вот думаю, какую брать PHY, в этом проекте взяли KSZ8041FTLI потому что уже был опыт работы с ней, но вот только не я писал под нее прошивку и использовались отдельные приемники и передатчики фирмы оптроникс(не SFP модули)...
  2. решил проблему с помощью вот такой схемы: все, что стоит справа от кондеров, находится внутри SFP, поэтому поставил только соотвествуюшие подтяжки к +3.3В и земле
  3. Неужели никто PHY не подключал к SFP модулям??? может скините ссылку на стандартную схему подключения, которая является рабочей???
  4. Здравствуйте, уважаемые форумчане сейчас отлаживаю свой проект под ПЛИС для сетевой карты, где осуществлена связка: ПЛИС(5CGXFC5C6F23I7N, использую TSE, Small MAC 100Мбит/с, MII)<->PHY(KSZ8041FTLI)<->SFP(Optronic TRSF13-20-155LC-3c) я замыкаю через кабель SFP модуль сам на себя (RX на TX) одномодовым кабелем, скорость выставляю 100Мбит/с затем через tcl скрипт в System Console Quartus вкл передатчик SFP, настраиваю PHY и МАС, генерирую пакет(записываю его во внутреннюю память, а затем через MSGDMA контроллер передаю пакет через TSE) так вот в итоге получается так: 1. линк устанавливается 2. через Signaltab(стробирование идет по ETH0_TX_CLK) я вижу пакет, уходящий на сторону PHY 3. по приему я вижу кучу ошибок если сделать вкл Loopback на PHY, то видно, что транзакция передача-прием осуществляется абсолютно верно первое мое предположение, что неверно сделано подключение SFP модуля к PHY, т.к. Loopback PHY работает корректно, вот электрика: интересует вопрос, верно ли осуществлено подключение линий port_XS1_SFP_TD_P, port_XS1_SFP_TD_N, port_XS1_SFP_RD_P, port_XS1_SFP_RD_N от PHY(KSZ8041FTLI) к SFP? вот как осуществлено подключение SFP в одном из китов от Micrell: я с оптикой никогда не работал, это первый раз, схема не моя, я пишу только ПО для ПЛИС, но по схеме видно, что не хватает развязывающих кондеров на линиях, а так же подтяжек линий на 49.9 Ом, а также 130 Ом RX на землю... так как дорабатывать будет уже изготовленную плату гемморойно, то хотел сначала убедиться, что буду делать все верно... был ли у кого опыт работы с SFP модулями и как подключали их к PHY? спасибо, буду рад любой помощи...
  5. я смотрю вопрос касался одного, а переключился опять в использование куба или нет... я всегда буду его использовать, т.к. точка входа в программирование STM32, благодаря ему, у меня заняло около 30 мин, я начал практически сразу писать функционал, при этом: 1. мне не надо было лезть в изучение всей периферии контроллера 2. изменение конфигурации и состава периферии при неизменном функциональном коде проходит за 1 мин 3. очень удобно, когда работаешь сразу с несколькими контроллерам STM32 разных семейств(у меня, например, STM32F103, STM32F107, STM32F407,STM32L496) согласен, что надо понимать, что и откуда берется, но лезть туда надо: 1. когда не работает задуманое 2. работает, но с косяками, либо слишком медленно к такому же подходу я стремлюсь при разработке IP Core на ПЛИС, чтобы была универсальность при написании драйвера под ОС для работы с модулями, реализованных на ПЛИС самое главное, что вы экономите время, CUBE имеет косяки, например, пришлось мне обходить косяк с работой по SDMMC, сгенерированный кубом, но я на это убил 2 дня, да пришлось во всем разобраться, но ничего страшного...
  6. Решил проблему следующим образом: #define uart_printf(...) { while(huart1.gState != HAL_UART_STATE_READY); printf(__VA_ARGS__); } int _write (int fd, char *ptr, int len){ HAL_UART_Transmit_DMA(&huart1, (uint8_t*) ptr, len); return len; } вместо printf использую у себя в основной программе uart_printf, причина была в подмене данных printf, т.к. данные передавались в функцию int _write (int fd, char *ptr, int len) по указателю всем спасибо за помощь!!!
  7. STMCube все верно отрабатывает, прерывание возникает по окончании передачи всей пачки, а не одного байта (функция HAL_UART_TxCpltCallback) модифицировал код следующим образом и все заработало: volatile static uint8_t Uart_Tx_Cmpl = 1; int _write (int fd, char *ptr, int len){ Uart_Tx_Cmpl = 0; HAL_UART_Transmit_DMA(&huart1, (uint8_t*) ptr, len); while(Uart_Tx_Cmpl == 0); return len; } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { Uart_Tx_Cmpl = 1; } но я при этом не добиваюсь того, что хотел, а именно освободить на время передачи по UART процессор от ожидания окончания транзакции по UART, как раз именно while(Uart_Tx_Cmpl == 0); когда стоял в самом начале функции int _write() позволял задерживать выполнение, если транзакция еще не завершена(например, идут 2 или 3 printf подряд), а когда этого не требуется, то просто пропускал...
  8. я делал вот так: volatile static uint8_t Uart_Tx_Cmpl = 1; int _write (int fd, char *ptr, int len){ while(Uart_Tx_Cmpl == 0); Uart_Tx_Cmpl = 0; HAL_UART_Transmit_DMA(&huart1, (uint8_t*) ptr, len); return len; } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { Uart_Tx_Cmpl = 1; } не помогло...
  9. Здравствуйте, уважаемые форумчане возникла необходимость отправлять через USART отладочные сообщения с использованием DMA под контроллер STM32F103(на других контроллерах туже проблему наблюдал, например, на STM32L496) Настройку и конфигурацию осуществлял через STMCube MX, считаю, что все верно сделано: затем переназначил функцию _write(), чтобы сообщения вылетали через USART1: int _write (int fd, char *ptr, int len){ HAL_UART_Transmit(&huart1, (uint8_t*) ptr, len,HAL_MAX_DELAY); return len; } int _read (int fd, char *ptr, int len){ *ptr = 0x00; // Flush the character buffer HAL_UART_Receive(&huart1, (uint8_t*) ptr, 1, HAL_MAX_DELAY); return 1; } вот таким образом все корректно работает, т.е. все символы выводятся на консоль без перетираний и искажений, выполняя вот этот код: printf("\033c\r\n"); fflush(stdout); printf("|||||||||||||||||||||||||||||||||||||||\r\n"); fflush(stdout); printf("Init MCU_PWR Complete\r\n"); fflush(stdout); printf("Size of I2C_REG bitfield = %d)\r\n", sizeof(I2C_Work.Regs.bitfield)); for(i = 0; i < I2C_BUF_SIZE; i++) printf("I2C_BUF[%d] = 0x%x\r\n", i, I2C_Work.Regs.I2C_BUF[i]); printf("Version Program STM32: %d.%d.%d (crc = 0x%x)", I2C_Work.Regs.bitfield.Version.bitfield.Major, I2C_Work.Regs.bitfield.Version.bitfield.Minor, I2C_Work.Regs.bitfield.Version.bitfield.Local, I2C_Work.Regs.bitfield.Version.bitfield.Crc); printf(" (0x%x)\r\n", I2C_Work.Regs.bitfield.Version.full_word); вывод на консоли: но если код заменить на DMA или через прерываний, то теряются символы, скорее всего из-за перетирания буфера, я попытался дожидаться, когда UART будет полностью свободен и только тогда отправлять данные, но все равно происходит перетирка данных int _write (int fd, char *ptr, int len){ while(huart1.gState != HAL_UART_STATE_READY); HAL_UART_Transmit_DMA(&huart1, (uint8_t*) ptr, len); return len; } вот вывод c DMA или по прерываниям: я пробовал дожидаться и состояния, когда и UART и DMA_TX_UART в состоянии READY, пробовал управлять флагом, который сигнализирует об окончании передачи, флаг выставлялся в функции void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart), но также не помогло я думаю, проблема в каком-нибудь пустяке, но пока его не смог найти... был ли у кого опыт работы с DMA, при котором терялись, перезаписывались данные, на что мне ориентироваться, чтобы считать, что данные полностью ушли на стороне UART и мне можно заполнять буфер? Спасибо, буду рад любой помощи
  10. скорее качество фото такое и дисплей бликует, рисует нормально
  11. Отвечу сам на свой вопрос, надеюсь, кому-нибудь пригодится эта информация: библиотека не позволяет в автоматическом режиме устанавливать масштабирование, только возможно сделать масштабирование разметки сетки, но вывод точек на дисплей в нужном масштабе остается за программистом вот мой кусок кода и пояснения к нему: Graph_xSize - размер окна графика по оси Х Graph_ySize - размер окна графика по оси Y max_val - индекс максимального значения элемента массива, т.е. array_adc[max_val] и есть само значение size_array_adc - размер массива float i,j, k_x, k_y; GUI_POINT point; hItem = WM_GetDialogItem(pMsg->hWin, WmGraphic_FindId("Graph_Adc")); //GRAPH_SetBorder(hItem, 0,5,5,5); WmGraphic_Set_Graph_Size(); hDataXY = GRAPH_DATA_XY_Create(GUI_WHITE, Graph_xSize, 0, 0); GRAPH_AttachData(hItem,hDataXY); GRAPH_SetVSizeX(hItem,Graph_xSize); GRAPH_SetVSizeY(hItem,Graph_ySize); // GRAPH_SetAutoScrollbar(hItem,GUI_COORD_X | GUI_COORD_Y,1); k_x = (float)size_array_adc/Graph_xSize; k_y = (float)array_adc[max_val]/Graph_ySize; printf("\r\nPlot Graph:"); printf("\r\nsize_array_adc = %d, max_val = %d",size_array_adc,max_val); printf("\r\nGraph_xSize = %d, Graph_ySize = %d",Graph_xSize,Graph_ySize); printf("\r\nk_x = %f, k_y = %f",k_x,k_y); fflush(stdout); printf("\r\n"); for(i = k_x, j = 0; i < size_array_adc; i += k_x, j++){ point.x = j; point.y = array_adc[(int)i]/k_y; GRAPH_DATA_XY_AddPoint(hDataXY,&point); } fflush(stdout); GRAPH_DATA_XY_SetLineVis(hDataXY, 1); // Create and add vertical scale hScaleV = GRAPH_SCALE_Create(25, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 20); GRAPH_SCALE_SetFactor(hScaleV, (float)array_adc[max_val]/200); // 0.2f GRAPH_SCALE_SetTextColor(hScaleV, GUI_RED); GRAPH_AttachScale(hItem, hScaleV); // Create and add horizontal scale hScaleH = GRAPH_SCALE_Create(4, GUI_TA_HORIZONTAL, GRAPH_SCALE_CF_HORIZONTAL, 30); GRAPH_SCALE_SetFactor(hScaleH, (float)size_array_adc/300); // 0.1f GRAPH_SCALE_SetTextColor(hScaleH, GUI_BLUE); GRAPH_AttachScale(hItem, hScaleH); // Set graph attributes GRAPH_SetGridDistX(hItem, array_adc[max_val]/20); GRAPH_SetGridDistY(hItem, size_array_adc/30); GRAPH_SetGridVis(hItem, 1); GUI_Exec(); static short WmGraphic_Set_Graph_Size(){ U8 i; for(i = 0; i < GUI_COUNTOF(_aDialogCreate);i++) if(strstr(_aDialogCreate[i].pName,"Graph_Adc")){ Graph_xSize = _aDialogCreate[i].xSize - 5; Graph_ySize = _aDialogCreate[i].ySize - 5; return 0; } return -1; } Исходные данные в Excel: отображение на дисплее:
  12. Здравствуйте, уважаемые форумчане Есть задача - отрисовать график на STM32L496 с использованием библиотеки STEmWin на сборке с дисплеем ITDB-28TFT сейчас возникла такая проблема, что все точки графика не влезают, понятное дело, в размеры дисплея 320х240, по горизонтали выводится 2600 точек, по вертикали 490 можно ли инструментами библиотеки STEmWin сделать масштабирование??? т.е. вывести в начале весь график, не задумываясь о масштабе, как в QCustomPlot в Qt (я запихал все точки, а сама библиотека ужала его в размеры окна), а затем сделать приближение, либо уменьшение, не задумываясь о сетке, какие точки выводить при этом... т.е. получаю полностью весь функционал и осуществляю только управление... сейчас получилось вывести все на график и прокручивать с помощью горизонтальной и вертикальной полос прокрутки, но при таком количестве точек это очень неудобно, хочется видеть примерный график на дисплее сразу по всем точкам спасибо, жду вашего ответа
  13. у меня в любом случае до передачи реальных данных не доходит, сразу после глобального разрешения всех прерываний, постоянно попадаю в обработчик TX по SPI
  14. там биты выталкиваются от старшего к младшему, т.е. если я пишу uint8_t, то я должен сдвинуть их на 8 разрядов влево #define SPI_A_DATA_WIDTH 8 вот и выходит SPI_writeDataNonBlocking(SPIA_BASE, spi_data << (16 - SPI_A_DATA_WIDTH)); Test_Dev_SPI(); Test_Dev_I2C(); Test_Dev_CAN(); Test_Dev_LEDS(); у меня до этих функций вообще не доходит, сразу начинает отрабатывать прерывание постоянно
  15. перечитал, спасибо, буду ставить внешнюю физику на CAN и проверять а что с I2C и SPI, сейчас они у меня никуда не подключены и выплевывают пакеты наружу, смотрю их наличие осцилографом?